如何在 Coldfusion 2021 脚本中获取 MSSQL“插入”查询生成的密钥?

问题描述 投票:0回答:3

问题

我想从 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() 返回 NULL。

研究

我已经读到,获取数据的正确方法不是通过 getResult(),而是通过 StackOverflow 答案中的 getPrefix()从 cfscript 中的 Coldfusion newQuery() 获取结果元数据

但是这不行,getPrefix()也返回NULL。我在 CFDocs.org 或 Adobe 的文档中找不到有关此功能的文档(尽管 Adobe 的文档对我来说很难浏览)。

getPrefix() 函数在 cffiddle.org 上也不起作用,所以我无法测试它。

临时解决方案

have能够使用我试图避免的样式获取插入行的ID:通过queryExecute的option参数传入命名的result变量。

//...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 引用的变量的范围是什么。

coldfusion cfml
3个回答
5
投票
var executedQuery = queryExecute(sqlQuery, params, { result = "queryResult" });

看一下参数,你指定的结果是queryResult。 因此就有了生成的密钥。

文档表明您不需要指定结果(https://helpx.adobe.com/coldfusion/cfml-reference/coldfusion-functions/functions-m-r/queryexecute.html)并且重新结果/返回queryExecute 结果的结果,但这似乎无法按照 ACF2021 中的文档工作。

我会在下面建议。

try {
  var executedQuery = ''; 
  queryExecute(sqlQuery, params, { result = "executedQuery" });
  var insertedId = executedQuery.GENERATEDKEY;
}

0
投票

在 CF 2016 中,这有效:

var result = insert.execute().getPrefix();

var insertedId = result.generatedKey;

对于较新的版本,这应该有效:

var result = insert.execute().getResult();

var insertedId = result.generatedKey;

0
投票
    qService = new query();
    qService.setDatasource("fss_logging");
    qService.setName("insertError");
    qService.addParam(name="Message",value=LogMessage,cfsqltype="CF_SQL_VARCHAR");
    qService.addParam(name="LogDateTime",value=now(),cfsqltype="CF_SQL_TIMESTAMP");
    qService.setSql(
                    "INSERT INTO tbl_Logs( Message, LogDateTime)
                     VALUES ( :Message, :LogDateTime )"
                    );
    resultset = qService.execute();
    errorPkey = resultset.getPrefix().generatedKey;
© www.soinside.com 2019 - 2024. All rights reserved.