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

voix
35

J'ai écrit un script de génération de base de données dans SQL et que vous souhaitez l' exécuter dans mon Adobe AIR application:

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 ceci 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 ne sont générés, mais seulement tRoleexiste. Il semble que ce ne regarde que la première requête (jusqu'à des points - virgules si je le supprimer, la requête échoue). Est - il possible d'appeler plusieurs requêtes dans une instruction?

Créé 01/08/2008 à 14:57
source utilisateur
Dans d'autres langues...                            


3 réponses

voix
19

Je me suis retrouvé à l'aide de cela. Il est une sorte de hack, mais cela fonctionne en fait assez 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());
}
Créé 01/08/2008 à 17:09
source utilisateur

voix
9

La SQLite API a une fonction appelée quelque chose comme ce sqlite_preparequi prend une déclaration et il prépare pour l' exécution, l' analyse essentiellement le SQL et le stockage en mémoire. Cela signifie que le SQL ne doit être envoyé une fois au moteur de base de données même si l'instruction est exécutée à plusieurs reprises.

Quoi qu'il en soit, une déclaration est une seule requête SQL, qui est juste la règle. L'API AIR SQL ne permet pas l' envoi de SQL brut à SQLite, seules les déclarations simples, et la raison est, sans doute, que AIR utilise la sqlite_preparefonction quand il parle à SQLite.

Créé 13/08/2008 à 17:09
source utilisateur

voix
3

Qu'en est-il de faire votre delimiter quelque chose d'un peu plus complexe comme « ; \ n », qui ne se présentent pas si souvent que ça. Il suffit d'assurer lors de la création du fichier que vous avez un retour à la ligne ou deux là-dedans. Je finis par mettre deux « \ n \ n » dans la création de mes fichiers qui fonctionne bien.

Créé 22/09/2010 à 16:37
source utilisateur

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