Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   SQLLite SQLStatement.executing is true = error --ошибка цикличного запроса ? (http://www.flasher.ru/forum/showthread.php?t=207982)

SpetZ_Naz 24.05.2014 03:21

SQLLite SQLStatement.executing is true = error --ошибка цикличного запроса ?
 
Здравствуйте, уважаемые форумчане!

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

Конвертирую данные из XML (там 200 записей по 96 в каждой) в локальную базу данных, созданную стандартными средствами AS3. При создании базы данных проблем не было: с помощью цикла сформировал названия 96 столбцов и собрал их в команду создания таблицы в базе данных.

Дальше пытаюсь с помощью цикла добавлять все последующие записи из XML в созданную базу данных:

Код AS3:

protected function onLoadXMLCompleteHandlerSQL(event:Event):void  // ДОБАВЛЕНИЕ ДАННЫХ В БАЗУ
                {
                        _urlLoaderSQL.removeEventListener(Event.COMPLETE, onLoadXMLCompleteHandlerSQL);
 
                        xml = new XML(event.target.data);
                        var stringSQL:String = '';
                        var stringSQLValues:String = '';
                        var stringSpace:String = ', ';
                        var tempSQLArray:Array = [];
                        var int:uint = 0;
 
                        for each (var element:XML in xml.elements())
                        {
                        int2 ++;
                                if (element.name() == "Item")
                                {
                                        for(var i:uint = 0; i<element.elements().length()-1; i++)
                                        {
                                                if (i == element.elements().length()-2)
                                                {
                                                        stringSpace = '';
                                                }
 
                                                stringSQL +=  element.elements()[i].name().toString()  + stringSpace;
                                                stringSQLValues += '@' + element.elements()[i].name().toString() + stringSpace;
 
                                                tempSQLArray.push(['@' + element.elements()[i].name().toString(), element.elements()[i].toString(), element.elements()[i].@_name.toString()]); // параметр
                                        }
                                        sqlConnection.begin();
 
                                        sqlStatement = new SQLStatement();
                                        sqlStatement.sqlConnection = sqlConnection;
                                        sqlStatement.addEventListener(SQLEvent.RESULT, onSQLResultHandler);
                                        sqlStatement.addEventListener(SQLErrorEvent.ERROR, onSQLResultErrorHandler);
 
 
                                        sqlStatement.text = 'INSERT INTO table_of_content(' + stringSQL + ') VALUES(' + stringSQLValues + ')';
 
                                        sqlConnection.addEventListener(SQLEvent.BEGIN, onBeginCommitHandler);
                                        for (var j:uint = 0; j < tempSQLArray.length; j++)
                                        {
                                                sqlStatement.parameters[tempSQLArray[j][0]] = tempSQLArray[j][1];
                                        }
                                        sqlConnection.commit();
 
                                        tempSQLArray = [];
                                        stringSQL = '';
                                        stringSQLValues = '';
                                }
                        }
                }
 
protected function onBeginCommitHandler(event:SQLEvent):void
                {
                        sqlStatement.execute();
                }
 
protected function onSQLResultHandler(event:SQLEvent):void
                {
                        trace('строка добавлена успешно');
                }
 
protected function onSQLResultErrorHandler(event:SQLErrorEvent):void
                {
                        trace('ошибка);
                }

Так вот, когда программа доходит до sqlStatement.execute() начинаются проблемы:

Цитата:

Error #3106: Property cannot be changed while SQLStatement.executing is true.
Смысл ошибки я понимаю - нельзя выполнить следующий запрос не завершив предыдущий, тоесть цикл слишком быстро формирует запрос...

По одной записи отдельно добавляет, т.е. если тупо прогнать клавишей вышеописанный код, то записи формируются успешно, но как-то 200 раз клацать по кнопке... да и в будущем будет необходимость циклом запросы формировать...

Как обойти данную ошибку и применять циклы для формирования запросов? Кто сталкивался прошу помочь..



.

КорДум 24.05.2014 12:18

Сформируйте сначала массив со строками запросами, затем пустите один на обработку, дожидаясь SQLEvent.RESULT. Дождались — запустили следующий. И так далее. У Вас ход мыслей верный, нужно только чуть переписать логику.

SpetZ_Naz 27.05.2014 00:57

Сделал так как Вы посоветовали, все заработало. Спасибо :)


Часовой пояс GMT +4, время: 17:36.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.