SQLStatement.execute () - plusieurs requêtes dans une instruction

J'ai écrit un script de génération de base de données dans SQL et je veux l'exécuter dans mon Application 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
);
...

Je l'exécute 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, cependant seul tRole existe. Il semble qu'il ne regarde que la première requête (jusqu'au point-virgule- si je l'enlève, la requête échoue). Existe-t-il un moyen d'appeler plusieurs requêtes dans une instruction?

0
ajouté édité
Vues: 15

3 Réponses

J'ai fini par utiliser ça. C'est une sorte de bidouille, 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());
}
0
ajouté
Je me suis rendu compte à quel point cela échouerait si un point-virgule apparaissait dans un champ varchar.
ajouté l'auteur Shawn, source

L'API SQLite a une fonction appelée sqlite_prepare qui prend > une instruction et la prépare à l'exécution, essentiellement en analysant le SQL et en le stockant en mémoire. Cela signifie que le SQL doit uniquement être envoyé une 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, c'est juste la règle. L'API AIR SQL n'autorise pas l'envoi de SQL brut vers SQLite, mais uniquement des instructions simples, et la raison est probablement que AIR utilise la fonction sqlite_prepare lorsqu'il parle à SQLite.

0
ajouté

Que diriez-vous de faire de 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 ligne ou deux là-dedans. Je finis par mettre deux "\ n \ n" dans la création de mes fichiers qui fonctionne bien.

0
ajouté