apache flex - SQLStatement.execute ()

Translate

J'ai écrit un script de génération de base de données dansSQLet je veux l'exécuter dans monAdobe AIRapplication:

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

J'exécute cela dans Adobe AIR en utilisant les méthodes suivantes:

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

Aucune erreur n'est générée, mais seulementtRoleexiste. Il semble qu'il ne regarde que la première requête (jusqu'au point-virgule - si je le supprime, la requête échoue). Existe-t-il un moyen d'appeler plusieurs requêtes dans une seule instruction?

This question and all comments follow the "Attribution Required."

Toutes les réponses

Translate

J'ai fini par utiliser ça. C'est une sorte de hack, mais ça marche plutôt bien.

La seule chose est que vous devez être très prudent avec vos points-virgules. : RÉ

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

leSQLiteL'API a une fonction appelée quelque chose commesqlite_preparequi prenduneet le prépare pour l'exécution, en analysant essentiellement le SQL et en le stockant en mémoire. Cela signifie que le SQL ne doit être envoyé qu'une seule fois au moteur de base de données même si l'instruction est exécutée plusieurs fois.

Quoi qu'il en soit, une instruction est une seule requête SQL, ce n'est que la règle. L'API AIR SQL n'autorise pas l'envoi de SQL brut à SQLite, uniquement des instructions uniques, et la raison en est, probablement, qu'AIR utilise lesqlite_preparefonction quand il parle à SQLite.

La source
Translate

Que diriez-vous de rendre votre délimiteur quelque chose d'un peu plus complexe comme "; \ n" qui n'apparaîtrait pas si souvent. Vous devez juste vous assurer lors de la création du fichier que vous avez un retour de ligne ou deux. Je finis par mettre deux "\ n \ n" dans la création de mes fichiers ce qui fonctionne bien.

La source