QT数据库封装类-支持多线程

头文件MySql.h

#ifndef MYSQL_H
#define MYSQL_H

#include <QWidget>
#include <QSqlDatabase>
#include <QtCore/QMutex>

struct ImageInfo       //待存放的数据结构//
{
	//每帧不一样,每帧都要记录//
	int id;
	double flightLongitude;              //飞机经度//
	int col;                             //列位置,定义靠近飞机的一侧为第0列//

	ImageInfo(int a = 0, double b = 0, int c = 0)
	{
		id = a;
		flightLongitude = b;
		col = c;
	}
};

class MySql
{
public:
	MySql(QString& Dir);
	~MySql();

private:
	bool CreateConnection();      //创建数据库连接//
	bool isDirExist();            //路径是否存在//

	QString connectionName;       //连接名称//
	QString dbDir;                //.db文件路径//
	QSqlDatabase db;
	QMutex mutex;                 //多线程资源访问控制//
public:
	void closeDb();               //关闭数据库//

	bool MyInsert(ImageInfo& InputImgInfo);                   //插入//
	bool MySelect(int InputId,ImageInfo& OutputImgInfo);      //查找//
	bool MyDelete(int InputId);                               //删除//
	bool MyUpdate(ImageInfo& InputImgInfo);                   //更新//

private:
	void  requestAccessToken(void);                           //加锁//
	void  releaseAccessToken(void);                           //解锁//

};

#endif // MYSQL_H

源文件MySql.cpp

#include "MySql.h"
#include <QDir>
#include<QDebug>
#include <QSqlQuery>
#include <QSqlError>

MySql::MySql(QString& Dir)
	: dbDir(Dir)
{
	connectionName = "sqlslite";
	if (!isDirExist())        //若路径不存在则创建该路径//
	{
		QDir backup;
		backup.mkdir(dbDir);
	}

	if (!CreateConnection())
	{
		qDebug() << "can open db!";
		return;
	}
}

MySql::~MySql()
{
	closeDb();
}


bool MySql::CreateConnection()
{
	db = QSqlDatabase::addDatabase("QSQLITE",connectionName);  //创建一个SQLite数据库连接//
	QString dbName = dbDir + "sql.db";                         //本地数据库文件名//
	db.setDatabaseName(dbName);                                //数据库连接命名// 
	if (!db.open())                                            //如果.db文件不存在,自动新建.db文件并打开//
	{
		return false;
	}

	QSqlQuery query(QSqlDatabase::database(connectionName));
	query.exec("create table student(id int primary key,flightLongitude double,col int)");   //新建一张表,访问已有.bd时,执行该语句也不受影响//

	return true;
}


bool MySql::isDirExist()
{
	QDir temp_dir(dbDir);
	if (temp_dir.exists())
	{
		return true;
	}
	else
	{
		return false;
	}
}

void MySql::closeDb()
{
	if (db.isOpen())
	{
		db.close();
	}
}

bool MySql::MyInsert(ImageInfo& InputImgInfo)
{
	requestAccessToken();

	QSqlQuery query(QSqlDatabase::database(connectionName));
	query.prepare("insert into student(id,flightLongitude,col)"
		"values(:id,:flightLongitude,:col)");
	query.bindValue(":id",InputImgInfo.id);
	query.bindValue(":flightLongitude",InputImgInfo.flightLongitude);
	query.bindValue(":col",InputImgInfo.col);
	if (!query.exec())
	{
		return false;
	}

	releaseAccessToken();
	return true;
	//qDebug() << "/*************/" << Ok << query.lastError();

}

bool MySql::MySelect(int InputId,ImageInfo& OutputImgInfo)
{
	requestAccessToken();

	QSqlQuery query(QSqlDatabase::database(connectionName));
	query.prepare("select * from student where id = :id");
	query.bindValue(":id",InputId);
	if (!query.exec())
	{
		return false;
	}
	query.next();
	OutputImgInfo.id = query.value(0).toInt();
	OutputImgInfo.flightLongitude = query.value(1).toDouble();
	OutputImgInfo.col = query.value(2).toInt();

	releaseAccessToken();

	return true;
}

bool MySql::MyDelete(int InputId)
{
	requestAccessToken();

	QSqlQuery query(QSqlDatabase::database(connectionName));
	query.prepare("delete from student where id = :id");
	query.bindValue(":id",InputId);
	if (!query.exec())
	{
		return false;
	}

	releaseAccessToken();
	return true;
}

bool MySql::MyUpdate(ImageInfo& InputImgInfo)
{
	requestAccessToken();

	if (!MyDelete(InputImgInfo.id))
	{
		return false;
	}
	if (!MyInsert(InputImgInfo))
	{
		return false;
	}
	releaseAccessToken();

	return true;
}

void  MySql::requestAccessToken(void)
{
	mutex.lock();                           //如果已经lock且还未unlock,一直等待,直到unlock,然后lock//
}

void  MySql::releaseAccessToken(void)
{
	mutex.unlock();                        
}


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值