SQLStatement.execute () - meerdere query's in een verklaring

stemmen
35

Ik heb een database generatie script geschreven SQL en willen het uit te voeren in mijn Adobe AIR applicatie:

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

Ik voer deze in Adobe AIR op de volgende manieren:

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

Geen fouten worden gegenereerd, maar slechts tRolebestaat. Het lijkt erop dat het alleen wordt gekeken naar de eerste vraag (tot aan de semicolon- als ik deze verwijderen, mislukt de query). Is er een manier om meerdere query's te bellen in een verklaring?

De vraag is gesteld op 01/08/2008 om 14:57
bron van user
In andere talen...                            


3 antwoorden

stemmen
19

Uiteindelijk heb ik met behulp van deze. Het is een soort van een hack, maar het werkt eigenlijk vrij goed. Het enige wat is dat je moet heel voorzichtig zijn met uw puntkomma's te zijn. : 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());
}
antwoordde op 01/08/2008 om 17:09
bron van user

stemmen
9

De SQLite API heeft een functie genaamd zoiets als sqlite_preparedie duurt een statement en bereidt het voor de uitvoering, in wezen het ontleden van de SQL en op te slaan in het geheugen. Dit betekent dat de SQL heeft slechts eenmaal te worden verzonden naar de database-engine, hoewel de verklaring is vele malen uitgevoerd.

Hoe dan ook, een verklaring is één SQL-query, dat is gewoon de regel. De AIR SQL-API staat niet toe dat het verzenden van ruwe SQL naar SQLite, slechts enkele verklaringen, en de reden is, waarschijnlijk, dat AIR maakt gebruik van de sqlite_preparefunctie wanneer deze praat met SQLite.

antwoordde op 13/08/2008 om 17:09
bron van user

stemmen
3

Hoe zit het met het maken van uw delimiter iets meer complex als "; \ n" die niet vaak zou opdagen dat alles. Je hoeft alleen maar om ervoor te zorgen bij het maken van het bestand dat u een lijn terugkeer of twee in. Uiteindelijk steek ik twee "\ n \ n" in de creatie van mijn dossiers die goed werkt.

antwoordde op 22/09/2010 om 16:37
bron van user

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