sqlite3.dll无法选择sqlite studio

时间:2017-11-29 13:25:05

标签: sqlite sqlitestudio

我在Windows 7上使用版本3.21.0的sqlite3库。而SQLite Studio的版本1.0.0.0

我有几个进程将数据排队到sqlite3表中进行处理。当有数据要排队时,将打开数据库连接,将一条记录插入表中,然后关闭数据库连接。多个线程可以在每个进程中插入记录,但不共享连接。它为每个插入物打开和关闭。每次将记录插入表中时,都会发出Windows事件(:: OpenEvent)信号,以便其他进程可以处理数据。

然后我有其他进程一次从表中提取记录来处理它们。他们打开一个连接,SELECT一条记录并在事务中删除它(BEGIN / COMMIT)进行处理。每个进程中只有一个线程用于处理数据。读取并处理完所有记录后,将关闭连接,直到通过Windows事件发出信号表明需要处理更多记录。

如果任何进程返回SQLITE_BUSY,则该进程将继续重试,直到成功为止。

处理了大约1,300条记录(每秒插入2-3条记录),其中4个进程插入记录,两个进程选择并删除它们,我在SQLite Studio中注意到从未处理过三条记录。看来sqlite3.dll由于某种原因无法看到这些记录,但SQLite Studio可以。

当我在SQLite Studio下面的代码示例中运行SELECT语句时,我可以看到三条记录。但是,当我使用与sqlite3.dll相同的数据库使用相同的SELECT语句时,我没有记录。

下面的 sqlite3_step在返回SQLITE_ROW时返回SQLITE_DONE。

我将以下测试放在一起以证明问题。

#include "stdafx.h"
#include <Windows.h>
#include <sqlite3.h>
#include <crtdbg.h>

int _tmain(int argc, _TCHAR* argv[])
{
    HMODULE hModule = ::LoadLibraryW(L"sqlite3.dll") ;
    sqlite3* db ;
    int rc = ::sqlite3_open16(L"mydatabase.db", &db) ;
    _ASSERTE(SQLITE_OK == rc) ;
    _ASSERTE(db != NULL) ;

    sqlite3_stmt* stmt = NULL ;
    rc = ::sqlite3_prepare_v2(db, "SELECT * FROM MYTABLE;", -1, &stmt, NULL) ;
    _ASSERTE(SQLITE_OK == rc) ;
    _ASSERTE(stmt != NULL) ;

    rc = ::sqlite3_step(stmt) ;
    _ASSERTE(SQLITE_ROW == rc) ;

    rc = ::sqlite3_finalize(stmt) ;
    _ASSERTE(SQLITE_OK == rc) ;

    rc = ::sqlite3_close_v2(db) ;
    _ASSERTE(SQLITE_OK == rc) ;

    return 0;
}

我只是将sqlite集成到我们的产品中,而我正试图证明这个概念。显然我关注数据的完整性。 SQLite Studio是否会以某种方式查看已删除的记录?或者是sqlite3.dll没有看到那里的记录?我的数据库是否已损坏,我应该怎么做以防止这种情况发生?我不相信我做的事太复杂了。这是一个简单的开放,INSERT,关闭。如果返回SQLITE_BUSY,则在短暂睡眠后重试。然后它,打开,BEGIN;选择;删除;在另一边提交。如果返回SQLITE_BUSY则返回ROLLBACK而不是COMMIT,并在短暂睡眠后重试。

连连呢?

1 个答案:

答案 0 :(得分:0)

不确定我是否应该删除此帖子。希望比我更有经验的人能够回答这个问题。

但这是用户错误。我得到了.NET的VirtualStore。数据库存储在%PROGRAMDATA%\ CompanyName中,当我在SQLite Studio中打开它时,数据库的副本在%LOCALAPPDATA%\ VirtualStore \ ProgramData \ CompanyName中生成。但是没有明显迹象表明这种情况正在发生。从SQLite Studio打开文件显示我正在访问%PROGRAMDATA%\ CompanyName中的文件,但它是VirtualStore中的文件。所以我在看两个不同的数据库。