Flex / Air sqlite асинхронная проблема - PullRequest
0 голосов
/ 28 октября 2009

Я пишу приложение, которое анализирует CSV-файл в массив, а затем вставляет массив в базу данных sqlite. У меня проблемы с асинхронным подключением к базе данных sqlite, я получаю ошибку 3106 ...... Я думаю, проблема в том, что он выполняет следующий оператор до того, как предыдущий будет завершен, но я не могу найти способ справиться этот. Любая помощь будет принята с благодарностью.

public function addData(categories:Array):void{
                status = "Adding data to table";
                var insrtStmt:SQLStatement = new SQLStatement();
                    insrtStmt.sqlConnection = conn;


                        for(var i:int=categories.length-1; i>=0; i--){
                            insrtStmt.text = "";
                            insrtStmt.text += "INSERT INTO masterlist ";
                            insrtStmt.text += "(mainid, transactionDate, tradeId, ccyPair, account, buySell, customer, date,"; 
                            insrtStmt.text += " additionalid, dealType, traderName, genericType, owner) ";
                            insrtStmt.text += "VALUES(@mainid, @transactionDate, @tradeId, @ccyPair, @account, @buySell, @customer, @date,";
                            insrtStmt.text += " @additionalid, @dealType, @traderName, @genericType, @owner);";
                            insrtStmt.parameters["@mainid"] = categories[i].mainid;
                            insrtStmt.parameters["@transactionDate"] = categories[i].transactionDate;
                            insrtStmt.parameters["@tradeId"] = categories[i].tradeId;
                            insrtStmt.parameters["@ccyPair"] = categories[i].ccyPair;
                            insrtStmt.parameters["@account"] = categories[i].account;
                            insrtStmt.parameters["@buySell"] = categories[i].buySell;
                            insrtStmt.parameters["@customer"] = categories[i].customer;
                            insrtStmt.parameters["@date"] = categories[i].date;
                            insrtStmt.parameters["@additionalid"] = categories[i].additionalid;
                            insrtStmt.parameters["@dealType"] = categories[i].dealType;
                            insrtStmt.parameters["@traderName"] = categories[i].traderName;
                            insrtStmt.parameters["@genericType"] = categories[i].genericType;
                            insrtStmt.parameters["@owner"] = categories[i].owner;
                            insrtStmt.execute();
                            }

                }

Ответы [ 4 ]

1 голос
/ 28 октября 2009

Если вы считаете, что проблема в том, что он все еще выполняется, просто добавьте прослушиватель событий в оператор для его события «result», а затем запустите следующие операторы.

public function addDataSet( categories : Array ) : void {
    _categories = categories;
    _loopcounter = categories.length;
    _insrtStmt : SQLStatement = new SQLStatement();
    _insrtStmt.addEventListener( "result", addData );
    addData();
}

public function addData(event : Event = null) : void {
    _loopcounter--;
    // Set up rest of statement
    _insrtStmt.execute();
}
0 голосов
/ 16 марта 2011

Или вы можете создать новое SQLStatement для каждого запроса, таким образом вам не нужно ждать, и вы можете запустить вставки так быстро, как клиентский компьютер сможет их обработать.

public function addData(categories:Array):void {
    status = "Adding data to table";
    var insrtStmt:SQLStatement;

    for(var i:int=categories.length-1; i>=0; i--) {
        insrtStmt = new SQLStatement();
        insrtStmt.sqlConnection = conn;
        insrtStmt.text = "";
        insrtStmt.text += "INSERT INTO masterlist ";
        insrtStmt.text += "(mainid, transactionDate, tradeId, ccyPair, account, buySell, customer, date,"; 
        insrtStmt.text += " additionalid, dealType, traderName, genericType, owner) ";
        insrtStmt.text += "VALUES(@mainid, @transactionDate, @tradeId, @ccyPair, @account, @buySell, @customer, @date,";
        insrtStmt.text += " @additionalid, @dealType, @traderName, @genericType, @owner);";
        insrtStmt.parameters["@mainid"] = categories[i].mainid;
        insrtStmt.parameters["@transactionDate"] = categories[i].transactionDate;
        insrtStmt.parameters["@tradeId"] = categories[i].tradeId;
        insrtStmt.parameters["@ccyPair"] = categories[i].ccyPair;
        insrtStmt.parameters["@account"] = categories[i].account;
        insrtStmt.parameters["@buySell"] = categories[i].buySell;
        insrtStmt.parameters["@customer"] = categories[i].customer;
        insrtStmt.parameters["@date"] = categories[i].date;
        insrtStmt.parameters["@additionalid"] = categories[i].additionalid;
        insrtStmt.parameters["@dealType"] = categories[i].dealType;
        insrtStmt.parameters["@traderName"] = categories[i].traderName;
        insrtStmt.parameters["@genericType"] = categories[i].genericType;
        insrtStmt.parameters["@owner"] = categories[i].owner;
        insrtStmt.execute();
    }
}
0 голосов
/ 05 февраля 2010

Для одновременного выполнения нескольких команд - используйте транзакции.

Простой пример из http://www.zedia.net/2009/air-sqlite-optimization-tricks/

_updateStmt.sqlConnection = _conn;
_updateStmt.text = "UPDATE main.myTable SET statusF=@STATUS  WHERE keyId=@ID";

_conn.begin();//_conn is a SQLConnection, I didn't take the time to write the code for it, but this is where the magic happens

for (var i:uint = 0; i < currentArray.length; i++){
  _updateStmt.parameters["@STATUS"] = currentArray[i].status;
  _updateStmt.parameters["@ID"] = currentArray[i].id;
  _updateStmt.execute();
}

_conn.commit();

Также взгляните на главу Adobe Flex Liveocs «Повышение производительности базы данных»

0 голосов
/ 28 октября 2009

Может быть, вам следует использовать синхронное соединение вместо асинхронного? При необходимости вы можете открыть несколько подключений к одной базе данных и использовать соответствующее подключение.

...