SQLStatement.execute () - flere spørringer i en uttalelse

stemmer
39

Jeg har skrevet en database generasjon skript i SQL og ønsker å gjennomføre det i mitt Adobe AIR -programmet:

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

Jeg gjennomføre dette i Adobe AIR på følgende måter:

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

Ingen feil genereres, men bare tRoleeksisterer. Det virker som det bare ser på det første spørsmålet (opp til semicolon- hvis jeg fjerner det, mislykkes spørring). Er det en måte å ringe flere spørsmål i en uttalelse?

Publisert på 01/08/2008 klokken 13:57
kilden bruker
På andre språk...                            


3 svar

stemmer
20

Jeg endte opp med dette. Det er en slags hack, men det faktisk fungerer ganske bra.

Det eneste er at du må være veldig forsiktig med semikolon. : 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());
}
Svarte 01/08/2008 kl. 16:09
kilden bruker

stemmer
9

Den SQLite API har en funksjon som heter noe sånt sqlite_preparesom tar en uttalelse, og forbereder den for gjennomføring, i hovedsak analyse av SQL og lagrer det i minnet. Dette betyr at SQL bare må sendes en gang til databasen motoren selv om setningen blir utført mange ganger.

Uansett, er en uttalelse en enkelt SQL-spørring, det er bare regelen. AIR SQL API tillater ikke å sende rå SQL til SQLite, bare enkle utsagn, og grunnen er, sannsynligvis, bruker at AIR den sqlite_preparefunksjonen når den snakker til SQLite.

Svarte 13/08/2008 kl. 16:09
kilden bruker

stemmer
3

Hva med å lage din skille noe litt mer komplisert som "; \ n" som ikke ville dukke opp så ofte. Du må bare sørge for når du oppretter filen du har en linje retur eller to der inne. Jeg ender opp med å sette to "\ n \ n" inn i etableringen av filene mine som fungerer godt.

Svarte 22/09/2010 kl. 15:37
kilden bruker

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