如何确定cftransaction中的回滚原因

时间:2013-09-23 16:40:50

标签: 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>

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

coldfusion 9,sql server 2008 r2

有什么想法?

1 个答案:

答案 0 :(得分:6)

<cffunction name="insertOptions" access="private">

您正在使用查询变量的相同名称覆盖该函数:

   <cfquery name="insertOptions" datasource="imports">

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

总是var/local范围函数变量的另一个原因 - 是,查询名称