我试图调试cf查询,因为结构复杂而无法执行此操作。代码如下:
<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分析器。
谢谢,
答案 0 :(得分:2)
获取查询中的所有内容并将其包装在cfsavecontent中。输出结果。
如果将cfsavecontent 放在 cfquery标记内,您甚至不需要担心cfqueryparam标记barfing,尽管您确实需要在查询中重新输出保存的内容。见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>
确保在完成调试后将所有内容恢复正常。
答案 1 :(得分:1)
如果这个问题更多的是如何调试或获得一些输出,您可以使用,cftry
和cfcatch
是您的朋友。
<cftry>
---code logic---
<cfcatch>
<cfdump var="#cfcatch#">
</cfcatch>
</cfctry>
如果循环逻辑确实存在语法错误,这应该提供ColdFusion遇到的任何错误以及尝试的SQL语句的完整转储。
答案 2 :(得分:0)
你必须从内到外工作。
当我查看此查询时,我注意到它在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>
s
<强>结论强>
此代码无法使用。它无法创建有效的SQL。
答案 3 :(得分:0)
您的错误与cfquery块中的代码生成的sql无关。这是一个未定义的变量。如果您显示的代码出现问题,则错误消息会有所不同。
故障排除如下。首先注释掉该查询中的所有代码,并将其替换为:
select 1 record
这对MS SQL有效。保持其他一切不变。
运行页面会产生相同的错误。然后,您必须确定查询未运行的原因。可能,你有这样的事情发生了:
<cfif some Condition is met>
run the query
</cfif>
dump the query
您必须确定未满足条件的原因,并确保页面无法正常运行。
答案 4 :(得分:0)
解决方案是将<cftry>
放在<cfloop>
之外,而不是放在<cfquery>
之外。我发现我忘了发送一个参数。
所以代码如下:
<cfquery name="qQuery" datasource="#variables.datasource#">
<cftry>
<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>
<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#">
</cfdefaultcase>
</cfswitch>
</cfif>
</cfloop>
<cfcatch>
<cfdump var="#cfcatch#" >
</cfcatch>
</cftry>
</cfquery