我的系统中只有很少的功能应该从CFML转换为CFSCRIPT。在进行该项目时,我遇到这样的情况,即我的结构输出的结果(应有很多空行)比应有的结果多,甚至查询也只返回一行。这是我在CFSCRIPT中的代码示例:
cfstoredproc( procedure="GetZip", datasource=Application.dsnRead ) {
cfprocparam( dbvarname="@Zip", value=trim(52401), cfsqltype="cf_sql_char", maxlength=5 );
cfprocresult( name="ZipResult" );
}
local.strZip = {};
strZip[ZipResult.RecID] = {
"City" : trim(ZipResult.City),
"State" : trim(ZipResult.State)
};
writeDump(strZip);
这是我得到的输出:
array
1 [undefined array element]
2 [undefined array element]
3 [undefined array element]
4 [undefined array element]
5 [undefined array element]
6 [undefined array element]
7 [undefined array element]
8 [undefined array element]
9 [undefined array element]
10 [undefined array element]
11 [undefined array element]
12 [undefined array element]
13 [undefined array element]
14 [undefined array element]
...
我想知道在结构中输出查询结果并使用RecID
作为唯一键的最佳方法是什么?上面的示例和查询始终会同时返回1条记录,但是我想知道如果我需要遍历具有多条记录的查询结果,此代码将如何工作?
更新:我认为我找到了问题。 RecID
是我的数据库表中的自动增量ID。例如,当我返回RecID
时,值可以为56743
。因此,如果在我的结构中传递RecID作为键,那将导致结构中有很多行。我的问题是如何防止这种情况?有没有办法只设置密钥?
答案 0 :(得分:3)
我不确定您的CF为什么将strZip
转换为数组,但这就是为什么您得到一堆空容器的原因。结构键可以是整数,但是当您告诉数组插入x[42]
时,数组中将有42个元素。 local.strZip = {};
非常明确地声明strZip
是一个结构。但是,有时CF中的作用域可能会变得很奇怪。根据您的使用方式,我认为您执行strZip[ZipResult.RecID]
时可能会创建一个新的无范围变量,即数组。然后,当您转储它时,您将转储strZip
的数组版本。您可以尝试使用local.strZip[ZipResult.RecID]
,看看是否会改变您的行为。或者尝试转储local.strZip
,看看它是否为空。
或者您可以这样做:
<cfscript>
// Build a fake query object.
ZipResult = queryNew(
"RecID, City, State",
"integer, varchar, varchar",
[
{ RecID: 99, City: "Nashville", State: "TN" }
]
);
writeDump(ZipResult); // What's in our query?
local.strZip = {
"#ZipResult.RecID#" : {
City : trim(ZipResult.City) ,
State : trim(ZipResult.State)
}
};
writeDump(strZip);
</cfscript>
https://trycf.com/gist/28440630b0aa7ba1642e45bab3503652/acf2016?theme=monokai
注意:我无法在TryCF中复制您的行为,但是我也不太可能在与您相同的范围内执行该代码。
确认:https://cffiddle.org/app/file?filepath=50f4e710-bd9b-40dd-a03a-15695bdd5a0d/c476f91b-6931-4295-be67-e4309aecfa0c/0492a7c6-029f-4227-941a-faee9da5a7cc.cfm
答案 1 :(得分:1)
您可以尝试-
var strZip = {};
for ( i=1; i<=ZipResult.recordCount; i++)
{
strZip[ZipResult.RecID[i]] = {
"City" : trim(ZipResult.City[i]),
"State" : trim(ZipResult.State[i])
};
}
通过这种方式,我们将查询视为数组的结构。
答案 2 :(得分:0)
不,您是对的。因为它是一个整数,所以ColdFusion会将数组填充到该整数的点,因为您不能拥有带有一堆空值的数组。它们必须具有一定的价值,因此-如您在此处看到的-它们是未定义的。 您不能将整数用作结构键。如果在其前面添加一个字母,然后在引用它时将该键切成该值,那将起作用。这很骇人,但这就是我通常要做的事情。 如果要测试它,可以使用StructInsert()代替[]。