Frage

Ich habe eine schriftliche Datenbank-generation-Skript in SQL und wollt in meine Adobe AIR Anwendung:

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 diese in Adobe AIR mithilfe einer der folgenden Methoden:

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 keine Fehler generiert, jedoch nur tRole vorhanden ist.Es scheint, dass es sieht nur auf den ersten Abfrage (bis auf das Semikolon - wenn ich es entfernen, schlägt die Abfrage fehl).Gibt es eine Möglichkeit zu nennen, mehrere Abfragen in ein statement?

War es hilfreich?

Lösung

Ich Wunde, mit dieser.Es ist eine Art hack, aber es funktioniert tatsächlich ziemlich gut.

Die einzige Sache ist, Sie müssen sehr vorsichtig sein mit Ihrem Semikolons.: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());
}

Andere Tipps

Die SQLite API hat eine Funktion namens so etwas wie sqlite_prepare das dauert eine Anweisung und bereitet es für die Durchführung, im wesentlichen das Parsen von SQL und speichern Sie es im Speicher.Dies bedeutet, dass die SQL nur einmal gesendet werden, um die Datenbank-engine selbst wenn die Anweisung ausgeführt wird, viele Male.

Jedenfalls gibt es eine Anweisung ist eine einzelne SQL-Abfrage, das ist nur die Regel.Die AIR-SQL-API nicht erlauben senden von raw-SQL-SQLite, nur einzelne Aussagen, und der Grund ist wahrscheinlich, dass die LUFT verwendet, die sqlite_prepare Funktion, wenn er redet zu SQLite.

Was macht Ihr Trennzeichen etwas ein wenig mehr komplexe wie "; " die nicht zeigen, bis alle dass Häufig.Sie müssen nur sicherstellen, wenn Sie die Datei erstellen Sie eine Zeile zurückgeben oder zwei dort.I end up putting zwei " " in die Erstellung meiner Dateien, die gut funktioniert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top