1

I have an error that seems to be associated with <cfscript> db operation

// traffic tracking
myQry = new Query();
myQry.setSQL("INSERT INTO   dbo.Traffic (Circuit, Fuseaction, IP_hash) VALUES   (:circuit, :fuseaction, :ip_hash)");
myQry.addParam(name="circuit",      value="#listfirst(rc.fuseaction, '.')#",    cfsqltype="CF_SQL_VARCHAR");
myQry.addParam(name="fuseaction",   value="#listlast(rc.fuseaction, '.')#",     cfsqltype="CF_SQL_VARCHAR");
myQry.addParam(name="ip_hash",      value="#cgi.remote_addr#",                  cfsqltype="CF_SQL_VARCHAR");    
myQry.execute();

The really strange thing is, it looks like the operation completed. What kind of a error is this?

enter image description here

4

1 回答 1

8

简短的回答:这可能是一个范围问题。尝试:

var myQry = new Query();


啰嗦的华夫饼回答:

我将其称为 Adob​​e 开发人员无用的错误。

如果您查看该文件的第 460 行,您会看到错误是由于 StructFind 未能在变量范围内找到查询名称,它出现在调试输入中的原因是因为存在类型为 try/catch它周围的任何东西。通过用基本的 CFML 知识替换 try/catch可以实现相同的功能而不会导致/捕获错误,当然这是 CF 产品的开发人员应该知道的!<cfif StructKeyExists(variables,tagAttributes['name']) >

CF10 版本的 base.cfc 中仍然存在相同的代码,因此您可能会或不想将其作为错误提交到 Adob​​e 的CF错误库中——尽管他们不太可能为 CF9 修复它(并且不确定他们是否会感觉到 CF10也值得努力)。

但是,这只会回避变量不存在的问题,而不是解决为什么它实际上不存在的真正问题。鉴于调试信息显示查询已成功执行,并且查询代码基本上就在该行的正上方(从第 442 行开始),它不应该是重复/常见错误,但这可能是由于您的myQry变量不是scoped,因此它可能与另一个也称为 myQry 的变量(甚至是来自对函数的单独调用的相同变量)发生冲突,这发生在new Query().execute()行的执行之间,从而导致原始查询不存在时StructFind 寻找它。

解决方案是将关键字放在var第一次使用之前myQry,它将把它放在该函数的本地范围内 - 应该对仅在函数实例中使用的所有变量执行此操作,(否则它们被放置在函数所在的组件/请求的变量范围)。

于 2013-10-13T20:03:15.410 回答