我的系统中有几个函数应该从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 作为结构中的键传递,这将导致结构中出现如此多的行。我的问题是如何防止这种情况?有没有办法只设置密钥?
我不确定为什么您的 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
你可以试试这个 -
var strZip = {};
for ( i=1; i<=ZipResult.recordCount; i++)
{
strZip[ZipResult.RecID[i]] = {
"City" : trim(ZipResult.City[i]),
"State" : trim(ZipResult.State[i])
};
}
这样,我们将查询视为数组结构。
不,你是对的。因为它是一个整数,所以 ColdFusion 正在填充数组直到该整数的点,因为你不能有一个包含一堆空值的数组;它们必须具有一些价值,所以 - 正如你在这里看到的 - 它们是未定义的。 不能将整数用于结构键。如果你在它的前面添加一个字母,然后在引用它时将键切成该值,这将起作用。这很笨拙,但这就是我通常为这种事情做的事情。 如果你想测试它,你可以使用 StructInsert(( 而不是 []。