SQLStatement.execute () - несколько запросов в одном операторе

Я написал сценарий генерации базы данных в SQL и хочу выполнить его в моем приложении Adobe AIR:

Create Table tRole (
    roleID integer Primary Key
    ,roleName varchar(40)
);
Create Table tFile (
    fileID integer Primary Key
    ,fileName varchar(50)
    ,fileDescription varchar(500)
    ,thumbnailID integer
    ,fileFormatID integer
    ,categoryID integer
    ,isFavorite boolean
    ,dateAdded date
    ,globalAccessCount integer
    ,lastAccessTime date
    ,downloadComplete boolean
    ,isNew boolean
    ,isSpotlight boolean
    ,duration varchar(30)
);
Create Table tCategory (
    categoryID integer Primary Key
    ,categoryName varchar(50)
    ,parent_categoryID integer
);
...

Я выполняю это в Adobe AIR, используя следующие методы:

public static function RunSqlFromFile(fileName:String):void {
    var file:File = File.applicationDirectory.resolvePath(fileName);
    var stream:FileStream = new FileStream();
    stream.open(file, FileMode.READ)
    var strSql:String = stream.readUTFBytes(stream.bytesAvailable);
    NonQuery(strSql);
}

public static function NonQuery(strSQL:String):void {
    var sqlConnection:SQLConnection = new SQLConnection();
    sqlConnection.open(File.applicationStorageDirectory.resolvePath(DBPATH));
    var sqlStatement:SQLStatement = new SQLStatement();
    sqlStatement.text = strSQL;
    sqlStatement.sqlConnection = sqlConnection;
    try {
        sqlStatement.execute();
    } catch (error:SQLError) {
        Alert.show(error.toString());
    }
}

Ошибок не возникает, однако существует только tRole. Кажется, что он смотрит только на первый запрос (с точностью до точки с запятой - если я уберу его, запрос не будет выполнен). Есть ли способ вызвать несколько запросов в одном операторе?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
50
0
6 054
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Я воспользовался этим. Это своего рода взлом, но на самом деле он работает довольно хорошо.

Единственное, вы должны быть очень осторожны с точками с запятой. : D

var strSql:String = stream.readUTFBytes(stream.bytesAvailable);      
var i:Number = 0;
var strSqlSplit:Array = strSql.split(";");
for (i = 0; i < strSqlSplit.length; i++){
    NonQuery(strSqlSplit[i].toString());
}

Только что понял, как плохо это будет, если в поле varchar появится точка с запятой.

Shawn 03.11.2008 17:28

В API SQLite есть функция, называемая чем-то вроде sqlite_prepare, которая принимает оператор один и подготавливает его к выполнению, по сути анализируя SQL и сохраняя его в памяти. Это означает, что SQL-запрос должен быть отправлен в ядро ​​базы данных только один раз, даже если оператор выполняется много раз.

В любом случае, оператор - это один SQL-запрос, это просто правило. API AIR SQL не позволяет отправлять необработанный SQL в SQLite, только отдельные операторы, и причина, вероятно, в том, что AIR использует функцию sqlite_prepare при взаимодействии с SQLite.

Как насчет того, чтобы сделать ваш разделитель чем-то более сложным, например "; \ n", который не будет появляться так часто. Вам просто нужно убедиться, что при создании файла у вас есть возврат строки или две. В итоге я добавляю два "\ n \ n" при создании моих файлов, что хорошо работает.

Другие вопросы по теме