我正在尝试调试一个cf查询,但不能这样做,因为他复杂的structure.The代码如下:
<cfquery name="qQuery" datasource="#variables.datasource#">
<cfloop index="i" from="1" to="#ArrayLen(aSQL)#" step="1">
<cfif IsSimpleValue(aSQL[i])>
<cfset temp = aSQL[i]>#Trim(DMPreserveSingleQuotes(temp))#
<cfelseif IsStruct(aSQL[i])>
<cfset aSQL[i] = queryparam(argumentCollection=aSQL[i])>
<cfswitch expression="#aSQL[i].cfsqltype#">
<cfcase value="CF_SQL_BIT">
#getBooleanSqlValue(aSQL[i].value)#
</cfcase>
<cfcase value="CF_SQL_DATE,CF_SQL_DATETIME">
#CreateODBCDateTime(aSQL[i].value)#
</cfcase>
<cfdefaultcase>
<!--- <cfif ListFindNoCase(variables.dectypes,aSQL[i].cfsqltype)>#Val(aSQL[i].value)#<cfelse> --->
<cfqueryparam value="#aSQL[i].value#" cfsqltype="#aSQL[i].cfsqltype#" maxlength="#aSQL[i].maxlength#" scale="#aSQL[i].scale#" null="#aSQL[i].null#" list="#aSQL[i].list#" separator="#aSQL[i].separator#">
<!--- </cfif> --->
</cfdefaultcase>
</cfswitch>
</cfif>
</cfloop>
</cfquery>如果我运行<cfdump var="#qQuery#">,它不能工作,也不能输出cfoutput,我得到未定义的qQuery错误。我如何才能找到后面正在执行的查询?我不想使用MS SQL事件探查器。
谢谢,
发布于 2016-01-16 06:11:31
获取查询中的所有内容,并将其包装在cfsavecontent中。输出结果。
如果您将cfsavecontent放在cfquery标记中,您甚至不需要担心cfqueryparam标记的反转,尽管您确实需要在查询中重新输出保存的内容。请参阅http://coldflint.blogspot.com/2016/01/debugging-queries-dirty-way.html
基本上,你应该有这个:
<cfquery name="qQuery" datasource="#variables.datasource#">
<cfsavecontent variable="sqlContent">
<cfloop index="i" from="1" to="#ArrayLen(aSQL)#" step="1">
<cfif IsSimpleValue(aSQL[i])>
<cfset temp = aSQL[i]>#Trim(DMPreserveSingleQuotes(temp))#
<cfelseif IsStruct(aSQL[i])>
<cfset aSQL[i] = queryparam(argumentCollection=aSQL[i])>
<cfswitch expression="#aSQL[i].cfsqltype#">
<cfcase value="CF_SQL_BIT">
#getBooleanSqlValue(aSQL[i].value)#
</cfcase>
<cfcase value="CF_SQL_DATE,CF_SQL_DATETIME">
#CreateODBCDateTime(aSQL[i].value)#
</cfcase>
<cfdefaultcase>
<!--- <cfif ListFindNoCase(variables.dectypes,aSQL[i].cfsqltype)>#Val(aSQL[i].value)#<cfelse> --->
<cfqueryparam value="#aSQL[i].value#" cfsqltype="#aSQL[i].cfsqltype#" maxlength="#aSQL[i].maxlength#" scale="#aSQL[i].scale#" null="#aSQL[i].null#" list="#aSQL[i].list#" separator="#aSQL[i].separator#">
<!--- </cfif> --->
</cfdefaultcase>
</cfswitch>
</cfif>
</cfloop>
</cfsavecontent>
#sqlContent#
</cfquery>
<pre>#sqlContent#</pre>请确保在完成调试后将所有内容恢复正常。
发布于 2016-01-16 05:47:22
如果这个问题更多地是关于如何调试或获得一些您可以使用的输出,那么cftry和cfcatch是您的朋友。
<cftry>
---code logic---
<cfcatch>
<cfdump var="#cfcatch#">
</cfcatch>
</cfctry>如果确实存在由循环逻辑生成的语法错误,这将提供ColdFusion遇到的所有错误以及尝试的SQL语句的完整转储。
发布于 2016-01-16 07:39:01
你必须从里到外做这个。
当我查看这个查询时,我注意到它在IsSimpleValue()和IsStruct()上是分开的。所以运行这个
<cfquery name="qQuery" datasource="#variables.datasource#">
<cfloop index="i" from="1" to="#ArrayLen(aSQL)#" step="1">
<cfif IsSimpleValue(aSQL[i])>
<cfset temp = aSQL[i]>#Trim(DMPreserveSingleQuotes(temp))#
</cfif>
</cfloop>
</cfquery>请注意,从不使用temp。
代码的其余部分创建<cfqueryparam>的
结论
此代码不能工作。它无法创建有效的SQL。
https://stackoverflow.com/questions/34820332
复制相似问题