函数 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" />
编辑:
简而言之,这些是我迄今为止的结论:
qry.getMetaData()
是 JAVA 类,如文档中所述,如果数组元素或结构字段是 COM、CORBA 或 JAVA 对象,则不能复制数组或结构。 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/