Vra

Ek het geskryf om'n databasis generasie script in SQL en wil dit uit te voer in my Adobe AIR aansoek:

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

Ek voer dit in Adobe LUG met behulp van die volgende metodes:

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 foute gegenereer word, maar slegs tRole bestaan.Dit blyk dat dit net lyk op die eerste navraag (tot die kommapunt - as ek dit verwyder, die navraag nie).Is daar'n manier om te noem verskeie navrae in een stelling?

Was dit nuttig?

Oplossing

Ek gelikwideer is met behulp van hierdie.Dit is'n soort van'n hack, maar dit werk eintlik baie goed.

Die enigste ding is wat jy het baie versigtig te wees met jou kommapunte.: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());
}

Ander wenke

Die SQLite API het'n funksie genoem iets soos sqlite_prepare wat neem een verklaring en berei dit vir die uitvoering, in wese die ontleding van die SQL en stoor dit in die geheue.Dit beteken dat die SQL net het om te gestuur word sodra die databasis-enjin, selfs al is die verklaring uitgevoer word baie keer.

In elk geval, 'n verklaring is'n enkele SQL navraag, dit is net die reël.Die LUG SQL API nie toelaat dat die stuur van rou SQL te SQLite, slegs enkele verklarings, en die rede is, waarskynlik, dat die LUG gebruik maak van die sqlite_prepare funksie wanneer dit praat om te SQLite.

Wat oor die maak van jou delimiter iets wat'n bietjie meer kompleks soos "; ", wat sou nie wys alles wat dikwels.Jy moet net om te verseker dat wanneer die skep van die lêer wat jy het'n lyn terugkeer of twee daar.Ek beland om twee " " in die skepping van my lêers wat goed werk.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top