2008-08-01 7 views
34

ich eine Datenbank Generation Skript in SQL geschrieben haben und wollen, dass es in meiner Adobe AIR Anwendung auszuführen:SQLStatement.execute() - mehr Abfragen in einer Anweisung

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 ausführen diese in Adobe AIR den folgenden using 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()); 
    } 
} 

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

Antwort

19

Ich habe damit aufgewickelt. Es ist eine Art Hack, aber es funktioniert tatsächlich ziemlich gut. Die einzige Sache ist, dass Sie mit Ihrem Semikolon 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()); 
} 
+0

Wurde gerade erkannt, wie schlimm das ausfallen würde, wenn ein Semikolon in einem Varchar-Feld erscheint. – Shawn

9

Die SQLite API hat eine Funktion aufgerufen, die so etwas wie sqlite_prepareein Anweisung dauert und bereitet sie für die Ausführung, im wesentlichen der SQL-Parsing und sie im Speicher zu speichern. Dies bedeutet, dass das SQL nur einmal an die Datenbank-Engine gesendet werden muss, obwohl die Anweisung viele Male ausgeführt wird.

Wie auch immer, eine Anweisung ist eine einzige SQL-Abfrage, das ist nur die Regel. Die AIR SQL API erlaubt das Senden von Raw-SQL zu SQLite nicht, nur einzelne Anweisungen, und der Grund ist wahrscheinlich, dass AIR die sqlite_prepare-Funktion verwendet, wenn es mit SQLite spricht.

3

Wie wäre es, wenn Sie Ihr Delimiter-Element etwas komplexer gestalten würden, etwa "; \ n", das nicht so oft angezeigt wird? Sie müssen nur sicherstellen, wenn Sie die Datei erstellen, haben Sie eine Zeile zurück oder zwei da drin. Ich schließe zwei "\ n \ n" in die Erstellung meiner Dateien ein, was gut funktioniert.

Verwandte Themen