cf脚本使用唯一键将查询结果转换为结构吗?

时间:2018-09-26 13:51:15

标签: struct coldfusion cfml cfquery cfloop

我的系统中只有很少的功能应该从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作为键,那将导致结构中有很多行。我的问题是如何防止这种情况?有没有办法只设置密钥?

3 个答案:

答案 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()代替[]。