我很难找到正确的语法来一次执行多个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
    );
";


如果我理解正确,我想我需要使用transaction {}块。但是我是否将原始的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(),但是当然并没有为字符串定义execute(),而且它也不会与任何数据库相关...

另外,是否需要if(good)部分?默认情况下,if(good)是否测试是否发生MySQL错误?事务action =“ commit”是实际发送SQL脚本的内容吗?

我是否需要将它们拆分成单独的查询对象并按顺序运行它们?如果是的话,甚至在CFscript中包含交易块有什么意义?

我知道我要离开这里了,但是我很难在CF文档中导航。如果有人知道一个专门用于CFscript参考的好资源,我真的可以使用它,因为我在Adobe版本上苦苦挣扎。

最佳答案

试试这个代码

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

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

10-05 21:28