2011-02-01 169 views
0

在我的HTML5中,我有一個for循環,它調用一個函數來插入數據庫。我需要這個函數在單個事務中。HTML5,SQLite交易問題

function Ins(id){ 
db.transaction(function(tx){ 
tx.executeSql('insert into Product(id) values(?);', [iName], function() {}, function() { }); 
}); 
} 

for循環

db.transaction(function(tx){tx.executeSql("BEGIN",[]);}); 
    for (intCountLine=1;intCountLine<=1000;intCountLine++) 
    { 
    Ins(intCount); 
    } 
    db.transaction(function(tx){tx.executeSql("COMMIT",[]);}); 

你可以看到,我有交易開始&提交,但我相信,當它調用INS功能,它會打開一個新的事務,並關閉它,每次它被稱爲。我如何確保不會發生。

GOOGLE了它,但無法找到它......在這裏把我扔一些輕....

回答

1

可能這會作品。使用insert select union all而不是創建1000個插入語句。但是這一次只能插入500行。這裏是我工作的代碼,在谷歌瀏覽器上做測試,我相信它的工作原理。

<!DOCTYPE HTML> 
<html> 
<head> 
<script type="text/javascript"> 
var db = openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024); 
var msg; 
var j=1; 
var i=1; 
var quer=""; 
db.transaction(function(tx){tx.executeSql("CREATE TABLE IF NOT EXISTS LOGS (ID INTEGER PRIMARY KEY ASC, todo TEXT)",[]);}); 
db.transaction(function(tx){tx.executeSql("delete from logs",[]);}); 
txquer(); 
showMsg(); 
function txquer() 
{ 
    quer="insert into logs "; 
for(i=j;i<=j+498;i++) 
{ 
    quer+=" select "+i+",'test' union all"; 
    } 
    quer+=" select "+i+",'test' ; "; 
    j=i+1; 
    db.transaction(
    function(tx){ 
     tx.executeSql(quer,[]);  
    } 
    ); 

} 

function showMsg(){ 
db.transaction(function (tx) { 
    tx.executeSql('SELECT count(*) todo FROM LOGS', [], function (tx, results) { 
    var len = results.rows.item(0).todo; 
    msg = "<p>Found rows: " + len + "</p>"; 
    document.querySelector('#status').innerHTML += msg; 
}, null); 
}); 

}