在CFscript中提交多个查询事务

时间:2014-08-21 06:06:54

标签: mysql coldfusion

我无法找到正确的语法来同时执行多个MySQL语句,就像使用cftransaction一样。我试图在纯cfscript中的CFC中实现它。

<cftransaction>
    DROP TABLE IF EXISTS SOME_TEMP_TBL;
    CREATE TABLE SOME_TEMP_TBL AS
    (
        SELECT * FROM ANOTHER_TBL
    );
    DROP TABLE IF EXISTS SOME_TEMP_TBL_2;
    CREATE TABLE SOME_TEMP_TBL_2 AS
    (
        SELECT * FROM ANOTHER_TBL_2
    );
</cftransaction>

所以我将SQL语句链接在一起作为字符串:

var SQL = "
    DROP TABLE IF EXISTS SOME_TEMP_TBL;
    CREATE TABLE SOME_TEMP_TBL AS
    (
        SELECT * FROM ANOTHER_TBL
    );
    DROP TABLE IF EXISTS SOME_TEMP_TBL_2;
    CREATE TABLE SOME_TEMP_TBL_2 AS
    (
        SELECT * FROM ANOTHER_TBL_2
    );
";

如果我理解正确,我认为我需要使用事务{}块。但是我把原始MySQL代码放在那里吗?目前我试图将它附加到Query对象,但Base.cfc(Railo)抛出一个错误,说明数据源没有被定义。

transaction
{
    qTrans = new Query();
    qTrans.setSQL(SQL);
    qTrans.execute();
    qTrans.setDatasource(variables.instance.datasource.getDSN());

    if (good) 
    {
        transaction action="commit";
    } else {
        transaction action="rollback";
    }
}

还尝试过SQL.execute(),但当然没有为字符串&amp;而定义execute()。它无论如何都不会与任何数据库相关......

此外,是否需要if(好)部分?默认情况下是否(良好)测试是否发生MySQL错误?并且是交易行动=&#34;提交&#34;什么实际发送SQL脚本?

我是否需要将它们拆分为单独的Query对象并按顺序运行?如果是这样,即使在CFscript中使用事务块也是什么意思?

我知道我离这儿很远,但我很难在CF文档中导航。如果有人知道专门针对CFscript引用的一个好的来源,我真的可以使用一个,因为我很难使用Adobe的版本。

1 个答案:

答案 0 :(得分:1)

试试此代码

try {
    transaction {
        qTrans = new Query();
        qTrans.setDatasource(variables.instance.datasource.getDSN());
        qTrans.setSQL(SQL);
        qryRes = qTrans.execute();

        TransactionCommit();
    }
} catch(database e) { 
    TransactionRollback(); 
}