我有一组包含在<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
有什么想法?
答案 0 :(得分:6)
<cffunction name="insertOptions" access="private">
您正在使用查询变量的相同名称覆盖该函数:
<cfquery name="insertOptions" datasource="imports">
有趣的是,这完全是因为查询名称不是var
作用域。函数存储在组件的variables
范围内。因此,如果无法本地化查询名称,则在运行查询时最终会覆盖存储在variables.insertOptions
中的函数。由于insert
语句不返回结果集,因此该变量最终未定义。因此错误。在这种情况下,解决方案是对查询名称进行范围调整,或者更好地将其完全删除(因为它不会被填充)。
总是var/local
范围函数变量的另一个原因 - 是,查询名称!