2008-08-01 13 views
34

He escrito un script de generación de base de datos en SQL y quieren ejecutarlo en mi Adobe AIR aplicación:SQLStatement.execute() - varias consultas en una sola declaración

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

ejecuto esto en Adobe AIR utilizando la siguiente métodos:

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

No se generan errores, sin embargo, solo tRole existe. Parece que solo mira la primera consulta (hasta el punto y coma; si la elimino, la consulta falla). ¿Hay alguna manera de llamar a múltiples consultas en una declaración?

Respuesta

19

Terminé usando esto. Es una especie de truco, pero en realidad funciona bastante bien. Lo único es que tienes que tener mucho cuidado con tus puntos y comas. : 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

Acabo de darme cuenta de cuánto fallaría si apareciera un punto y coma en un campo varchar. – Shawn

9

La API SQLite tiene una función llamada algo así como que tiene sqlite_prepare una declaración y lo prepara para la ejecución, el análisis esencialmente el SQL y almacenarlo en la memoria. Esto significa que el SQL solo debe enviarse una vez al motor de la base de datos aunque la instrucción se ejecute muchas veces.

De todos modos, una declaración es una sola consulta SQL, esa es solo la regla. La API de AIR SQL no permite enviar SQL sin formato a SQLite, solo declaraciones simples, y es probable que AIR use la función sqlite_prepare cuando habla con SQLite.

3

¿Qué hay de hacer su delimitador algo un poco más complejo como "; \ n", que no aparece con tanta frecuencia. Solo debe asegurarse de que al crear el archivo tenga una línea devuelta o dos allí. Termino poniendo dos "\ n \ n" en la creación de mis archivos que funciona bien.

Cuestiones relacionadas