我正在使用ColdFusion 11并且因为cftransaction而出错。我不确定是什么造成的。
我有两个CFC:abc.cfc和xyz.cfc。 abc.cfc
不使用datasource属性:因为它是使用this.datasource
在Application.cfc中定义的。
这是错误:
Error! The root cause was that: java.sql.SQLException: Usernames and Passwords for all the database tags within the cftransaction tag must be the same. Datasource inventorymgt verification failed.. Entry rolled back
我在做的是:
<cftransaction action="begin">
<cftry>
<cfscript>
f = structNew();
f.companyName = '#arguments.structform.companyname#';
f.address = '#arguments.structform.address#';
f.settingsID = arguments.structform.settingsID;
r = tblUpdate('settings',f);
sresult = 'Updated';
</cfscript>
<cfset str = "Cool! Settings has been " & sresult>
<cftransaction action="commit"/>
<cfcatch type="any">
<cftransaction action="rollback"/>
<cfset str = "Error! #cfcatch.Detail# #cfcatch.Message#. Entry rolled back">
</cfcatch>
</cftry>
</cftransaction>
另一个期望init函数的CFC,如数据源,用户名,密码,使用以下查询方式来更新它:
<cfquery name="q"
datasource="#variables.dbsource#"
username="#variables.dbuname#"
password="#variables.dbpword#">
答案 0 :(得分:1)
我认为原因在这篇文章中有解释: https://groups.google.com/forum/#!topic/cfwheels/AZTvxvhsapc
在cftransaction标记中,每个查询都必须使用相同的身份验证。您不能让一个查询使用datatasource,另一个查询使用同一事务中的用户名和密码。
我同意该链接的作者。我总是只在cf-administrator中定义一次数据源,所以我不必处理用户名/密码。然后,您可以通过数据源初始化您的cfc。
我不知道您的函数 tblUpdate 实际上在做什么,但可能是您使用的语法与您发布的查询不同?因为,这就是你的错误代码所说的:
cftransaction标记中所有数据库标记的用户名和密码必须相同。