首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >自定义函数在ColdFusion 10/11中工作,但在Lucee中抛出错误

自定义函数在ColdFusion 10/11中工作,但在Lucee中抛出错误
EN

Stack Overflow用户
提问于 2018-02-02 22:19:55
回答 1查看 300关注 0票数 3

我有以下函数,从某些CF代码继承而来。它可以工作,但只适用于ColdFusion版本10和11。我不担心2016年的升级计划。我正试图在Lucee下运行它,但它不起作用。

代码语言:javascript
运行
复制
<cffunction name="QueryToArray" access="public" returntype="array" output="false" hint="This turns a query into an array of structures.">
  <!--- Define arguments. --->
  <cfargument name="Data" type="query" required="yes" />
  <cfscript>    
    var LOCAL = StructNew(); // Define the local scope.
    LOCAL.Columns = data.getMetaData().getColumnLabels();  // Get the column names as an array.
    LOCAL.QueryArray = ArrayNew(1); // Create an array that will hold the query equivalent.
    for (LOCAL.RowIndex = 1 ; LOCAL.RowIndex LTE ARGUMENTS.Data.RecordCount; 
    LOCAL.RowIndex = (LOCAL.RowIndex + 1)){
        LOCAL.Row = StructNew();
        for (LOCAL.ColumnIndex = 1 ; LOCAL.ColumnIndex LTE ArrayLen(LOCAL.Columns); 
        LOCAL.ColumnIndex = (LOCAL.ColumnIndex + 1)){
            LOCAL.ColumnName = LOCAL.Columns[LOCAL.ColumnIndex];
            LOCAL.Row[LOCAL.ColumnName] = ARGUMENTS.Data[LOCAL.ColumnName][LOCAL.RowIndex];
        }
        ArrayAppend(LOCAL.QueryArray, LOCAL.Row);
    }
    return(LOCAL.QueryArray);
    </cfscript>
</cffunction>

在Lucee,我试着做了以下这些更改:

代码语言:javascript
运行
复制
<cffunction name="QueryToArray" access="public" returntype="array" output="false" hint="This turns a query into an array of structures.">
  <!--- Define arguments. --->
  <cfargument name="Data" type="query" required="yes" />
  <cfscript>    
    var LOCAL = StructNew(); // Define the local scope.
    LOCAL.Columns = data.getColumnlist(false); // Get the column names as an array.
    LOCAL.QueryArray = ArrayNew(1); // Create an array that will hold the query equivalent.
    for (LOCAL.RowIndex = 1 ; LOCAL.RowIndex LTE ARGUMENTS.Data.RecordCount; 
    LOCAL.RowIndex = (LOCAL.RowIndex + 1)){
        LOCAL.Row = StructNew();
        for (LOCAL.ColumnIndex = 1 ; LOCAL.ColumnIndex LTE ArrayLen(LOCAL.Columns); 
        LOCAL.ColumnIndex = (LOCAL.ColumnIndex + 1)){
            LOCAL.ColumnName = LOCAL.Columns[LOCAL.ColumnIndex];
            LOCAL.Row[LOCAL.ColumnName] = ARGUMENTS.Data[LOCAL.ColumnName][LOCAL.RowIndex];
        }
        ArrayAppend(LOCAL.QueryArray, LOCAL.Row);
    }
    return(LOCAL.QueryArray);
    </cfscript>
</cffunction> 

但我发现了一个错误:

消息:不能将字符串名称,值转换为数组类型的值 详细信息:对象的类型是java.lang.String 堆栈跟踪: C:\home\website\wwwroot\controller\production\cfc\kernel.cfc:第12行10: LOCAL.RowIndex = (LOCAL.RowIndex +1){ 11: LOCAL.Row = StructNew();12: for (LOCAL.ColumnIndex =1;LOCAL.ColumnIndex LTE ArrayLen(LOCAL.Columns);13: LOCAL.ColumnIndex = (LOCAL.ColumnIndex + 1)){ 14: LOCAL.ColumnName = LOCAL.ColumnsLOCAL.ColumnIndex;

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-02 23:38:50

要使代码正常工作,只需将第6行从

代码语言:javascript
运行
复制
LOCAL.Columns = data.getColumnlist(false); // Get the column names as an array.

到这个

代码语言:javascript
运行
复制
LOCAL.Columns = data.getColumnNames(); // Get the column names as an array.

但是,我发现了一个在ColdFusion和Lucee中都能工作的gist ColdFusion。我决定创建一些示例代码和在https://trycf.com/上测试。我验证了它在Lucee4.5和5中工作,也在ColdFusion 10,11,2016中工作。希望这能有所帮助!

代码语言:javascript
运行
复制
<!--- Create a new three-column query, specifying the column data types ---> 
<cfset myQuery = QueryNew("Name, Time, Advanced", "VarChar, Time, Bit")> 

<!--- Make two rows in the query ---> 
<cfset QueryAddRow(MyQuery, 2)> 

<!--- Set the values of the cells in the query ---> 
<cfset QuerySetCell(myQuery, "Name", "The Wonderful World of CMFL", 1)> 
<cfset QuerySetCell(myQuery, "Time", "9:15 AM", 1)> 
<cfset QuerySetCell(myQuery, "Advanced", False, 1)> 
<cfset QuerySetCell(myQuery, "Name", "CFCs for Enterprise 
        Applications", 2)> 
<cfset QuerySetCell(myQuery, "Time", "12:15 PM", 2)> 
<cfset QuerySetCell(myQuery, "Advanced", True, 2)> 

<h4>The query</h4> 
<cfdump var="#myQuery#">

<h4>The array of objects</h4> 
<cfset myArray = QueryToArray(myQuery)>
<cfdump var="#myArray#">

<cfscript>
/**
* @hint Returns reasonable array of objects from a cfquery
*/
public function queryToArray(
    required query  query,
             string excludeColumns = ""
){

    if (server.coldfusion.productName == "ColdFusion Server") {
        local.columns = arguments.query.getMetaData().getColumnLabels();
    } else if (server.coldfusion.productName == "Lucee") {
        local.columns = arguments.query.getColumnNames();
    } else {
        local.columns = [];
    }

    local.response = arrayNew(1);

    for (local.rowIndex=1; local.rowIndex<=arguments.query.recordCount; local.rowIndex++) {
        local.response[local.rowIndex] = structNew();

        for (local.columnIndex=1; local.columnIndex<=arrayLen(local.columns); local.columnIndex++) {
            local.columnName = local.columns[local.columnIndex];

            if(local.columnName != "" && (arguments.excludeColumns == "" || !listFindNoCase(arguments.excludeColumns, local.columnName))) {
                local.response[local.rowIndex][local.columnName] = arguments.query[local.columnName][local.rowIndex];
            }
        }
    }

    return local.response;
}
</cfscript>
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48591682

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档