2011-02-23 30 views
2

我想從一組使用(sqlite .dump mydb> file.sql生成的SQL語句填充HTML5 WebSQL數據庫)移動Safari HTML5 WebSQL SQLTransaction拋出SQLError code = 1 message ='不是錯誤',事務失敗

我能夠讀取文件,並執行所有的SQL語句。但是,在事務結束時,事務失敗,出現SQLError(代碼= 1,message ='not an error')。

現在,從我的調查中我看到SQLite'沒有錯誤'是SQLITE_DONE。

那麼爲什麼會產生一個SQLError,爲什麼我的事務處理會回滾?

的relavent的JavaScript片段低於:

database = { 

    /* Transaction Error Callback */ 
    error_callback: function(error) 
    { 
     console.log('Oops. '+error.message+' (Code '+error.code+')'); 
    }, 

    /* Transaction success callback */ 
    success_callback: function() 
    { 
     console.log('apparently a success!'); 
    }, 

    populate_exec_sql: function(tx) 
    {   
     for (var i = 0; i < lines.length; i++) // lines = Global array of SQL statements 
     { 
      var query = lines[i].replace(/\n/g,''); 
      //console.log(query); 
      tx.executeSql(query); 
     } 
    }, 

    populate_db: function(lines) 
    { 
     db.transaction(database.populate_exec_sql, database.error_callback, database.success_callback); 
    } 
} 

回答

4

好的,這是解決方案。

基本上,令人難以置信的描述性和有用的SQLError消息,「不是錯誤」可能是由webkit/Safari處理不當(應該可以忽略)。

如果tx.executeSql(查詢)正在傳遞一個沒有SQL語句的字符串,它會返回一個「沒有錯誤」的SQLError。

在我的情況下,這有時是一個空字符串,有時是一個只包含換行符的字符串\ n。

所以,我填入函數現在看起來是這樣的:由SQLite的產生

populate_exec_sql: function(tx) 
{   
    tx.executeSql('drop table if exists "color"'); 
    tx.executeSql('drop table if exists "combo"'); 
    tx.executeSql('drop table if exists "combo_color"'); 
    for (var i = 0; i < lines.length; i++) 
    { 
     var query = lines[i].replace(/\n/g, '');  // strip newlines 
     query && query.length && tx.executeSql(query); // ignore empty lines 
    } 
} 
+0

謝謝! 「沒有錯誤」是迄今爲止我看到的最有用的錯誤消息之一。 – Riplexus 2013-06-18 18:38:50

0

你看着那些失敗的具體問題? SQLite不支持與完整SQL相同的查詢語法,因此(例如)使用類似UPDATE的語法執行INSERT不起作用。

+0

所有的SQL查詢(使用使用.dump命令)。我猜我假設移動Safari中的SQLite支持與SQLite3相同的語法? – Rich 2011-02-23 01:12:03

+0

我剛剛嘗試了一個SQL語句文件,直接從Apple代碼示例中重試,並且該事務仍然拋出「沒有錯誤」的SQLError。所以它看起來不像是SQL文件的內容那就是問題。它一定是別的東西。 – Rich 2011-02-23 01:46:25

相關問題