2011-02-01 89 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); 
}); 

}