SQLStatement.execute () - Bir açıklamada çoklu sorgular

oy
35

Ben bir veritabanı oluşturma komut yazdım SQL ve benim bunu çalıştırmak isteyen Adobe AIR uygulaması:

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

Aşağıdaki yöntemleri kullanarak Adobe AIR uygulamasında bu yürütün:

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

Herhangi bir hata ancak sadece oluşturulur tRolebulunmaktadır. O sadece ilk sorguda (bunu kaldırırsanız, sorgu başarısız olur noktalı virgülle kadar) bakar gibi görünüyor. Bir açıklamada birden fazla sorgu aramak için bir yolu var mı?

Oluştur 01/08/2008 saat 14:57
kaynak kullanıcı
Diğer dillerde...                            


3 cevaplar

oy
19

Bunu kullanarak sarılır. Bu bir hack bir tür, ama aslında oldukça iyi çalışıyor. Tek şey size noktalı virgül ile çok dikkatli olmak zorunda olduğunu. : 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());
}
Cevap 01/08/2008 saat 17:09
kaynak kullanıcı

oy
9

SQLite API gibi bir şey adlı bir işlevi vardır sqlite_preparealdığı bir bildiri ve esasen SQL ayrıştırma ve bellekte depolanması, yürütülmesi için hazırlar. Bu SQL yalnızca deyimi defalarca yürütüldüğünde rağmen veritabanı motoruna bir kez gönderilmek üzere olduğu anlamına gelir.

Neyse, bir açıklama tek bir SQL sorgusu bu sadece kuraldır vardır. HAVA SQL API SQLite yalnızca tek ifadeleri ham SQL gönderilmesine izin vermez, ve nedeni, muhtemelen, o HAVA kullanır sqlite_prepareo SQLite konuştuğunda işlevi.

Cevap 13/08/2008 saat 17:09
kaynak kullanıcı

oy
3

Ne gibi biraz daha karmaşık senin sınırlayıcı bir şey yapma konusunda "; \ n" çoğu zaman tüm bu görünmez olur. Az önce bir satır iade veya orada iki tane dosyayı oluştururken sağlamak zorundayız. Ben iyi çalışıyor benim dosyalarının oluşturulmasını içine iki tane "\ n \ n" koyarak sonunda.

Cevap 22/09/2010 saat 16:37
kaynak kullanıcı

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