【问题标题】:C++ SQLite3 returns an empty query immediately after an updateC++ SQLite3 在更新后立即返回一个空查询
【发布时间】:2013-01-14 22:57:13
【问题描述】:

我在使用 SQLite 3 版本 3.7.14.1 时遇到问题,如果我进行更新然后立即尝试进行查询,它将返回 0 个结果,就好像它不存在一样。

这是我的日志示例:

SQLiteDB::beginTransaction: 0
SQLiteDB::prepareStatement: 0
SQLiteDB::executeStatement -- Executing SQL query:SELECT ... ID LIKE '2' ...
SQLiteDB::executeStatement: 100
SqlHandler::queryEvent -- Bound results.
SqlHandler::retrieveEvents -- Result set has 1 entries
SQLiteDB::releaseStatement: 0
SQLiteDB::prepareStatement: 0
SQLiteDB::executeStatement -- Executing SQL query:UPDATE ... WHERE ID = '2'
SQLiteDB::executeStatement: 101
SQLiteDB::releaseStatement: 0
SQLiteDB::endTransaction: 0

SQLiteDB::beginTransaction: 0
SQLiteDB::prepareStatement: 0
SQLiteDB::executeStatement -- Executing SQL query:SELECT ... ID LIKE '2' ...
SQLiteDB::executeStatement: 100
SqlHandler::queryEvent -- Bound results.
SqlHandler::retrieveEvents -- Result set has 1 entries
SQLiteDB::releaseStatement: 0
SQLiteDB::prepareStatement: 0
SQLiteDB::executeStatement -- Executing SQL query:UPDATE id = '2'
SQLiteDB::executeStatement: 101
SQLiteDB::releaseStatement: 0
SQLiteDB::endTransaction: 0

SQLiteDB::beginTransaction: 0
SQLiteDB::prepareStatement: 0
SQLiteDB::executeStatement -- Executing SQL query:SELECT ... ID LIKE '2' ...
SQLiteDB::executeStatement: 101
SqlHandler::queryEvent -- Nothing found.
SQLiteDB::releaseStatement: 0
Accessor::query -- Unable to perform query. queryEvent failed.
SQLiteDB::endTransaction: 0

如果我对“3”进行更新并选择“2”没有问题,只有当我更新“2”并选择“2”时(或在同一记录上更新和选择)

所有更新的信息都是正确的,但是选择失败,除非我在操作之间放置一个小睡眠或中断(不能背靠背运行)

我是多线程、共享缓存和多个连接

sqlite3_config(SQLITE_CONFIG_SERIALIZED);

sqlite3_enable_shared_cache(true);

sqlite3_open("file::memory:?cache=shared", &hDBC_);

提前感谢您的帮助。

编辑: 对于我正在使用的开始和结束事务

sqlite3_exec

对于我正在使用的查询、插入、删除、更新的准备语句

sqlite3_prepare_v2

对于我正在使用的执行语句

sqlite3_step

对于我正在使用的发布声明

sqlite3_finalize

【问题讨论】:

  • 你正在执行的 SQL 命令是什么?
  • 对于开始和结束事务,我使用 sqlite3_exec 对于查询、插入、删除、更新的准备语句,我使用 sqlite3_prepare_v2 对于执行语句,我使用 sqlite3_step 对于发布语句,我使用 sqlite3_finalize
  • 我的意思是 SQL 命令,而不是 C API 调用。
  • 我正在执行类似 UPDATE table1.Item1 = 2 where table1.ID = 2 的语句。然后另一个进程立即从 table1 执行 SELECT *。除了刚刚更新的行 (table1.ID = 2) 之外,table1 中的所有行都返回。我不介意它是否是旧数据(即 table1.Item1 在更改之前有什么),我只是希望它返回该行。
  • 另外,数据库没有返回 SQLITE_LOCKED、BUSY、SHAREDCACHE 等。它只返回除当前正在写入的行之外的所有行。

标签: c++ sql database sqlite


【解决方案1】:

感谢大家的帮助。

问题出在我的查询中。我有一个触发器,只要给定记录有更新,就会更新“last_modified”字段。我的查询有一个 where 子句说 ... last_modified

再次感谢大家的帮助

【讨论】:

    猜你喜欢
    • 2021-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-19
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    相关资源
    最近更新 更多