nodejs sqlite 3“SQLITE_MISUSE:数据库句柄已关闭”db.run 中的 db.all

Posted

技术标签:

【中文标题】nodejs sqlite 3“SQLITE_MISUSE:数据库句柄已关闭”db.run 中的 db.all【英文标题】:nodejs sqlite 3 "SQLITE_MISUSE: Database handle is closed" db.run within 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 查询。但是为什么会这样呢?

【问题讨论】:

【参考方案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()放在最后一个回调中。 谢谢。有时您看不到眼前的事物

以上是关于nodejs sqlite 3“SQLITE_MISUSE:数据库句柄已关闭”db.run 中的 db.all的主要内容,如果未能解决你的问题,请参考以下文章

linux中 nodejs 安装 sqlite3 出现的问题

nodejs集成sqlite

用于 Windows 的 nodejs 上的 SQLite

nodejs sqlite3 备份数据库

如何使 SQLite 与 Angular 4+、Electron 和 NodeJS 一起工作

NodeJS,将来自 MySQL 和 PostgreSQL 的数据存储在 SQLite 中