ValueList() 是一个字符串吗?

Is a ValueList() a string?

我正在尝试将查询结果转换为数组

this.arLibrary  = ValueList(qryLibrary.ID).ListToArray();

我收到以下错误

Detail A script statement must end with ";".

The CFML compiler was processing:

  • A script statement beginning with this.arLibrary on line 43, column 9.
  • A cfscript tag beginning on line 21, column 2.
KnownColumn -1 KnownLine -1
KnownText <unknown> Line 43 Message Invalid construct.
Snippet this.arLibrary = ValueList(qryLibrary.ID). StackTrace

这确实有效

temp    = ValueList(qryLibrary.ID);
this.arMetricLibActive  = temp.ListToArray();

这让我想知道 ValueList() 是否是一个字符串

是的,这是一个字符串。该错误是 CFML 引擎中的解析问题。同样的语法在 Lucee 中运行良好。像 Henry 建议的那样提交错误。

这是 CommandBox REPL 中的示例

CFSCRIPT-REPL: foo = queryNew('bar')
{
    "COLUMNS":[
        "BAR"
    ],
    "DATA":[

    ]
}
CFSCRIPT-REPL: valueList( foo.bar ).listToArray()
[

]

James,如果您在收到错误消息时阅读它们会很有用:它们通常包含相关信息。我的意思不是 "stating the obvious" 那种方式,而是它实际上是解决问题的一个非常重要的部分。您面临来自 compiler 的错误消息,这意味着在编译源代码时发生了错误。但是,您问的是有关数据类型的问题,在像 CFML 这样的松散动态类型语言中,这是一个 运行 时间考虑因素。 "Runtime" 意味着 "when the code is being run" 本质上是在代码编译之后。如果代码无法编译:它不会是 运行.

所以问题不在于 valueList() return 是字符串还是类似的东西。

这里的问题是 ColdFusion 的 CFML 解析器有一个错误,它无法解释这个表达式:

ValueList(qryLibrary.ID).ListToArray()

我不知道为什么这个有问题:在另一个函数调用的return值上解析一个方法的调用应该没有问题;实际上,与一般的内置函数相反,使用 valueList() 似乎是一个特点。

提交错误。

至于在此期间在您的代码中如何处理它,我认为 Dan 是对的:通常无论如何都可以将查询列用作数组,前提是使用方括号表示法来引用该列,例如:qryLibrary["ID"]。 Brad 提请注意这对 Lucee 不起作用,但是......这既不存在也不存在,只是 Lucee 需要处理的事情。 Railo 中为此提出了一个错误 - https://issues.jboss.org/browse/RAILO-641 - 但他们拒绝解决它,只有半有效的推理。

结语:

这适用于 ColdFusion 2016 及更高版本

<cfscript>
qryLibrary = QueryNew("ID", "varchar");

qryLibrary.addrow({"id" : "cat"});
qryLibrary.addrow({"id" : "dog"});
qryLibrary.addrow({"id" : "fish"});

writedump(qryLibrary);

arLibrary  = ValueList(qryLibrary.ID).ListToArray();

writedump(arLibrary);
</cfscript>

https://cffiddle.org/app/file?filepath=6588296c-5e4d-49a4-894b-4986513e9e30/0ecde857-6d28-4e43-88a7-7830c109ab11/84cd7e81-16f8-43d7-b4c9-5490b1b5d007.cfm