在工作中遇到了一个问题,在使用ACCESS数据库insert后马上读取偶尔会读取不到。
之前忙的时候一直没有时间去找原因。
只是写了如下代码解决了问题:
while(!query2.next())
{
sleep(200);
aba+=1;
qDebug() << "没有从数据库读取到函数!失败次数"+QString::number(aba);
if(aba>50)
{
return false;
}
query2.exec(QString("select * from TestResultRecord where b1 = '%1' and b2 = %2 and theSys=%3").arg(date).arg(sampleNum.toInt()).arg(QString::number(_nSys)));
// query = sqlAccess->SelectToDataTableQueryZero(QString("select * from TestResultRecord where b1 = '%1' and b2 = %2 and theSys=%3")
// .arg(date).arg(sampleNum.toInt()).arg(QString::number(_nSys)));
}
qDebug() << "成功从数据库读取到函数。";
现在探寻问题出现的原因。
笔者建立了一个新的模拟软件,直接新建数据然后读取。但即便加上了500次的for循环,也没有出现丢包的情况。
后面以为是多线程操作数据库问题导致的,但这一现象也被排除了。
随后还排除了调用dll问题的影响。因为笔者所调用的dll是其他同事所写。怀疑过是否是因为Qt版本不同,导致调用他的dll时产生了问题。
虽然最终也不明白造成这个问题的根本原因,但是当将dll源代码文件中的/ query = sqlAccess->SelectToDataTableQueryZero(QString(“select * from TestResultRecord where b1 = ‘%1’ and b2 = %2 and theSys=%3”)
// .arg(date).arg(sampleNum.toInt()).arg(QString::number(_nSys)));
}
替换成 query2.exec(QString(“select * from TestResultRecord where b1 = ‘%1’ and b2 = %2 and theSys=%3”).arg(date).arg(sampleNum.toInt()).arg(QString::number(_nSys)))
之后,就再也没有出现丢包的情况了。
源代码是单独建了一个 sqlAccess 的类,然后调用 sqlAccess类中SelectToDataTableQueryZero函数。如果用这个方法就会导致在query.next()的时候返回false
至于为什么用这样的方法笔者还没有找到根本原因。
现贴出sqlAccess类的头文件。
希望懂这一问题根本原因的大佬能帮忙分析一下原因。笔者万分感谢。
#ifndef SQLACCESS_H
#define SQLACCESS_H
#include <QWidget>
#include <QSqlDatabase>
#include <QSqlTableModel>
//#include "structenum.h"
#define Error_INT 255
class SqlAccess
{
public:
//------------------
SqlAccess(QString dataName = nullptr);
~SqlAccess();
//---------------------打开连接数据库
bool setCreateDB(QSqlDatabase src_db);
//---------------------设置和读取端口
bool setDb_Port(QString PortName, int nSys);
QString get_db_port(int nSys);
bool db_shearSet(std::map<QString,int> map_shearSet);
std::map<QString, int> db_getShear();
QSqlQuery db_getdbVal(QString sta_date, QString end_date, int channel, int OFFSET);
int db_countDbVal(QString sta_date, QString end_date, int channel);
//--------------------独立查询
int SelectToDataTable(QString str_cmd); //根据直接传入的sql语句进行搜索某个字段并返回结果
QSqlQuery SelectToDataTableQuery(QString str_cmd);
QSqlQuery SelectToDataTableQueryZero(QString str_cmd);
bool UpdateToDataTable(QString str_cmd); //根据直接传入的sql语句进行修改某个字段并返回结果
public:
QSqlDatabase db;
};
#endif // SQLACCESS_H
SelectToDataTableQueryZero函数代码如下:
QSqlQuery SqlAccess::SelectToDataTableQueryZero(QString str_cmd)
{
QSqlQuery query(db);
bool ret = query.exec(str_cmd);
if(!ret)
{
qDebug() << "SqlAccess::SelectToDataTableQueryZero -- failed! -- str_cmd:" << str_cmd;
}
return query;
}
//根据直接传入的sql语句update数据库数据并返回结果