gpt4 book ai didi

apache-flex - Flex:在多个插入调用中使用sqlite last_insert_rowid

转载 作者:行者123 更新时间:2023-12-03 19:07:44 25 4
gpt4 key购买 nike

我要执行的文件中包含多个SQL语句。

INSERT INTO reports (a,b,c) VALUES (1,2,3);

INSERT INTO units (report_id, e, f, g) VALUES ( (SELECT last_insert_rowid() FROM reports), 4, 5, 6);

INSERT INTO elements (report_id, h, i, j) VALUES ( (SELECT last_insert_rowid() FROM reports), 7, 8, 9);


子选择的FROM报表部分不执行任何操作。

最终发生的是:


在报告中插入一行,并且reports.id字段将自动递增
将一行插入到具有report_id等于报告id的单元中
将一行插入到report_id等于插入的最后一行的units.id的元素中


该操作如sqlite文档中所述。

我的问题是,我希望报表插入后的所有查询都使用report.id。

无论如何,我可以使它在数据库端工作而不必诉诸于as3中的解决方案?

最佳答案

有一种方法可以执行此操作,但是它在AS3中使用参数。

要做的是代替在每个调用中使用SELECT last_insert_row()函数,而将其替换为参数。

INSERT INTO elements (report_id, h, i, j) VALUES (@id, 7, 8, 9);


现在,在我的代码中,我必须将文件拆分为一个数组,以便分别处理每个单独的查询(这是AS3实现sqlite API的方式)。

var sqlArray:Array = sql.split(";\n\n");


现在,我要做的是执行第一条语句以导入报告本身。

statement.text = sqlArray[0];
statement.execute();


现在有趣的部分。您需要找回ID。因此,我们运行另一个查询。

statement.text = "SELECT last_insert_rowid() as ID";
statement.execute();
var id:int = statement.getResult().data[0].id;


现在,我们可以使用id作为参数遍历其余查询。

for(var i:int = 1; i < sqlArray.length - 1; i++) { 
/**
* start at 1 because we already inserted the report
* end at length -1 because our last entry is empty because of how split works on our data
**/
statement.text = sqlArray[i];
statement.parameters['@ID'] = id;
statement.execute();
}


这有点复杂,但不多,最终可以正常工作。

将所有内容汇总到一个函数中(省去了很多类开销)将是:

function importFromSQLString(sql:String):void {
try{
connection.begin();
var sqlArray:Array = sql.split(";\n\n");
statement.text = sqlArray[0];
statement.execute();

statement.text = "SELECT last_insert_rowid() as ID";
statement.execute();
var id:int = statement.getResult().data[0].id;

for(var i:int = 1; i < sqlArray.length - 1; i++) {
statement.text = sqlArray[i];
statement.parameters['@ID'] = id;
statement.execute();
}
connection.commit();
statement.clearParameters();
} catch (e:Error) {
connection.rollback(); //cleanup if there was a failure
}
}

关于apache-flex - Flex:在多个插入调用中使用sqlite last_insert_rowid,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3771190/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com