我正在开发一个使用SQLite3数据库存储数据的Visual C++应用程序。通常它大部分时间都在托盘中。SQLite文件锁定和DropBox
我也想启用将我的应用程序放入DropBox文件夹以在多台PC上共享。 直到DropBox最近更新自己以前,它工作得非常好。 现在它说它“无法同步正在使用的文件”。 SQLite文件在我的应用程序中打开,但锁是共享的。有一些准备好的陈述,但是在使用step
后立即重置。
有什么办法可以同步打开的SQLite数据库文件吗?谢谢!
下面是简单的包装,我使用只是为了测试(没有错误处理)的情况下,这有助于:
class Statement
{
private:
Statement(sqlite3* db, const std::wstring& sql) : db(db)
{
sqlite3_prepare16_v2(db, sql.c_str(), sql.length() * sizeof(wchar_t), &stmt, NULL);
}
public:
~Statement() { sqlite3_finalize(stmt); }
public:
void reset() { sqlite3_reset(stmt); }
int step() { return sqlite3_step(stmt); }
int getInt(int i) const { return sqlite3_column_int(stmt, i); }
std::wstring getText(int i) const
{
const wchar_t* v = (const wchar_t*)sqlite3_column_text16(stmt, i);
int sz = sqlite3_column_bytes16(stmt, i)/sizeof(wchar_t);
return std::wstring(v, v + sz);
}
private:
friend class Database;
sqlite3* db;
sqlite3_stmt* stmt;
};
class Database
{
public:
Database(const std::wstring& filename = L"")) : db(NULL)
{
sqlite3_open16(filename.c_str(), &db);
}
~Database() { sqlite3_close(db); }
void exec(const std::wstring& sql)
{
auto_ptr<Statement> st(prepare(sql));
st->step();
}
auto_ptr<Statement> prepare(const std::wstring& sql) const
{
return auto_ptr<Statement>(new Statement(db, sql));
}
private:
sqlite3* db;
};
UPD:试了注释掉sqlite3.c到与LockFile和LockFileEx所有呼叫 - 相同的结果。
UPD2:试图在闲置时调用sqlite3_close(就像概念验证一样) - 仍然是相同的结果! Filemon告诉该文件仍然没有关闭,只能解锁。
UPD3:自动提交模式开启。 BEGIN和COMMIT的数量相符(类交易和RAII负责)。 SQliteManager能够在我的应用程序运行时连接到数据库并对其进行修改。
您是否检查sqlite3_close()的结果?也许这不起作用,因为你还没有完成所有你准备好的陈述。 – 2010-03-15 12:57:32
就是这样!由于正在运行的后台备份,它无法工作。愚蠢的错误..谢谢!把它作为答案,我会接受它。 – 2010-03-16 08:45:16