Question

J'ai écrit un script de génération de base de données dans SQL et je veux 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 n'est générée, mais seulement tRole existe.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 ?

Était-ce utile?

La solution

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

La seule chose est que vous devez faire très attention à vos points-virgules.: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());
}

Autres conseils

Le SQLite L'API a une fonction appelée quelque chose comme sqlite_prepare qui prend un et le prépare pour l'exécution, en analysant essentiellement le SQL et en le stockant en mémoire.Cela signifie que le code 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, c'est juste la règle.L'API AIR SQL ne permet pas d'envoyer du SQL brut à SQLite, uniquement des instructions uniques, et la raison est probablement qu'AIR utilise le sqlite_prepare fonction lorsqu'il parle à SQLite.

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top