在 JavaScript for 循环中调用 SQL
Calling SQL in JavaScript for loop
我正在 JavaScript 中编写一组函数,用户可以在其中添加新行程或编辑现有行程。每个行程都可以有 (0-n) 支与该行程关联的枪支。无论哪种方式,保存和编辑功能都调用 rangeSaveGun。当从“save new trip”函数调用时,这个函数(如下)完美执行。新记录被添加到数据库并显示。但是,当从“edit trip”函数调用时,SQL 与 alert(sql) 中显示的 完全相同,但记录永远不会保存到D B。知道为什么吗?在这两种情况下,这只会被调用以将新枪支添加到行程中(而不是编辑现有枪支)。
我的问题:在下面的函数中,当从“编辑”函数而不是“新”功能?无论哪种方式,“sql”文本完全相同(如“警报”中所验证)。我错过了什么? "new" 和 "edit" 函数都是通过单击按钮调用的,只需保存或编辑行程,然后在最后调用此 rangeSaveGun 函数。
我已经在使用标准解决方法来确保关闭。我可以确认所有 3 个变量(tripNum、input2temp 和 input3temp)在所有情况下都显示预期值。所有值都是数字。
function rangeSaveGun(tripNum)
{
var tbl2 = document.getElementById("mytable2");
var rowCount=tbl2.rows.length;
for (var i = 1; i < rowCount; i++) {
var el = document.getElementById("GunVal"+i)
if(el != null)
{
(function(i){
var input2temp = document.getElementById("GunVal"+i).value;
var input3temp = document.getElementById("Rounds"+i).value;
var sql = 'INSERT INTO RangeShot (TripID, GunID, Rounds) VALUES ('+tripNum+', '+input2temp+', '+input3temp+')';
db.transaction(function (tx) {tx.executeSql(sql, [])});
alert(sql);
})(i);
}
}
}
我发现了问题。这实际上是由于我调用了一个仍然是 运行 的 INSERT 语句,而另一个 UPDATE 语句是 运行。 DB 被第一个写语句锁定,因此第二个写语句从未执行过。我不得不重新编写我的 "update" 函数来以不同的顺序调用项目。
我最终更改的另一件事是将按钮类型从 "submit" 更改为 "button"。
function rangeUpdateRecord()
{
db.transaction(function (tx) {
var input1temp = document.getElementById("Name").value;
var input2temp = document.getElementById("Address").value;
var input3temp = document.getElementById("Lat").value;
var input4temp = document.getElementById("Lng").value;
var input5temp = document.getElementById("Duration").value;
var input6temp = document.getElementById("Date2").value;
var input7temp = document.getElementById("StartTime").value;
var input8temp = document.getElementById("Notes").value;
var idupdate = $("#id").val();
var tbl2 = document.getElementById("mytable2");
var rowCount=tbl2.rows.length;
for (var i = 1; i < rowCount; i++) {
var el = document.getElementById("GunVal"+i);
if(el != null)
{
(function(i){
var input2temp = document.getElementById("GunVal"+i).value;
var input3temp = document.getElementById("Rounds"+i).value;
var sql = 'INSERT INTO RangeShot (TripID, GunID, Rounds) VALUES ('+idupdate+', '+input2temp+', '+input3temp+');';
db.transaction(function (tx) {tx.executeSql(sql)});
//alert(sql);
})(i);
}
}
db.transaction(function (tx) {
tx.executeSql('UPDATE RangeTrip SET Name = ?, Address = ?, Lat = ?, Lng = ?, Duration = ?, Date2 = ?, StartTime = ?, Notes = ? WHERE id=?', [input1temp, input2temp, input3temp, input4temp, input5temp, input6temp, input7temp, input8temp, Number(idupdate)],rangeLoadAndReset(),onError);
});
});
}
我正在 JavaScript 中编写一组函数,用户可以在其中添加新行程或编辑现有行程。每个行程都可以有 (0-n) 支与该行程关联的枪支。无论哪种方式,保存和编辑功能都调用 rangeSaveGun。当从“save new trip”函数调用时,这个函数(如下)完美执行。新记录被添加到数据库并显示。但是,当从“edit trip”函数调用时,SQL 与 alert(sql) 中显示的 完全相同,但记录永远不会保存到D B。知道为什么吗?在这两种情况下,这只会被调用以将新枪支添加到行程中(而不是编辑现有枪支)。
我的问题:在下面的函数中,当从“编辑”函数而不是“新”功能?无论哪种方式,“sql”文本完全相同(如“警报”中所验证)。我错过了什么? "new" 和 "edit" 函数都是通过单击按钮调用的,只需保存或编辑行程,然后在最后调用此 rangeSaveGun 函数。
我已经在使用标准解决方法来确保关闭。我可以确认所有 3 个变量(tripNum、input2temp 和 input3temp)在所有情况下都显示预期值。所有值都是数字。
function rangeSaveGun(tripNum)
{
var tbl2 = document.getElementById("mytable2");
var rowCount=tbl2.rows.length;
for (var i = 1; i < rowCount; i++) {
var el = document.getElementById("GunVal"+i)
if(el != null)
{
(function(i){
var input2temp = document.getElementById("GunVal"+i).value;
var input3temp = document.getElementById("Rounds"+i).value;
var sql = 'INSERT INTO RangeShot (TripID, GunID, Rounds) VALUES ('+tripNum+', '+input2temp+', '+input3temp+')';
db.transaction(function (tx) {tx.executeSql(sql, [])});
alert(sql);
})(i);
}
}
}
我发现了问题。这实际上是由于我调用了一个仍然是 运行 的 INSERT 语句,而另一个 UPDATE 语句是 运行。 DB 被第一个写语句锁定,因此第二个写语句从未执行过。我不得不重新编写我的 "update" 函数来以不同的顺序调用项目。
我最终更改的另一件事是将按钮类型从 "submit" 更改为 "button"。
function rangeUpdateRecord()
{
db.transaction(function (tx) {
var input1temp = document.getElementById("Name").value;
var input2temp = document.getElementById("Address").value;
var input3temp = document.getElementById("Lat").value;
var input4temp = document.getElementById("Lng").value;
var input5temp = document.getElementById("Duration").value;
var input6temp = document.getElementById("Date2").value;
var input7temp = document.getElementById("StartTime").value;
var input8temp = document.getElementById("Notes").value;
var idupdate = $("#id").val();
var tbl2 = document.getElementById("mytable2");
var rowCount=tbl2.rows.length;
for (var i = 1; i < rowCount; i++) {
var el = document.getElementById("GunVal"+i);
if(el != null)
{
(function(i){
var input2temp = document.getElementById("GunVal"+i).value;
var input3temp = document.getElementById("Rounds"+i).value;
var sql = 'INSERT INTO RangeShot (TripID, GunID, Rounds) VALUES ('+idupdate+', '+input2temp+', '+input3temp+');';
db.transaction(function (tx) {tx.executeSql(sql)});
//alert(sql);
})(i);
}
}
db.transaction(function (tx) {
tx.executeSql('UPDATE RangeTrip SET Name = ?, Address = ?, Lat = ?, Lng = ?, Duration = ?, Date2 = ?, StartTime = ?, Notes = ? WHERE id=?', [input1temp, input2temp, input3temp, input4temp, input5temp, input6temp, input7temp, input8temp, Number(idupdate)],rangeLoadAndReset(),onError);
});
});
}