Pregunta

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

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, pero sólo tRole existe.Parece que solo mira la primera consulta (hasta el punto y coma; si la elimino, la consulta falla).¿Hay alguna manera de realizar varias consultas en una sola declaración?

¿Fue útil?

Solución

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

Lo único es que debes tener mucho cuidado con el punto y coma.: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());
}

Otros consejos

El SQLite API tiene una función llamada algo así como sqlite_prepare el cual toma uno 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 declaración se ejecute muchas veces.

De todos modos, una declaración es una única consulta SQL, esa es solo la regla.La API de AIR SQL no permite enviar SQL sin formato a SQLite, solo declaraciones individuales, y la razón es, probablemente, que AIR usa la sqlite_prepare funciona cuando habla con SQLite.

¿Qué tal hacer que su delimitador sea un poco más complejo como "; " que no aparecería con tanta frecuencia?Solo debe asegurarse de que al crear el archivo tenga uno o dos retornos de línea allí.Termino poniendo dos " " en la creación de mis archivos, lo cual funciona bien.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top