【问题标题】:Missing GENERATEDKEY from Query Result查询结果中缺少 GENERATEDKEY
【发布时间】:2020-11-18 20:52:46
【问题描述】:

我有一些代码在过去几年中使用 cfquery 标记的结果属性中的 GENERATEDKEY。我最近注意到它不再是 Result 返回的结构的一部分。

<cfquery name="qryTest" datasource="#DSN#" result="sResult">
  INSERT INTO users(fName, lName, City) VALUES(
  'Test1', 'Test2', 'Test3')
</cfquery>
<cfdump var="#sResult#">

我只得到 CACHED、EXECUTIONTIME、RECORDCOUNT 和 SQL。环境是CF2016,SQL Server 2014

【问题讨论】:

  • 数据源设置Disable Autogenerated Keys到Disable retrieval of autogenerated keys中有一个选项。被检查了吗?
  • @rrk,不,那里没有启用。所以谜团还在继续……
  • 您最近是否切换了 JDBC 驱动程序或数据源?因为 CF 依赖于java.sql.Statement interface method getGeneratedKeys,所以必须相应地实现。
  • @CFML_Developer 你能否交叉检查一下你在结构中得到了 IDENTITYCOL 吗?
  • 一个严重的问题 - 你有没有把它关掉再打开? :-) 问是因为几年前我遇到了类似的问题,在网上商店的生产中,CF/JDBC-driver/MSSQL 的某些部分停止返回result.GENERATEDKEY,它已经工作了多年,并且在那里最近没有变化。我输入了一些后备代码以另一种方式获取身份,因为我无法证明在高峰时间重启是合理的,但最终在 CF 服务重启 + SQL Server 重启后,原来的问题就消失了,再也没有回来,所以我从来没有发现是什么原因造成的首先是它!

标签: coldfusion coldfusion-2016


【解决方案1】:

您是否正在尝试做这样的事情?

<cfquery name="qryTest" datasource="#DSN#">
  INSERT 
  INTO users(fName, lName, City) 
  OUTPUT inserted.id 
  VALUES('Test1', 'Test2', 'Test3')
</cfquery>

【讨论】:

  • 实际上真正的查询是 upsert。因此,根据它是更新还是插入,它曾经依赖于生成的密钥。如果存在,则意味着它是插入并相应地进行。我知道 OUTPUT 子句并且可以修改代码。但我只是想确定为什么当前代码停止工作。我相信生成密钥将始终返回用于 sql server 插入。我猜这不是真的。
【解决方案2】:

我只是通过你的问题。我相信您的表(用户)没有任何约束 - PK(主键)和 IDENTITYCOL(自动增量)选项。这样它就不会在结果结构中返回任何 IDENTITYCOL & GENERATEDKEY 键。这里,

 <cfquery name="InsertData1" datasource="testmssql" result="test" >
     INSERT INTO loginDetails VALUES( 'xxx','yyy') 
 </cfquery>

我已插入两列数据,并且我的表 loginDetails 具有 PK 和 Identitycol 选项。因此,虽然转储结果应该返回具有 CACHED、EXECUTIONTIME、GENERATEDKEY、IDENTITYCOL、RECORDCOUNT 和 SQL 的键和值的结构,如下图所示。

<cfquery name="InsertData1" datasource="testmssql" result="test" >
   INSERT INTO test2 VALUES( 'xxx','yyy')
</cfquery>

在我的表 test2 中,我没有设置 Autoincrements ( Constraints ) 选项。所以它不会在结果结构中返回 GENERATEDKEY,IDENTITYCOL 。就像我下图一样。

所以我建议请检查你的 DB 端关于该表是否有适当的约束。

【讨论】:

  • 鉴于问题的第一段,我不同意。
  • 为什么,?可能是他们关闭了 IDENTITYCOL 选项。那个时候我们应该面临同样的问题。因为他的结果键没有返回 GENERATEDKEY,IDENTITYCOL。仅与 autoIncrement 选项完全相关。
  • 不。你的假设都不是真的。我不仅有一个 PK,而且我还有一个身份列。事实上,它以前曾在相同的环境中工作过(肯定是 4 个月前,但在那之后的任何时候都可能停止工作。)
  • 谢谢。原来我的桌子上没有PK 和Auto increment。我启用了它,我可以得到我的generated_key。谢谢。
猜你喜欢
  • 2015-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-14
  • 1970-01-01
  • 2019-12-17
  • 2018-03-30
  • 2018-06-04
相关资源
最近更新 更多