Actionscript SQLite Вставить операторы в транзакции - PullRequest
0 голосов
/ 16 августа 2011

Я пытаюсь понять, как выполнить массовую вставку 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 в цикле, чего я стараюсь избегать. Я уверен, что есть лучший способ сделать это, но я потратил слишком много времени на взлом и чтение, пытаясь понять, какова правильная последовательность. Есть идеи?

1 Ответ

0 голосов
/ 17 августа 2011

Массовые вставки в AIR еще не выполнялись, но обычно создается оператор вне цикла, инициируется транзакция; затем с каждой итерацией цикла связывает новые значения параметров и выполняет инструкцию; затем вне цикла, commit.

Открыта ли база данных в синхронном или асинхронном режиме?

В асинхронном режиме:

... the simplest way to organize the application to ensure that the operations are executed properly is to create a method that’s registered as a listener for the begin event. The code to call the SQLStatement.execute() method is placed within that listener method. http://help.adobe.com/en_US/AIR/1.5/devappshtml/WS5b3ccc516d4fbf351e63e3d118666ade46-7d2b.html

Вы также можете попробовать привязать следующий набор значений к параметрам оператора, используя метод array.shift (), а не в цикле; метод array.shift () будет вызван в обработчике результатов; когда массив пуст, вы делаете коммит; ваш обработчик ошибок выдаст откат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...