如何在cfquery外部使用查询中声明的@time变量并在cfcatch中显示?
解决方案
1. 修改查询以返回@time的值
在原CFQUERY中添加SELECT @time AS CalculatedTime;,让查询执行插入后返回计算出的时间差,这样ColdFusion就能获取到这个值:
<cfquery name="insert"> Declare @time int; set @time = DATEDIFF(ww, <cfqueryparam value="#Form.StartDate#" cfsqltype="cf_sql_date">, <cfqueryparam value="#Form.EndDate#" cfsqltype="cf_sql_date">); insert into timehistory() values(1, @time); SELECT @time AS CalculatedTime; </cfquery>
2. 将SQL变量存入ColdFusion变量
查询执行后,把返回的CalculatedTime赋值给一个ColdFusion变量,这样在CFQUERY外部就能调用:
<cfset calculatedTime = insert.CalculatedTime>
3. 包裹错误处理块,在CFCATCH中显示变量
用<cftry>和<cfcatch>包裹代码,出错时直接输出之前保存的calculatedTime变量:
<cftry> <cfquery name="insert"> Declare @time int; set @time = DATEDIFF(ww, <cfqueryparam value="#Form.StartDate#" cfsqltype="cf_sql_date">, <cfqueryparam value="#Form.EndDate#" cfsqltype="cf_sql_date">); insert into timehistory() values(1, @time); SELECT @time AS CalculatedTime; </cfquery> <cfset calculatedTime = insert.CalculatedTime> <!--- 这里可以正常使用calculatedTime变量 ---> <cfoutput>计算的周数差:#calculatedTime#</cfoutput> <cfcatch type="any"> <h3>出错了</h3> <p>错误信息:#cfcatch.message#</p> <p>计算的周数差:<cfif isDefined("calculatedTime")>#calculatedTime#<cfelse>未计算出有效时间差</cfif></p> </cfcatch> </cftry>
关键说明
- 替换原代码中的直接变量引用为
<cfqueryparam>,既避免SQL注入风险,也能确保日期类型与数据库要求匹配。 - 在CFCATCH中添加了变量存在性判断,防止插入操作失败时变量未赋值导致的报错。
内容的提问来源于stack exchange,提问作者sangeeta bhat
相关产品推荐
相关产品推荐

