2008-08-01 7 views
34

Tôi đã viết một kịch bản thế hệ cơ sở dữ liệu trong SQL và muốn thực hiện nó trong Adobe AIR ứng dụng của tôi:SQLStatement.execute() - nhiều truy vấn trong một tuyên bố

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

tôi thực hiện điều này trong Adobe AIR sử dụng sau phương pháp:

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

Không có lỗi nào được tạo, tuy nhiên chỉ tồn tại tRole. Dường như nó chỉ nhìn vào truy vấn đầu tiên (lên đến dấu chấm phẩy- nếu tôi xóa nó, truy vấn thất bại). Có cách nào để gọi nhiều truy vấn trong một câu lệnh không?

Trả lời

19

Tôi đã sử dụng tính năng này. Nó là một loại hack, nhưng nó thực sự hoạt động khá tốt. Điều duy nhất là bạn phải rất cẩn thận với dấu chấm phẩy của bạn. : 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()); 
} 
+0

Chỉ cần nhận ra điều này sẽ thất bại như thế nào nếu một dấu chấm phẩy xuất hiện trong trường varchar. – Shawn

9

Các SQLite API có một chức năng gọi là cái gì đó như sqlite_prepare mà mất một tuyên bố và chuẩn bị nó để thực hiện, về cơ bản phân tích cú pháp SQL và lưu trữ nó trong bộ nhớ. Điều này có nghĩa rằng SQL chỉ phải được gửi một lần đến cơ sở dữ liệu mặc dù câu lệnh được thi hành nhiều lần.

Dù sao, một câu lệnh là một truy vấn SQL đơn, đó chỉ là quy tắc. API AIR SQL không cho phép gửi SQL thô tới SQLite, chỉ có các câu lệnh đơn và lý do là, AIR có thể sử dụng hàm sqlite_prepare khi nó nói đến SQLite.

3

Điều gì khiến cho dấu phân cách của bạn trở nên phức tạp hơn một chút như "; \ n" sẽ không hiển thị thường xuyên như vậy. Bạn chỉ cần đảm bảo khi tạo tập tin bạn có một dòng trở lại hoặc hai trong đó. Tôi sẽ đưa hai "\ n \ n" vào việc tạo các tệp của tôi hoạt động tốt.