如何在 Coldfusion 2021 脚本中获取为 MSSQL "insert" 查询生成的密钥?
How do I get the generated key for an MSSQL "insert" query in Coldfusion 2021 script?
问题
我想从 SQL 查询中获取插入行的 ID:
INSERT INTO NameList (Name) VALUES('John')
我需要在 Coldfusion 2021 脚本中执行此操作,如下所示:
var sqlQuery = "INSERT INTO NameList (Name) VALUES(?)";
var params = [{ value: "John", cfsqltype: "cf_sql_varchar" }];
try {
var executedQuery = queryExecute(sqlQuery, params, {/* ...other options... */});
//This is where it fails, because getResult() returns NULL.
var insertedId = executedQuery.getResult().GENERATEDKEY;
}
catch (any ex) {
//...report the error, read ex.message
}
但这不起作用,因为 getResult() returns NULL.
研究
我读到获取数据的正确方法不是通过 getResult(),而是通过 getPrefix()这个 Whosebug 答案:
但是这样不行,getPrefix()也returnsNULL。我无法在 CFDocs.org 或 Adobe 的文档中找到有关此功能的文档(尽管 Adobe 的文档对我来说很难浏览)。
getPrefix() 函数在 cffiddle.org 上也不起作用,所以我无法测试它。
临时解决方案
我已经能够使用我试图避免的样式获取插入行的ID:传入一个命名的结果 通过 queryExecute 的 option 参数变量。
//...clipped...
try {
//The options.result parameter is set to 'queryResult'.
var executedQuery = queryExecute(sqlQuery, params, { result = "queryResult" });
//This works, though I'm not sure where 'queryResult' exists in scope.
var insertedId = queryResult.GENERATEDKEY;
}
//...clipped...
我不知道 queryResult 的作用域是什么(是全局的吗?),但这有效。我更喜欢传递局部变量,但传递 { result = "someLocalVar" }
会导致错误。
有没有办法传入局部变量?我觉得这可以接受。
结论
我想使用 Coldfusion 2021 脚本获取插入行的 ID。我宁愿不使用 queryExecute() 的 options.result 参数,而是使用 getResult() 或类似的机制。
如果那不可能,那么我更希望能够将局部变量传递给 queryExecute() 的 options.result 参数。
如果那不可能,那么我想至少知道 options.result 引用的变量是什么范围。
var executedQuery = queryExecute(sqlQuery, params, { result = "queryResult" });
看一下参数,你指定的结果是queryResult。因此具有生成的密钥。
文档表明您不需要指定结果 (https://helpx.adobe.com/coldfusion/cfml-reference/coldfusion-functions/functions-m-r/queryexecute.html),并且 queryExecute 的 result/return 结果是结果,但是按照 ACF2021 中的文档,这似乎无法正常工作。
我会在下面提出建议。
try {
var executedQuery = '';
queryExecute(sqlQuery, params, { result = "executedQuery" });
var insertedId = executedQuery.GENERATEDKEY;
}
问题
我想从 SQL 查询中获取插入行的 ID:
INSERT INTO NameList (Name) VALUES('John')
我需要在 Coldfusion 2021 脚本中执行此操作,如下所示:
var sqlQuery = "INSERT INTO NameList (Name) VALUES(?)";
var params = [{ value: "John", cfsqltype: "cf_sql_varchar" }];
try {
var executedQuery = queryExecute(sqlQuery, params, {/* ...other options... */});
//This is where it fails, because getResult() returns NULL.
var insertedId = executedQuery.getResult().GENERATEDKEY;
}
catch (any ex) {
//...report the error, read ex.message
}
但这不起作用,因为 getResult() returns NULL.
研究
我读到获取数据的正确方法不是通过 getResult(),而是通过 getPrefix()这个 Whosebug 答案:
但是这样不行,getPrefix()也returnsNULL。我无法在 CFDocs.org 或 Adobe 的文档中找到有关此功能的文档(尽管 Adobe 的文档对我来说很难浏览)。
getPrefix() 函数在 cffiddle.org 上也不起作用,所以我无法测试它。
临时解决方案
我已经能够使用我试图避免的样式获取插入行的ID:传入一个命名的结果 通过 queryExecute 的 option 参数变量。
//...clipped...
try {
//The options.result parameter is set to 'queryResult'.
var executedQuery = queryExecute(sqlQuery, params, { result = "queryResult" });
//This works, though I'm not sure where 'queryResult' exists in scope.
var insertedId = queryResult.GENERATEDKEY;
}
//...clipped...
我不知道 queryResult 的作用域是什么(是全局的吗?),但这有效。我更喜欢传递局部变量,但传递 { result = "someLocalVar" }
会导致错误。
有没有办法传入局部变量?我觉得这可以接受。
结论
我想使用 Coldfusion 2021 脚本获取插入行的 ID。我宁愿不使用 queryExecute() 的 options.result 参数,而是使用 getResult() 或类似的机制。
如果那不可能,那么我更希望能够将局部变量传递给 queryExecute() 的 options.result 参数。
如果那不可能,那么我想至少知道 options.result 引用的变量是什么范围。
var executedQuery = queryExecute(sqlQuery, params, { result = "queryResult" });
看一下参数,你指定的结果是queryResult。因此具有生成的密钥。
文档表明您不需要指定结果 (https://helpx.adobe.com/coldfusion/cfml-reference/coldfusion-functions/functions-m-r/queryexecute.html),并且 queryExecute 的 result/return 结果是结果,但是按照 ACF2021 中的文档,这似乎无法正常工作。
我会在下面提出建议。
try {
var executedQuery = '';
queryExecute(sqlQuery, params, { result = "executedQuery" });
var insertedId = executedQuery.GENERATEDKEY;
}