将数据插入Web SQL数据库的Javascript代码有什么问题?
我正在尝试创建一个简单的页面,它接受一个二进制文件,并将值插入到Web SQL数据库中。 这是我用来插入数据的函数:将数据插入Web SQL数据库的Javascript代码有什么问题?,javascript,html,web-sql,Javascript,Html,Web Sql,我正在尝试创建一个简单的页面,它接受一个二进制文件,并将值插入到Web SQL数据库中。 这是我用来插入数据的函数: function bin2dbfunc() { var result, n, aByte, byteStr; var i=0; var sql = new Array(); result = fr.result; //Input file for (n = 0; n < result.length; ++n) {
function bin2dbfunc()
{
var result, n, aByte, byteStr;
var i=0;
var sql = new Array();
result = fr.result; //Input file
for (n = 0; n < result.length; ++n)
{
aByte = result.charCodeAt(n);
byteStr = aByte.toString(16);
if (byteStr.length < 2)
{
byteStr = "0" + byteStr;
} //Format to add leading 0 for hex values
//Looping through taking each byte read from file and adding to array
//sql[i] = aByte; //Value
sql[i] = byteStr; //String
//When completed one row of database run single SQL insert statement with array contents
if(i==15)
{
i=0; //Clear counter for next row
db.transaction(function (tx)
{
tx.executeSql('INSERT INTO binary_data VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)', [sql[0], sql[1], sql[2], sql[3], sql[4], sql[5], sql[6], sql[7], sql[8], sql[9], sql[10], sql[11], sql[12], sql[13], sql[14], sql[15]]);
}, function (tx, err) {
document.getElementById("result3").innerHTML += 'ERROR '; //Display error message if SQL not run successfully
});
}
else
{
i++; //Otherwise increment counter
}
}
}
函数bin2dbfunc()
{
var结果,n,aByte,byteStr;
var i=0;
var sql=新数组();
result=fr.result;//输入文件
对于(n=0;n
我已经剥离了代码以删除所有调试消息,但实际上代码似乎正在运行。我使用的是一个包含6行数据的二进制文件,但是代码将最后一行数据插入数据库6次。
有人能指出我哪里出错了吗?变量是通过引用捕获的,而不是通过JavaScript闭包中的值捕获的(对于数组等对象也是如此,但对于基本值也是如此);这意味着传递给
db.transaction
的函数在运行时将使用sql
的当前值。在您的案例中,它们似乎是异步运行的,因此在返回bin2dbfunc
时使用sql
的值(这解释了为什么您会得到最后一行数据)
您必须复制sql
的值,以确保使用正确的值:
function transactionCallback(sql_) {
var sql = sql_.slice(0); // copy
return function(tx) {
tx.executeSql(…, sql);
};
}
db.transaction(transactionCallback(sql), …);
或
因为在
bin2dbfunc
中不需要sql
的值;第二个解决方案还可以让您摆脱i
,使用一个基于push
和length
的更优雅的解决方案,听起来像是一个范围问题-db.transaction()
是一个异步函数吗?如果tx.executeSql
抛出错误,变量i
不会增加。是吗?谢谢你,这解决了问题。在尝试更多的javascript之前,我必须多读一些书,这只是一个混搭的例子来尝试一个想法。
function transactionCallback(sql) {
return function(tx) {
tx.executeSql(…, sql);
};
}
db.transaction(transactionCallback(sql), …);
sql = [];