【问题标题】:nodejs sqlite 3 "SQLITE_MISUSE: Database handle is closed" db.run within db.allnodejs sqlite 3“SQLITE_MISUSE:数据库句柄已关闭”db.run 中的 db.all
【发布时间】:2021-08-07 03:02:39
【问题描述】:

所以我正在尝试以下方法:

var sqlite3 = require('sqlite3').verbose();
var db = new sqlite3.Database('MyDB.db');

console.log("Initializing...")
var MyGUID = "d49dfb07-7ac9-42e7-a355-2707209baea5";
db.serialize(function() {
    db.all("SELECT Name, Status FROM MyTable WHERE MyGUID = ? ", [MyGUID], function(err, rows) {
        console.log(rows);
        db.run("UPDATE MyTable SET readOnly = 0 WHERE MyGUID = 'd49dfb07-7ac9-42e7-a355-2707209baea5'", "", function(err) {
            console.log(err);
        });
    }); 
});

db.close();

这会导致“SQLITE_MISUSE:数据库句柄已关闭” 显然我无法在 db.all 回调中运行 UPDATE 查询。但是为什么会这样呢?

【问题讨论】:

    标签: javascript node.js sqlite electron node-sqlite3


    【解决方案1】:

    您应该将第二个查询作为db.serialize() 的参数。然后它将等待它完成,然后返回并允许db.close() 运行。

    db.serialize(function() {
      db.all("SELECT Name, Status FROM MyTable WHERE MyGUID = ? ", [MyGUID], function(err, rows) {
        console.log(rows)
      });
      db.run("UPDATE MyTable SET readOnly = 0 WHERE MyGUID = 'd49dfb07-7ac9-42e7-a355-2707209baea5'", "", function(err) {
        console.log(err);
      });
    });

    【讨论】:

    • 谢谢,这行得通。但显然 db.run 在调用 db.all 的回调之前执行。那么如何确保 db.all 的回调在 db.run 执行之前完成。例如,如果我想检查我正在使用 db.all 获取的“名称”,并且只有在“名称”等于“约翰”时才创建 db.run。
    • 你可以把db.close()放在最后一个回调中。
    • 谢谢。有时您看不到眼前的事物
    猜你喜欢
    • 2012-04-17
    • 1970-01-01
    • 2014-01-09
    • 2014-12-15
    • 1970-01-01
    • 2021-11-02
    • 2012-04-08
    • 2018-12-02
    • 1970-01-01
    相关资源
    最近更新 更多