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

votos
35

Escribí 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 usando 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 tRoleexiste. 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?

Publicado el 01/08/2008 a las 14:57
fuente por usuario
En otros idiomas...                            


3 respuestas

votos
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());
}
Respondida el 01/08/2008 a las 17:09
fuente por usuario

votos
9

La API de SQLite tiene una función llamada algo así, sqlite_prepareque toma una declaración y la prepara para su ejecución, esencialmente analizando el SQL y almacenándolo 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 procesar a SQLite, solo declaraciones simples, y es probable que AIR use la sqlite_preparefunción cuando habla con SQLite.

Respondida el 13/08/2008 a las 17:09
fuente por usuario

votos
3

¿Qué hay de hacer su delimitador de algo un poco más complejo como "; \ n", que no aparecería muy a menudo. Sólo hay que garantizar al crear el archivo que tiene un retorno de línea o dos allí. Me acaban de poner dos "\ n \ n" en la creación de los archivos que funciona bien.

Respondida el 22/09/2010 a las 16:37
fuente por usuario

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