2

试图弄清楚如何使用脚本执行此循环。

<cfquery>
<cfloop from="1" to="#arrayLen(myData)#" index="i">
<!--- update query with different paramaters --->
</cfloop>
</cfquery>

我可以像这样在循环之外执行它,但是速度很慢:

for(i=1; i LTE arrayLen(myData); i++)
{
    q = new Query();
    q.setSql(" UPDATE SQL HERE ");
    q.addParam(name="id", value=i);
    q.Execute().GetResult();
}

我想在 SQL 中做,而不是在它之外。

更新:这是代码。我试图删除其中的一些以使其更简单。

我有一个用户输入数据的表单,然后称为:

for(i=1; i LTE listlen(arguments.myStruct.myfield1); i++)   {           
    myfield1 = listgetAt(arguments.myStruct.myfield1,i);

    for(j=1; j LTE arguments.myStruct.count; j++) {
        maxvalue = form["max" & j];
        myType = form["myType" & j];
        id = myfield1;

        local.queryService = new Query();
        local.queryService.setSql
        ("          
            UPDATE  mytypes
            SET     maxvalue = :maxvalue,
                    myType = :myType
            WHERE   mytypeID = :id
        ");
        local.queryService.addParam(name="id", value=id);
        local.queryService.addParam(name="maxvalue", value=maxvalue, cfsqltype="cf_sql_integer");
        local.queryService.addParam(name="myType", value=myType, cfsqltype="cf_sql_integer");
        local.queryService.Execute().GetResult();
    }
}
4

3 回答 3

1

重新阅读Adam 的回复后,我同意我们需要查看原始更新查询。我不是 100% 确定你的目标是什么,但这是我的“猜测”。如果要更新具有不同值的多条记录,例如:

   UPDATE Table Col = 'xxx' WHERE ID = 1 ;
   UPDATE Table Col = 'yyy' WHERE ID = 2 ;
   ...

..您可以构建字符串并在循环中添加参数。请参阅下面对亚当示例的改编。请注意,您需要在数据源中启用“允许多个查询”设置才能使其正常工作。此外,请务必将execute()调用包装在事务中以保持数据完整性。

编辑根据您的更新修改了前面的示例:

<cfscript>
    // initialize these before any looping
    q = new Query();
    q.setDatasource("yourDSNHere");

    sqlArray = [];

    for(i=1; i LTE listlen(arguments.myStruct.myfield1); i++)   {           
        id = listgetAt(arguments.myStruct.myfield1,i);

        for(j=1; j LTE arguments.myStruct.count; j++) {
           // extract input values
           maxValue = form["max" & j];
           myType = form["myType" & j];

           // append a new statement
           arrayAppend(sqlArray, "UPDATE  mytypes 
                                  SET     maxvalue  = ?
                                        , myType = ? 
                                  WHERE myTypeID= ? "
                         );

           // add in the parameter values
           q.addParam(value="#maxValue#", cfSqlType="cf_sql_integer");
           q.addParam(value="#myType#", cfSqlType="cf_sql_integer");
           q.addParam(value="#id#", cfSqlType="cf_sql_integer");
    }

    // finally convert to single SQL string and run it
    q.setSQL( arrayToList(sqlArray, ";") );
    q.execute();
</cfscript>
于 2012-10-22T20:13:04.647 回答
0

很难说出你实际上在问什么,但这可能就是答案?

<cfscript>
// dunno what your data is, but you need a col and a value so let's pretend you have those
myData = [
    {col="col1", value="one"},
    {col="col2", value="two"},
    {col="col3", value="three"}
];      


q = new Query(datasource="scratch_mysql");

sql = "UPDATE tbl_test2 SET ";
for (i=1; i <= arrayLen(myData); i++){
    q.addParam(value=myData[i].value);  // you might want a type here as well?
    sql &= " #myData[i].col# = ?";
    if (i < arrayLen(myData)){  
        sql &= ",";
    }
}
sql &= " WHERE id=1";

q.setSql(sql);
q.execute();
</cfscript>

在你把你的问题说得更清楚之前,我会投票给你。这是需要澄清的第一<cfquery>点:你现在在做什么。如果我们知道这一点,我们就会知道如何告诉您如何在脚本中执行此操作。

于 2012-10-22T19:16:20.000 回答
0

我不太清楚你需要在循环中使用什么样的信息,但一种方法是构建你的更新语句,然后在你的 cfquery 中输出它。这是在 cfscript 中执行此操作的另一种方法:

<cfscript>
myData = ArrayNew(2);

myData[1][1] = "test";

myData[1][2] = "1";

for (row = 1; row LTE ArrayLen(myData); row++) {

    queryService = new query(); 

    queryService.setSQL('UPDATE mytable SET myfield = "#myData[row][1]#" where table_id=#myData[row][2]#');

    result = queryService.execute();
}
</cfscript>
于 2012-10-22T18:36:33.663 回答