1

我有一组包装在一个<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 函数,抛出一个coldfusion错误,说,,variable insertOptions is undefined当我得到数据库时,第二行不存在,这告诉我有一个错误和插入回滚。因此,插入选项时出现错误,并且coldfusion没有给我正确的错误来诊断它。所以要么我必须查看显然没有设置的数据库日志,要么尝试从cftransaction块中提取错误,我不知道该怎么做。

冷融合 9, sql server 2008 r2

有什么想法吗?

4

1 回答 1

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

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

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

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

总是var/local限定函数变量的另一个原因 -是的,也可以查询名称

于 2013-09-23T18:15:04.980 回答