如何确定cftransaction中的回滚原因

Rob*_*b M 1 coldfusion

我有一组包含在<cftransaction>块中的插入,我收到错误并且正在回滚插入.

以下是有关空间的问题代码:

<cffunction name="InsertTCUV" access="public">
    <cfargument name="vehicle required="true" type="xml" />

    //Parsing the xml document here

    <cftransaction>
        <cfquery name="TCUVinsert datasource="mydb">
            INSERT INTO tcuv
            VALUES(...)
        <cfquery>

        <cfquery name="qLatestTCUVID" datasource="mydb">
            SELECT TOP 1 tcuv_id FROM dbo.tcuv ORDER BY tcuv_id DESC
        </cfquery>

        <cfset curTCUVID = qLatestTCUVID.tcuv_ID>

        <cfset optionsResult = insertOptions(curTCUVID,vehicle>
        <cfset imagesResult = insertImages(curTCUVID,vehicle)>
        <cfset standardFeaturesResult = insertStandardFeatures(curTCUVID,vehicle

    </cftransaction>

</cffunction>

<cffunction name="insertOptions" access="private">
    <cfargument name="TCUVID required="true type="numeric" />
    <cfargument name="vehicleInfo" required="true" type="xml" />

    <cfset var result = "good">        

    <cftry>
        <cfset optionNode = xmlSearch(arguments.vehicleInfo[1], "p:RemarketingOption">
        <cfloop index="i" from="1" to="#arrayLen(optionNode)#">
             <cfset optionNodeNotes = XmlSearch(optionNode[#i#], "p:OptionNotes")>

             <cfset optionNotes = "">

             <cfloop index="j" from="1" to="#ArrayLen(optionNotesNodes)#">
                 <cfoutput>
                     <cfset optionNotes = optionNotes & " " & #optionNotesNodes[j].xmlText#>
                 </cfoutput>
             </cfloop>

     <cfquery name="insertOptions" datasource="mydb">
                INSERT INTO dbo.tcuv_options
        VALUES (
                    <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.TCUVID#">,
                    <cfqueryparam cfsqltype="cf_sql_varchar" value='#xmlSearch(optionNode[i], "p:OptionID")[1].xmlText#'>,
                    <cfqueryparam cfsqltype="cf_sql_varchar" value='#xmlSearch(optionNode[i], "p:OptionTypeCode")[1].xmlText#'>,
                    <cfqueryparam cfsqltype="cf_sql_varchar" value='#xmlSearch(optionNode[i], "p:OptionShortDescription")[1].xmlText#'>,
                    <cfqueryparam cfsqltype="cf_sql_varchar" value="#optionNotes#">
                )       
             </cfquery> 

       </cfloop>

       <cfcatch type="database">
          //dumping cfcatch.* information
          <cfset result = "error"
       </cfcatch>
   </cftry>
   <cfreturn result>
 </cffunction>
Run Code Online (Sandbox Code Playgroud)

这一切都在调用页面的循环中,并且第一次循环时一切正常.一个第二遍,TCUVInsert工作,但我得到insertOptions函数,抛出一个coldfusion错误说,variable insertOptions is undefined当我得到数据库时,第二行不存在,这告诉我有一个错误和插入回滚.因此,插入选项时出错,而coldfusion没有给我正确的错误来诊断它.所以要么我必须查看数据库日志,这显然没有设置,或者尝试从cftransaction块中提取错误,我不知道该怎么做.

coldfusion 9,sql server 2008 r2

有什么想法吗?

Lei*_*igh 6

<cffunction name="insertOptions" access="private">
Run Code Online (Sandbox Code Playgroud)

您通过对查询变量使用相同的名称来覆盖该函数:

   <cfquery name="insertOptions" datasource="imports">
Run Code Online (Sandbox Code Playgroud)

有趣的是,这都是因为查询名称没有var作用域.函数存储在variables组件的范围内.因此,如果无法本地化查询名称,则最终会覆盖variables.insertOptions运行查询时存储的函数.因为insert语句不返回结果集,所以该变量最终未定义.因此错误.在这种情况下,解决方案是对查询名称进行范围调整,或者更好地将其完全删除(因为它无论如何都不会填充).

总是将var/local函数变量作为范围的另一个原因- 是的,查询名称也是如此!