0

我正在尝试写入同一个数据库中的两个不同的表。在一个带有两个 CFQUERY 的 CFTRANSACTION 中,第一个 CFQUERY 将正确插入,但第二个(也是 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>

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

4

2 回答 2

0

更新

我刚刚在 CF11 上尝试了以下代码,它运行良好。我收到的唯一错误errMsg是未定义的,在发生之前它不在您的代码中<cfcatch>。我定义errMsg并重新运行——它是成功的。

<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>

关于多数据源

根据这个 Adob​​e 论坛这个 SO 帖子,您必须先提交对每个数据源的更改,然后才能继续下一个。

根据SO帖子,这将起作用:

<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>

请注意,如果您可以使用三个部分名称(例如 fooDB.dbo.table )通过一个数据源访问您的数据,您可以在一个数据源中写入不同的数据库<cftransaction>

于 2018-02-07T15:21:12.380 回答
0

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

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

我们现在正在考虑使用 jTDS 看看这是否能解决问题。

于 2018-02-08T15:14:49.773 回答