【问题标题】:Is a ValueList() a string?ValueList() 是字符串吗?
【发布时间】:2019-09-04 11:18:15
【问题描述】:

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

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

我收到以下错误

Detail 脚本语句必须以“;”结尾。

CFML 编译器是 处理:

  • 以 this.arLibrary 第 43 行第 9 列。
  • cfscript 标签 从第 21 行第 2 列开始。
KnownColumn -1 KnownLine -1
KnownText 第 43 行消息无效构造。
片段 this.arLibrary = 值列表(qryLibrary.ID)。 堆栈跟踪

这确实有效

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

这让我怀疑ValueList() 是不是一个字符串

【问题讨论】:

  • 将此文件归档到语言下的bugbase.adobe.com?但是,我感觉它会属于“无法修复”。
  • 鉴于数组函数适用于查询列,您可能希望做一些不必要的事情。
  • ValueList() 是字符串吗? writeDump(temp.getClass().name);
  • @dan baruk,不是在 Lucee,他们没有。这是仅存在于 Adob​​e CF 中的未记录行为。 Lucee 有一个专门的函数来检索查询的列数据作为数组。
  • @Leigh:它返回:java.lang.String。在类似的注释ValueList(qryLibrary.ID).getClass(); 崩溃

标签: coldfusion cfml coldfusion-11


【解决方案1】:

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

这是命令框 REPL 中的一个示例

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

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

]

【讨论】:

    【解决方案2】:

    James,如果您在收到错误消息时阅读它们会很有用:它们通常包含相关信息。我的意思不是“陈述显而易见”的方式,而是它实际上是解决问题的一个非常重要的部分。您会遇到来自编译器 的错误消息,这意味着在编译源代码时发生了错误。但是,您问的是关于数据类型的问题,在 CFML 之类的松散动态类型语言中,数据类型是运行时的考虑因素。 “运行时”意味着“代码运行时”,它本质上是在代码编译之后。如果代码不能编译:它不会运行。

    所以问题不在于valueList() 是否返回一个字符串或类似的东西。

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

    ValueList(qryLibrary.ID).ListToArray()
    

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

    提交错误。

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

    【讨论】:

      【解决方案3】:

      结语:

      这适用于 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

      【讨论】:

      • 请注意,与大多数列表函数一样,它会消除空值。如果出于某种原因您想保留这些,请使用ListToArray(",", true)
      猜你喜欢
      • 2022-12-21
      • 2019-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-28
      • 1970-01-01
      相关资源
      最近更新 更多