【问题标题】:Access a Sqlite database Simultaneously同时访问 Sqlite 数据库
【发布时间】:2018-10-04 02:52:58
【问题描述】:

我正在使用 Visual C++ 编写一个小应用程序,该应用程序将调用 SQLite C 接口来创建数据库并向其中插入一些数据。

在调试应用程序时,我想检查数据库中的数据。因此,我从命令行启动 sqlite3 shell(sqlite3.exe),然后使用以下命令打开数据库:

.打开文件名

之后,我想检查我的应用程序创建的表,但总是得到“表不存在”的错误。

然后我使用“select * from sqlite_master;”但仍然返回空结果。

我做了更多的测试如下:

  1. 尝试使用 --readonly 选项再次打开数据库,如下所示:

.open --readonly 文件名;

  1. 打开数据库后,我尝试使用这样的命令:

从 sqlite_master 中选择 *;

然后我会看到“数据库已锁定”错误。我尝试在 Stackoverflow 上搜索解决方案,所有解决方案都只是建议关闭正在访问数据库的其他应用程序。但是,我需要的只是让应用程序仍然可以访问数据库,同时我仍然可以查看(而不是修改)sqlite数据库中的内容,这可能吗?

因此,我只是想知道我是否可以通过 sqlite3.exe shell 同时访问已经被另一个程序打开的 sqlite 数据库? 目前只有我的app会写入数据库,sqlite3 shell只需要读取数据库中的数据。

【问题讨论】:

  • 你确定你的程序和 sqlite3 shell 使用的是同一个数据库文件吗?
  • 可能是错误的目录。
  • @CL,我确定数据库打开成功,因为我第一次输入错误的名称,我得到一个错误。然后我更正名称,打开成功,没有错误。
  • 查看WAL mode

标签: sqlite


【解决方案1】:

您好,您可以使用“用于 SQlite 的数据库浏览器”。使用此工具,您可以轻松创建 sqlite 数据库并插入行。也可以查看插入的数据。

【讨论】:

  • 希望能用sqlite shell代替第三方工具访问数据库。谢谢
【解决方案2】:

如果sqlite_master 为空,您可能使用 CLI 工具打开了错误的文件,或者写入应用程序可能未提交创建您要查找的表的事务。

如果您需要一个写入器和一个读取器进程,最好查看https://www.sqlite.org/wal.html,确保在两个进程中都正确打开数据库。

如果这只是为了调试,也许使用https://www.sqlite.org/backup.html Backup API 也可能是一种解决方案。这使您可以将数据库转储到单独的文件中,从而在读取时忽略并发问题。

【讨论】:

  • 谢谢。目前我正在使用 PRAGMA journal_mode=OFF;我认为它比 WAL 模式更进一步。这仍然会导致数据库锁定吗?
猜你喜欢
  • 2011-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-12
  • 2016-12-10
相关资源
最近更新 更多