apache flex - SQLStatement.execute ()

Translate

Ich habe ein Skript zur Datenbankgenerierung in geschriebenSQLund möchte es in meinem ausführenAdobe AIRAnwendung:

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
);
...

Ich führe dies in Adobe AIR mit den folgenden Methoden aus:

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());
    }
}

Es werden jedoch nur Fehler generierttRoleexistiert. Es scheint, dass es nur die erste Abfrage betrachtet (bis zum Semikolon - wenn ich es entferne, schlägt die Abfrage fehl). Gibt es eine Möglichkeit, mehrere Abfragen in einer Anweisung aufzurufen?

This question and all comments follow the "Attribution Required."

Alle Antworten

Translate

Ich habe das benutzt. Es ist eine Art Hack, aber es funktioniert tatsächlich ziemlich gut.

Das einzige ist, dass Sie mit Ihren Semikolons sehr vorsichtig sein müssen. : 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());
}
Quelle
Translate

DasSQLiteAPI hat eine Funktion namens so etwas wiesqlite_preparewas brauchteinerAnweisung und bereitet sie für die Ausführung vor, analysiert im Wesentlichen die SQL und speichert sie im Speicher. Dies bedeutet, dass SQL nur einmal an das Datenbankmodul gesendet werden muss, obwohl die Anweisung viele Male ausgeführt wird.

Wie auch immer, eine Anweisung ist eine einzelne SQL-Abfrage, das ist nur die Regel. Die AIR SQL-API erlaubt nicht das Senden von unformatiertem SQL an SQLite, sondern nur einzelne Anweisungen, und der Grund ist wahrscheinlich, dass AIR das verwendetsqlite_prepareFunktion, wenn es mit SQLite spricht.

Quelle
Translate

Wie wäre es, wenn Sie Ihr Trennzeichen etwas komplexer machen, wie "; \ n", das nicht allzu oft auftaucht. Sie müssen nur sicherstellen, dass beim Erstellen der Datei ein oder zwei Zeilenrückgaben vorhanden sind. Am Ende setze ich zwei "\ n \ n" in die Erstellung meiner Dateien ein, was gut funktioniert.

Quelle