数据库具体增删改查类,比如和用户有关的增删改查类 class TableUser
该类主要实现和用户有关的增删改查,比如 bool AddUser(QString& strJson)
这个函数并不直接运行,而是把需要执行的函数,函数的输入,函数的返回结果等都放到一个结构体中(结构体在数据库管理类具体介绍)
bool TableUser::AddUser(QString& strJson)
{
DB_OPENRATION dboperation;
dboperation.func = [&](QSqlDatabase& db, DB_OPENRATION & dboperation)
{
......
}
dboperation.strSql = strJson;
m_pDatabaseManager->SendResponse(dboperation, true);
strJson = dboperation.strSql;
return dboperation.bRet;
}
如上述代码所示,具体的数据库查询函数是 C++ lambda表达式:
dboperation.func = [&](QSqlDatabase& db, DB_OPENRATION & dboperation)
{
......
QJsonObject obj;
parserJson(dboperation.strSql, obj, strErr);
QString strSql = QString("insert into userinfo(accountName,password) values('%1','%2') ;")
.arg(obj["accountName"].toString()).arg(obj["password"].toString());
QSqlQuery sqlQuery(db);
if(!sqlQuery.exec(strSql))
{
strErr = sqlQuery.lastError().text();
nRet++;
//添加日志记录 某某用户登录
}
......
dboperation.strSql = MakeJsonString(CMD, obj, strErr, nRet);
return nRet == SUCCESS;
}
数据库管理类
class DatabaseManager
定义一个结构体
typedef struct DB_OPENRATION_INFO
{
DB_OPENRATION_INFO()
{
bRet = false;
}
public:
// 输入信息 输出也放在里面
QString strSql;
// 把数据库的 *** 作使用回调传给上层自定义处理
std::function<bool(QSqlDatabase& db, tagDBOperateInfo& dBOperateInfo)> func;
// 返回结果
bool bRet;
}DB_OPENRATION ;
Q_DECLARE_METATYPE(DB_OPENRATION )
定义一个成员变量m_DBOperateInfo,这里面存储了查询数据库的具体函数,输入输出等
数据库管理类初始话时,就会开启一个线程,这个线程会不停地检查成员变量m_DBOperateInfo中是否有可以执行的数据库 *** 作,如果有就 *** 作数据库
QList<DB_OPENRATION_INFO> m_DBOperateInfo;
之前在数据库的增删改查类里面,每一个具体 *** 作数据的函数里,都会有这样一句:
m_pDatabaseManager->SendResponse(dboperation, true);
其中,m_pDatabaseManager是数据库管理类的实例,SendResponse的作用是把我将要查询的 *** 作结构体 dboperation 放到m_DBOperateInfo里
bool DatabaseManager::SendResponse(DB_OPERATE_INFO_2& dBOperateInfo, bool bWaitComplete)
{
......
m_lock.lock();
m_lstDBOperateInfo.append(dBOperateInfo);
m_lock.unlock();
}
数据库管理类初始话时开启的线程会不断地询问该队列是否有需要执行的函数
while (m_bThreadRun)
{
DB_OPENRATION dboperation;
if (!GetDBOperateInfo(dboperation))
{
continue;
}
bool bRet = false;
if (dboperation.func != nullptr)
{
bRet = dboperation.func(m_db, dboperation.m_strSql);
}
return bRet;
}
至此,最初定义lambda函数在这里才运行 bRet = dboperation.func(m_db, dboperation.m_strSql);
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)