第十三天学习记录:工作相关:探寻ACCESS数据库insert后马上读取偶尔会读取不到的问题

在工作中遇到了一个问题,在使用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数据库数据并返回结果
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值