2008-08-01 9 views
34

Napisałem skrypt generowania bazy danych w SQL i chcą wykonać go w moim Adobe AIR aplikacji:SQLStatement.execute() - wiele zapytań w jednej instrukcji

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

I wykonanie tego w środowisku Adobe AIR przy użyciu następujących metody:

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

Bez błędów generowane są jednak tylko tRole istnieje. Wygląda na to, że patrzy tylko na pierwszą kwerendę (aż do średnika - jeśli ją usunę, zapytanie się nie powiedzie). Czy istnieje sposób na wywołanie wielu zapytań w jednym wyciągu?

Odpowiedz

19

I zakończyło się przy użyciu tego. To rodzaj hackowania, ale w rzeczywistości działa całkiem nieźle. Jedyne, co musisz zrobić, to zachować ostrożność przy średnikach. : 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

Właśnie zdałem sobie sprawę, jak bardzo to się nie powiedzie, jeśli w polu varchar pojawi się średnik. – Shawn

9

SQLite API posiada funkcję o nazwie coś sqlite_prepare który trwa jeden oświadczenie i przygotowuje ją do realizacji, zasadniczo parsowania SQL i przechowywanie go w pamięci. Oznacza to, że SQL musi zostać wysłany tylko raz do silnika bazy danych, nawet jeśli instrukcja jest wykonywana wiele razy.

W każdym razie instrukcja jest pojedynczym zapytaniem SQL, to tylko reguła. Interfejs AIR SQL API nie zezwala na wysyłanie nieprzetworzonego SQL do SQLite, tylko pojedyncze instrukcje, a powodem może być, że AIR używa funkcji sqlite_prepare podczas rozmowy z SQLite.

3

Co zrobić, aby rozgraniczenie było nieco bardziej skomplikowane, jak "; \ n", które nie pojawiałoby się tak często. Musisz tylko upewnić się, że podczas tworzenia pliku masz zwrot liniowy lub dwa tam. Kończę wstawianie dwóch "\ n \ n" do tworzenia moich plików, które działają dobrze.