cftransaction只会运行第一个cfquery,跳过第二个

时间:2018-02-07 15:16:21

标签: coldfusion cfquery coldfusion-2016

我试图在同一个数据库中写入两个不同的表。在一个带有两个CFQUERY的CFTRANSACTION中,第一个CFQUERY将正确插入,但第二个(也是INSERT)将被跳过。没有错误被抛出,我可以在第一个表中看到数据,并且注释掉第一个INSERT将允许第二个INSERT根据需要通过。

我的代码的简化版本是:

<cffunction name="insertReport">
<cfset var strReturn="">
<cftransaction>
<cftry>
<cfquery name="updateTable1" datasource="DB1">
...
</cfquery>
<cfquery name="UpdateTable2" datasource="DB1">
...
</cfquery>

<cfcatch type="any">
<cfset errMsg = "#cfcatch.Message#">
</cfcatch>
</cftry>

<cfif trim(errMsg) eq ''>
<cftransaction action="commit">
<cfelse>
<cftransaction action="rollback">
<cfset strReturn = "Error: #errMsg#.">
</cfif>
</cftransaction>

<cfreturn strReturn>
</cffunction>

这可能是非常简单的事情,但我被困住了。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:0)

<强>更新

我刚刚在CF11上尝试了下面的代码,它工作正常。我收到的唯一错误是class BoardInitializer { static int *beginBoard; static int *testBoard; public: static void testBoardInitialize(); } 未定义,在errMsg发生之前,它不在您的代码中。我定义了<cfcatch>并重新运行 - 它成功了。

errMsg

关于多个数据源

根据this Adobe forumthis SO post,您必须在继续下一个之前提交对每个数据源的更改。

根据SO帖子,这将有效:

<cffunction name="insertReport">
    <cfset var strReturn="">
    <cfset errMsg = "">
    <cftransaction>

    <cftry>
        <cfquery name="updateTable1" datasource="DS1">
            INSERT INTO ...
        </cfquery>

        <cfquery name="UpdateTable2" datasource="DS1">
            INSERT INTO ...
        </cfquery>

    <cfcatch type="any">
        <cfset errMsg = "#cfcatch.Message#">
    </cfcatch>
    </cftry>

    <cfif trim(errMsg) eq ''>
        <cftransaction action="commit">
    <cfelse>
        <cftransaction action="rollback">
        <cfset strReturn = "Error: #errMsg#.">
    </cfif>

    </cftransaction>

    <cfreturn strReturn>
</cffunction>

<cfoutput>#insertReport()#</cfoutput>

请注意,如果您可以使用三个部分名称(例如fooDB.dbo.table)通过一个数据源访问您的数据,则可以在一个<cftransaction action="begin"> <cfquery datasource="foo"> select * from foo_test </cfquery> <cftransaction action="commit"><!-- Commit before switching DSNs ---> <cfquery datasource="bar"> select * from bar_test </cfquery> </cftransaction>

中写入不同的数据库

答案 1 :(得分:0)

感谢所有帮助过的人。事实证明问题在于我们在CFQUERY中使用CFQUERYPARAM而不是对值进行硬编码,并且它们抛出空指针异常。

当我们只有一个CFQUERY时,似乎那些CFQUERYPARAM元素会正确地写入数据库,但仍然会抛出将跳过第二个CFQUERY的Null Pointer异常。因为Null Pointer只抛出了一个“#cfcatch.type#”值,而不是我们的错误检查所需的“#cfcatch.Message#”或“#cfcatch.detail#”,所以我们没有标记问题。 / p>

我们现在正在寻找使用jTDS以确定是否能解决问题。