我试图在同一个数据库中写入两个不同的表。在一个带有两个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>
这可能是非常简单的事情,但我被困住了。任何帮助表示赞赏。
答案 0 :(得分:0)
<强>更新强>
我刚刚在CF11上尝试了下面的代码,它工作正常。我收到的唯一错误是class BoardInitializer {
static int *beginBoard;
static int *testBoard;
public:
static void testBoardInitialize();
}
未定义,在errMsg
发生之前,它不在您的代码中。我定义了<cfcatch>
并重新运行 - 它成功了。
errMsg
关于多个数据源
根据this Adobe forum和this 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以确定是否能解决问题。