Я пытаюсь понять, как выполнить массовую вставку SQLite с использованием транзакций во Flex / Actionscript 3 (с использованием Adobe Air 2). Это работает, но не имеет смысла заново создавать новое SQLStatement в цикле:
private function onAddBulkContacts():void {
_responder = new Responder(resultEventHandler, errorEventHandler);
contacts_db.connection.begin(null, _responder);
var statement:SQLStatement;
for (var i:uint=0; i<parseInt(bulkAdd.numberToAdd.text); i++) {
statement = new SQLStatement();
statement.sqlConnection = contacts_db.connection;
statement.text ="INSERT INTO contacts ('name', 'lastname') VALUES (@NAME, @LASTNAME)";
statement.addEventListener(SQLErrorEvent.ERROR, function(event:Event):void {
trace('statement error');});
statement.addEventListener(SQLEvent.RESULT, function(event:Event):void { trace('result'); });
statement.parameters['@NAME'] = "Name " + i.toString();
statement.parameters['@LASTNAME'] = "LastName " + i.toString();
statement.execute();
}
contacts_db.connection.commit();
}
Что я хочу сделать, так это создать SQLStatement один раз, дать ему скомпилироваться, затем просто передать новые аргументы в цикле, зафиксировать его в конце, например,
private function onAddBulkContacts():void {
_responder = new Responder(resultEventHandler, errorEventHandler);
contacts_db.connection.begin(null, _responder);
var statement:SQLStatement;
statement = new SQLStatement();
statement.sqlConnection = contacts_db.connection;
statement.text ="INSERT INTO contacts ('name', 'lastname') VALUES (@NAME, @LASTNAME)";
statement.addEventListener(SQLErrorEvent.ERROR, function(event:Event):void {
trace('statement error');});
statement.addEventListener(SQLEvent.RESULT, function(event:Event):void { trace('result'); });
for (var i:uint=0; i<parseInt(bulkAdd.numberToAdd.text); i++) {
statement.parameters['@NAME'] = "Name " + i.toString();
statement.parameters['@LASTNAME'] = "LastName " + i.toString();
statement.execute();
}
contacts_db.connection.commit();
}
Но последний код выдает ошибку, говоря, что он не может быть выполнен во второй раз, так как сам оператор все еще выполняется (и я полагаю, что будет в этом состоянии до фиксации). Полагаю, я понимаю, что операторы добавляются в очередь выполнения, но нет смысла добавлять текст SQL в цикле, чего я стараюсь избегать. Я уверен, что есть лучший способ сделать это, но я потратил слишком много времени на взлом и чтение, пытаясь понять, какова правильная последовательность. Есть идеи?