我无法找到正确的语法来同时执行多个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的版本。
答案 0 :(得分:1)
试试此代码
try {
transaction {
qTrans = new Query();
qTrans.setDatasource(variables.instance.datasource.getDSN());
qTrans.setSQL(SQL);
qryRes = qTrans.execute();
TransactionCommit();
}
} catch(database e) {
TransactionRollback();
}