使用 CFINSERT 后获取主键 - ColdFusion
Get Primary Key after using CFINSERT - ColdFusion
当我使用 CFINSERT
时,表单数据被插入到我的数据库中,因为字段名称与列名称匹配。
我的问题: 我怎样才能得到我刚刚使用 CFINSERT 添加的行的主键?
我知道我不能使用类似于标准 cfquery
的 "Result='variable'" 那么获取主键的最佳方法是什么?
如果我 运行 在我的 cfinsert 之后直接执行以下查询,它应该 return 之前的 PK:
<cfquery name="getID" datasource="#mydsn#" result="#result#">
select Max(id) as NewID from myTablename;
</cfquery>
这是完成我想要做的事情的最佳方式吗?
由于您在 SQL 服务器上,您可以使用 SCOPE_IDENTITY()
函数安全地获取当前范围中最后插入的标识值。
SCOPE_IDENTITY (Transact-SQL)
Returns the last identity value inserted into an identity column in
the same scope. A scope is a module: a stored procedure, trigger,
function, or batch. Therefore, two statements are in the same scope if
they are in the same stored procedure, function, or batch.
当在两个单独的 ColdFusion 标签中使用时(<cfinsert>
后跟 <cfquery>
),那么这是两个批次,SCOPE_IDENTITY()
将不再起作用。因此 INSERT
和 SELECT
语句必须属于同一批。不幸的是,这无法通过 <cfinsert>
.
实现
您说您的表单中有很多字段 post,所以我会这样做:
<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#">
处理此问题的最佳方法是从查询的 result 结构中的 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>
见https://wikidocs.adobe.com/wiki/display/coldfusionen/cfquery#cfquery-Usage
当我使用 CFINSERT
时,表单数据被插入到我的数据库中,因为字段名称与列名称匹配。
我的问题: 我怎样才能得到我刚刚使用 CFINSERT 添加的行的主键?
我知道我不能使用类似于标准 cfquery
的 "Result='variable'" 那么获取主键的最佳方法是什么?
如果我 运行 在我的 cfinsert 之后直接执行以下查询,它应该 return 之前的 PK:
<cfquery name="getID" datasource="#mydsn#" result="#result#">
select Max(id) as NewID from myTablename;
</cfquery>
这是完成我想要做的事情的最佳方式吗?
由于您在 SQL 服务器上,您可以使用 SCOPE_IDENTITY()
函数安全地获取当前范围中最后插入的标识值。
SCOPE_IDENTITY (Transact-SQL)
Returns the last identity value inserted into an identity column in the same scope. A scope is a module: a stored procedure, trigger, function, or batch. Therefore, two statements are in the same scope if they are in the same stored procedure, function, or batch.
当在两个单独的 ColdFusion 标签中使用时(<cfinsert>
后跟 <cfquery>
),那么这是两个批次,SCOPE_IDENTITY()
将不再起作用。因此 INSERT
和 SELECT
语句必须属于同一批。不幸的是,这无法通过 <cfinsert>
.
您说您的表单中有很多字段 post,所以我会这样做:
<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#">
处理此问题的最佳方法是从查询的 result 结构中的 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>
见https://wikidocs.adobe.com/wiki/display/coldfusionen/cfquery#cfquery-Usage