Javascript数据库事务处理错误,无法准备没有列的语句

Javascript Database Transaction Error could not prepare statement has no column

本文关键字:语句 事务处理 数据库 错误 Javascript      更新时间:2023-09-26

我目前有一个问题,当我试图插入数据时,我收到一个错误,表列不存在,但我已经定义了它。我目前已经隔离了这个问题,并决定手动插入数据。一旦我通过了我的警报("手动插入数据"),一个弹出框显示Error was could not prepare statement (1 table expenses has no column named expenseDate) (Code 5)

我已经采取了这些SQL语句,并在SQLite3数据库中测试了它们,一切都检查好了。有趣的是,当我转到开发控制台->资源选项卡时,我看不到我的表。

如有任何帮助,不胜感激。

我的js如下:

var shortName='TravelExpenseReporting';
var version='0.1';
var displayName='TravelExpenseReporting';
var maxSize = 65536;
db = openDatabase(shortName,version,displayName,maxSize);
try {
 db.transaction(
    function(transaction) {
        transaction.executeSql(
            'CREATE TABLE IF NOT EXISTS expenses ' +
            '(id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, ' +
            'type TEXT NOT NULL, ' + 'amount DOUBLE NOT NULL, ' +
            'vendor TEXT NOT NULL, ' + 'expensedate DATE NOT NULL);' 
        );
    }
 ); // END transaction()
} catch(e) {
alert('error: ' + e);
return;
}
alert('inserting data manually');
try {
 db.transaction(
    function(transaction) {
        transaction.executeSql(
            'INSERT INTO expenses (type,amount,vendor,expensedate) VALUES (?,?,?,?);',
            ['expenseType',100,'vendor','01/01/2004'],
            null,
            errorHandler
        );
    }
 ); // END transaction()
} catch(e) {
alert('error: ' + e);
return;

}

问题是您没有正确处理错误。您不应该使用try/catch来获取错误。实际上,transaction()函数是异步的:这意味着如果程序继续运行,而transaction()函数没有完成它的工作。因此,当您看到警告"手动插入数据"时,事务()应该还没有完成。

事务方法接受2个函数参数:一个在请求成功时执行,一个在请求失败时执行:

 db.transaction(
    function(transaction) {
        // success
        // put your requests
    },
    function(error) {
        // error
        System.out.println(error);
    }
 );

现在,你可以看到错误了

由于transaction()方法是异步的,您应该注意插入请求不会在创建表请求之前执行。所以你应该把所有的请求放在同一个事务中:

 db.transaction(
    function(transaction) {
        //create table
        //insert
    },
    function(error) {
        System.out.println(error);
    }
 );