|
5Qter豆
本帖最后由 星星星 于 2018-5-2 11:33 编辑
参考 https://blog.csdn.net/chexlong/article/details/7110060 这篇博客
我找到了一个多线程读写锁的头文件以及对应的dll,已经在项目中可以加载dll并且执行里面的方法。
但是不知道怎么在访问SQLite数据库时加上读锁,我的项目要和其他程序共同访问一个数据库,因此要加锁。
目前的思路是:用一个专门的类来处理SQLite连接和关闭,但是我编程的无法编译通过。
请求大家能否教我一下怎么用dll里面的方法来给数据库加读锁,或者看看我写的程序问题出在哪里。。谢谢!!
头文件RWLockImpl.h 内容如下所示,是现成的不需要更改。DLL见附件:
我写的Util如下:
- #ifndef DBUTIL_H
- #define DBUTIL_H
- #include "RWLockImpl.h"
- #include <QtSql>
- #include <QLibrary>
- #include <QMessageBox>
- #include <QDebug>
- class DBUtil
- {
- public:
- DBUtil();
- static QSqlDatabase openConnection(); // 获取数据库连接
- static void closeConnection(QSqlDatabase connection); // 释放数据库连接回连接池
- static QLibrary *mylib;
- private:
- static QSqlDatabase myDB;
- static QString dbName;
- };
- #endif // DBUTIL_H
复制代码
- #include "dbutil.h"
- //函数指针: 获取读锁
- typedef void (*p_sql_read_lock)(void);
- //函数指针: 释放读锁
- typedef void (*p_sql_read_unlock)(void);
- DBUtil::DBUtil()
- {
- dbName = "vis_information.db"; //初始化数据库名称
- mylib = new QLibrary("lockDll.dll"); //声明所用到的dll文件
- if (mylib->load()) //判断是否正确加载
- {
- qDebug()<<"SQLite LockDLL load is OK!";
- }
- else
- QMessageBox::information(NULL,"ERROR","数据库读写DLL加载失败!");
- }
- //获取数据库连接
- QSqlDatabase DBUtil::openConnection() {
- //援引 ReadLock() 函数
- p_sql_read_lock readLock=(p_sql_read_lock)mylib->resolve("ReadLock");
- if (readLock) //是否成功连接上 ReadLock() 函数
- {
- qDebug()<<"read lock";
- readLock(); //这里函数指针调用dll中的 ReadLock() 函数
- if(QSqlDatabase::contains("qt_sql_default_connection"))
- myDB = QSqlDatabase::database("qt_sql_default_connection");
- else
- {
- myDB = QSqlDatabase::addDatabase("QSQLITE");
- myDB.setDatabaseName("./data/"+dbName);
- }
- if(myDB.open())
- return myDB;
- }
- QMessageBox::information(0, "错误信息", "无法打开数据库"+dbName);
- return QSqlDatabase();
- }
- void DBUtil::closeConnection(QSqlDatabase connection) {
- //援引 ReadLock() 函数
- p_sql_read_unlock unreadLock=(p_sql_read_unlock)mylib->resolve("UnReadlock");
- if (unreadLock) //是否成功连接上 UnReadLock() 函数
- {
- qDebug()<<"unread lock";
- unreadLock(); //这里函数指针调用dll中的 UnReadLock() 函数
- connection.close();
- }
- else
- {
- QMessageBox::information(NULL,"ERROR","UnReadlock释放读锁失败!");
- }
- }
复制代码
主函数如下:
- #pragma execution_character_set("utf-8")
- #include <QApplication>
- #include "mainwindow.h"
- #include "dbutil.h"
- int main(int argc, char **argv)
- {
- QApplication app(argc, argv);
- DBUtil util = DBUtil();
- QSqlDatabase db = DBUtil::openConnection();
- QSqlQuery sql_query;
- QString sql = "select count(*) from test_table";
- sql_query.prepare(sql);
- if(!sql_query.exec(sql))
- {
- QMessageBox::information(0, "数据库错误信息", sql+ " 语句执行出错\n" + sql_query.lastError().text());
- }
- else
- {
- if(sql_query.first())
- qDebug()<<sql_query.value(0).toString();
- }
- DBUtil::closeConnection(db);
- return app.exec();
- }
复制代码
程序报错如下:
|
|