我试图从一组使用(sqlite.dump mydb>file.SQL)生成的SQL语句中填充HTML5 WebSQL数据库
我能够读入文件并执行所有的SQL语句。但是,在事务结束时,事务失败,并出现SQLError(代码=1,消息='not a error')。
现在,从我的调查中,我看到SQLite‘不是一个错误’是SQLite完成的。
那么,为什么生成一个SQLError,为什么回滚我的事务geting?
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 );
    }
}

最佳答案

好的,这是解决办法。
基本上,令人难以置信的描述性和有用的SQLError消息“不是错误”可能被webkit/Safari处理不当(应该被忽略)。
如果传递给tx.executeSql(query)的字符串中没有SQL语句,则返回“not an error”SQLError。
在我的例子中,这有时是一个空字符串,有时是一个只包含换行符的字符串。
所以,我的populate函数现在看起来是这样的:

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
    }
}

10-07 20:28