ColdFusion 的 Duplicate 函数不会复制查询的元数据

标签 coldfusion coldfusion-9 pass-by-value

函数 Duplicate ColdFusion 9 应该返回一个变量的克隆,也称为深拷贝,没有对原始变量的引用。对于复杂的对象,例如结构和查询,这应该是正确的。

我正在处理使用 APPLICATION 范围内的查询对象的代码。此查询需要在本地修改以在特定页面中使用,我需要知道原始查询字符串是什么(在查询对象的元数据中)。所以在这种情况下,创建原始查询的深拷贝是最明智的解决方案。

但不幸的是,看起来 ColdFusion 并没有克隆整个对象,而只是克隆了它的结果集,从而丢失了所有元数据。

这不是我期望的行为 Duplicate ,而且我发现它与复制其他类型的复杂对象时发生的情况不一致。

我的问题的一种解决方案是将结果集和 sql 字符串作为单独的参数传递给函数。

但是,我想知道您是否有更优雅的解决方案,和/或对查询重复问题有所了解。

下面是一些证明查询重复问题的代码:

<cfquery name="qry" datasource="mydatasource">
    SELECT "blue" AS colour, "pear" as fruit
</cfquery>
<cfset qry_copy = qry>
<cfset qry_deepcopy = duplicate(qry)>

<cfdump var="#qry#" label="Original query" />
<cfdump var="#qry_copy#" label="Copy of the query (by reference)" />
<cfdump var="#qry_deepcopy#" label="Deep copy of the query (by value)" />

<cfdump var="#qry.getMetaData().getExtendedMetaData()#" label="Metadata of the original query" />
<cfdump var="#qry_copy.getMetaData().getExtendedMetaData()#" label="Metadata of the copy of the query" />
<cfdump var="#qry_deepcopy.getMetaData().getExtendedMetaData()#" label="Metadata of the deep copy of the query" />

A query, its copy and its deep copy

编辑:

简而言之,这些是我迄今为止的结论:
  • 元数据不会被复制,因为 qry.getMetaData()是 JAVA 类,如文档中所述,如果数组元素或结构字段是 COM、CORBA 或 JAVA 对象,则不能复制数组或结构。
  • 用于获取查询元数据的已记录的 ColdFusion 函数是 getMetaData(qry) .
  • 我通过存储 qry 解决了我的问题和 getMetaData(qry)在应用范围内。
  • 最佳答案

    嗯……这就是我对错误的看法。我的猜测是存在对未拉入深拷贝的元数据的引用。如果是别的东西,在深拷贝上调用的“getMetaData()”函数会抛出一个错误。

    您是否尝试将“结果”属性添加到查询标记中?如:

    <cfquery name="qry" datasource="mydatasource" result="myresult">
        SELECT "blue" AS colour, "pear" as fruit
    </cfquery>
    

    这可能会创建一个嵌入在结果集中的属性或类——尽管我相信“结果”实际上是在变量范围内设置的。我需要考虑一下。

    关于ColdFusion 的 Duplicate 函数不会复制查询的元数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21023246/

    相关文章:

    json - Zoho CRM 使用 JSON/Coldfusion 插入记录

    sql-server - MS-SQL/ColdFusion : Mysterious database error: Object has been closed

    c++-cli - 如何创建包含按值传递的 List(或类似)的 CLI 值类?

    c# - DataGridView:按值传递还是按引用传递?

    json - 为什么 SerializeJSON 返回一个带有 .0 的 int?

    Excel 工作表分组和格式

    json - 我如何确保 SerializeJSON 保留尾随/前导零?

    coldfusion - CFInclude vs Custom Tag vs CFC 用于演示和安全性

    coldfusion - 谷歌分析,从coldfusion服务器cfhttp中击中它

    c - 动态内存访问仅在函数内部有效