SQLStatement.execute () - mehrere Abfragen in einer Anweisung

stimmen
35

Ich habe eine Datenbank Generation Skript in geschrieben SQL und es in meinem ausführen möchten 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 die folgenden Methoden verwenden:

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 tRoleexistiert. Es scheint , dass es nur bei der ersten Abfrage sieht (bis zum Semikolons , wenn ich es entfernen, wird die Abfrage fehlschlägt). Gibt es eine Möglichkeit , mehrere Abfragen in einer Anweisung zu nennen?

Veröffentlicht am 01/08/2008 um 14:57
quelle vom benutzer
In anderen Sprachen...                            


3 antworten

stimmen
19

Ich zog mit diesem. Es ist eine Art wie ein Hack, aber es funktioniert eigentlich ziemlich gut. Das einzige, was ist, dass Sie mit Ihrem Semikolons sehr vorsichtig sein. : 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());
}
Beantwortet am 01/08/2008 um 17:09
quelle vom benutzer

stimmen
9

Die SQLite API hat eine Funktion namens etwas wie sqlite_preparedem nimmt eine Anweisung und bereitet sie für die Ausführung, im wesentlichen der SQL - Parsing und sie im Speicher zu speichern. Dies bedeutet , dass die SQL nur noch auf den Datenbank - Engine gesendet einmal werden , obwohl die Aussage viele Male ausgeführt wird.

Wie dem auch sei, ist eine Aussage , eine einzelne SQL - Abfrage, das ist nur die Regel. Die AIR - SQL - API erlaubt es nicht roh SQL zu SQLite Senden, nur einzelne Aussagen, und der Grund ist, wahrscheinlich, dass AIR verwendet die sqlite_prepareFunktion , wenn es um SQLite spricht.

Beantwortet am 13/08/2008 um 17:09
quelle vom benutzer

stimmen
3

Was ist mit Ihrem Begrenzer etwas ein wenig komplizierter zu machen wie „; \ n“, die alle oft nicht zeigen würden, dass. Sie müssen nur sicherstellen, wenn die Datei erstellen Sie eine Zeile Rückgabe oder zwei in dort haben. Ich am Ende des Setzen von zwei „\ n \ n“ in die Erstellung meiner Dateien, die gut funktioniert.

Beantwortet am 22/09/2010 um 16:37
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more