使用CFINSERT - ColdFusion后获取主键

Den*_*one 6 sql-server coldfusion cfquery primary-key

当我使用CFINSERT表单时,数据被插入到我的数据库中,因为字段名称与列名称匹配.

我的问题:如何使用CFINSERT获取我刚刚添加的行的主键?

我知道我不能使用类似于标准的"Result ='variable'",cfquery那么获得主键的最佳方法是什么?

如果我在我的cfinsert之后直接运行以下查询,它应该返回以前的PK:

<cfquery name="getID" datasource="#mydsn#" result="#result#">
select Max(id) as NewID from myTablename;
</cfquery>
Run Code Online (Sandbox Code Playgroud)

这是完成我想要做的最好的方法吗?

Luk*_*uke 5

处理这个问题的最佳方法是从generatedKey查询的结果结构中获取主键。

<cfquery name="myQuery" result="queryResult" datasource="#myDSN#">
    INSERT INTO some_table
    (column_one) 
    VALUES 
    (<cfqueryparam value="#stringForColOne#" cfsqltype="CF_SQL_VARCHAR">)
</cfquery>
<cfoutput>
    Generated Key from SQL Insert = #queryResult.generatedKey#
</cfoutput>
Run Code Online (Sandbox Code Playgroud)

请参阅https://wikidocs.adobe.com/wiki/display/coldfusionen/cfquery#cfquery-Usage


Tom*_*lak 0

由于您使用的是 SQL Server,因此您可以使用该SCOPE_IDENTITY()函数安全地获取当前范围内最后插入的标识值。

文档说

SCOPE_IDENTITY (Transact-SQL)

返回插入同一范围内标识列的最后一个标识值。范围是一个模块:存储过程、触发器、函数或批处理。因此,如果两个语句位于同一存储过程、函数或批处理中,则它们处于同一作用域。

当在两个单独的 ColdFusion 标签(<cfinsert>后跟<cfquery>)中使用时,这是两个批次,SCOPE_IDENTITY()将不再起作用。因此,INSERT和SELECT语句必须是同一批次的一部分。不幸的是,这无法通过 来实现<cfinsert>。

您说您的表单帖子中有很多字段,所以我会这样做:

<cfset fieldNames = "all,relevant,field,names,from,http,post">
<cfset fieldTypes = "INTEGER,VARCHAR,VARCHAR,DATETIME,INTEGER,VARCHAR,VARCHAR">
<cfset fieldNullable = "false,true,true,true,false,true,false">
<cfset fieldCount = ListLen(fieldNames)>

<!--- default "" for any fields missing from the HTTP POST --->
<cfloop from="1" to="#fieldCount#" index="i">
  <cfparam name="FORM.#ListGetAt(fieldNames, i)#" default="">
</cfloop>

<cfquery name="insert" datasource="#yourdatasource#">
  INSERT YourTable (#fieldNames#)
  VALUES (
    <cfloop from="1" to="#fieldCount#" index="i">
      <cfif i gt 1>,</cfif>
      <cfset val = FORM[ListGetAt(fieldNames, i)]>
      <cfset type = "CF_SQL_#ListGetAt(fieldTypes, i)#">
      <cfset null = ListGetAt(fieldNullable, i) eq "true" and val eq "">
      <cfqueryparam value="#val#" cfsqltype="#type#" null="#null#">
    </cfloop>
  )

  SELECT SCOPE_IDENTITY() as NewId
</cfquery>

<cfdump var="#insert#">
Run Code Online (Sandbox Code Playgroud)

  • 如果您打算使用 cfquery,结果属性会更简单。不过循环的使用很聪明。 (3认同)