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