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

时间:2014-06-03 01:40:06

标签: javascript html sql html5 web-sql

我目前遇到的问题是,当我尝试插入数据时,我收到的错误是表列不存在,但我已经定义了它。我目前已将此问题隔离,并决定手动插入数据。一旦我通过提醒('手动插入数据'),弹出窗口会显示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;

}

1 个答案:

答案 0 :(得分:0)

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

事务方法采用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);
    }
 );