在结构中找不到qryname14411键

时间:2013-10-13 19:09:22

标签: coldfusion cfml

我有一个似乎与<cfscript> db操作

相关联的错误
// 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();

真奇怪的是,看起来操作已经完成。这是一个什么样的错误?

enter image description here

1 个答案:

答案 0 :(得分:8)

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

var myQry = new Query();


啰嗦waffley回答:

我称之为Adobe开发人员无用的错误。

如果查看该文件的第460行,您将看到错误是由于StructFind无法在变量范围内找到查询名称,并且它出现在调试输入中的原因是因为有一个尝试/抓住任何周围的类型。通过将{/ 1}}替换为基本CFML知识的<cfif StructKeyExists(variables,tagAttributes['name']) >,可以实现不带导致/捕获错误的相同功能,当然CF产品的开发人员应该知道!< / p>

在base.cfc的CF10版本中仍然存在相同的代码,因此您可能或者不想将其作为Adobe CF bugbase中的错误提交 - 尽管它们不太可能为CF9修复它(并且不确定他们是否觉得CF10值得付出努力。

然而,这只会使变量问题不存在,而不是解决为什么实际上不存在的实际问题。鉴于调试信息显示查询成功执行,并且查询代码基本上在该行之上(从第442行开始),它不应该是重复/常见错误,但可能是由于您的myQry变量没有作用域,因此它可能会与另一个名为myQry的变量(甚至是对函数的单独调用中的相同变量)发生碰撞,这在{{的执行之间发生1}}和new Query()行,从而导致原始查询在StructFind查找时不存在。

解决方法是在第一次使用.execute() 之前设置关键字var,这将把它放在该函数的本地范围内 - 应该为所有仅在函数实例中使用的变量,(否则它们放在函数所在的组件/请求的变量范围内)。