SQLStatement.execute () - múltiples consultas en una instrucción


He escrito un script de generación de base de datos en SQL y quiero ejecutarlo en mi aplicación Adobe AIR :

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 los siguientes 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 existe tRole. Parece que solo mira la primera consulta (hasta el punto y coma - si lo elimino, la consulta falla). ¿Hay alguna manera de llamar a múltiples consultas en una instrucción?

Author: buræquete, 2008-08-01

3 answers

Terminé usando esto. Es una especie de truco, pero en realidad funciona bastante bien.

Lo único es que hay que tener mucho cuidado con los 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());
}
 20
Author: Shawn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-27 01:12:05

La API SQLite tiene una función llamada algo así como sqlite_prepare que toma una instrucción y la prepara para la ejecución, esencialmente analizando el SQL y almacenándolo en memoria. Esto significa que el SQL solo tiene que ser enviado una vez al motor de la base de datos aunque la sentencia se ejecute muchas veces.

De todos modos, una instrucción es una sola consulta SQL, eso es solo la regla. La API de AIR SQL no permite enviar SQL sin procesar a SQLite, solo instrucciones individuales, y la razón es, probablemente, ese AIRE usa la función sqlite_prepare cuando habla con SQLite.

 9
Author: Theo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-09 17:18:53

¿Qué hay de hacer su delimitador algo un poco más complejo como ";\n" que no se mostraría tan a menudo? Solo tiene que asegurarse de que al crear el archivo tiene una línea de retorno o dos en allí. Termino poniendo dos "\n\n " en la creación de mis archivos que funciona bien.

 3
Author: stats,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-17 06:22:06