热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Qt下sqlite正常工作一段时间后创建不了表单插入不了数据,求大神指点

在tq210的嵌入式linux系统下和虚拟机ubuntu下都是这样。。tq210下大概正常4到5个钟
在tq210的嵌入式linux系统下和虚拟机ubuntu下都是这样。。tq210下大概正常4到5个钟

9 个解决方案

#1


没碰到过。我这边很多的工控机都是7*24h工作的,大量使用sqlite作为参数配置,本地数据存储。没碰到过这种情况。ubuntu12.04裁剪内核版本的

#2


你看看错误代码,可以确定是哪一方面的错误。

#3


引用 2 楼 jiangcaiyang123 的回复:
你看看错误代码,可以确定是哪一方面的错误。

是正常工作4、5个钟,之前编译运行不出错。之后就不行了,程序还在运行,就是创建不了表单插入不了数据。现在已把数据库模块单独拿出来测试,还是一样。怀疑是qt内存泄露、sqlite不稳定或者与qt联用不稳定。关于内存泄露这方面出来new了一个全局的定时器我已经在代码中避免动态申请内存了。我是新手,对c++ 和Qt不熟悉,请多多指教。

#4


引用 1 楼 foxyz 的回复:
没碰到过。我这边很多的工控机都是7*24h工作的,大量使用sqlite作为参数配置,本地数据存储。没碰到过这种情况。ubuntu12.04裁剪内核版本的

请问你这边sqlite的使用频率怎么样?我是五分钟建一个新数据库,大小不到200k.你使用的语言呢?我是新手,请多指教

#5


要么你贴代码吧.我这边是C++

#6


引用 5 楼 foxyz 的回复:
要么你贴代码吧.我这边是C++


整理了一下下,这是测试代码
char channel[]="ABCDEFGHIJKLMNOP";
unsigned int dao;
QString dbcopy;
bool dbflag=0;
int dings=0;
char f0=0;
char f5=0;

QTimer *readTimer = new QTimer();
QTimer *readTimers = new QTimer();

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    readTimers->start(20000);
    connect(readTimers,SIGNAL(timeout()),this,SLOT(todo()));
    connect(readTimer,SIGNAL(timeout()),this,SLOT(readMyCom()));
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::readMyCom()
{
    readTimer->stop();
    bool readw_flag = 0;
    if(!readw_flag)
    {
           QDateTime time = QDateTime::currentDateTime();//获取系统现在的时间
           QString timestr = time.toString("yyyyMMddhhmm"); //设置显示格式
           QString datedir=QString("%1").arg(timestr.left(6));//  文件夹
           QString dbname;
           if((dao<16)&&(dbflag==0))
          {
           dbname=QString("./%1/%2.db").arg(timestr.left(6)).arg(timestr.mid(4,8));
           dbcopy=QString(dbname);
           dbflag=1;
           qDebug()<<"name copy"<          }
           else
            dbname=QString(dbcopy);

            QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE","mySQLite");
            db.setDatabaseName(dbname);
            if(!db.open())
                qDebug()<<"cann`t open db."<            QSqlQuery query=QSqlQuery::QSqlQuery(db);

            bool    bsuccess = false;

            QString create=QString("create table %1(id integer primary key autoincrement,count integer);").arg(channel[dao]);
             if(query.exec(create) == false)
               {
                   qDebug() << "cann`t creat db table" << endl;  
               }

             QTime    tmpTime;
             if(!db.transaction())qDebug()<<"transaction begin error!";
             tmpTime.start();

            QString dat;
            qDebug()<<"write  table : "<
            for(unsigned int p=0;p<1024;p++)
            {            
               dat= QString("insert into %1(id,count) values(\'%2\',\'%3\');").arg(channel[dao]).arg(p).arg(p);
               bsuccess=query.exec(dat);
                if (!bsuccess)
                 {
                qDebug()<<"query insert table channel error!"<                break;
                 }
            }            

            if(!db.commit())        //提交事务
            {
                if(db.rollback())
                 qDebug()<<"rollback";
                else qDebug()<<"rollback error!";
            }
            qDebug()<<"records take :"<             db.close(); //

              readw_flag = 1;
}

    if(readw_flag==1)
    {
        QSqlDatabase::removeDatabase("mySQLite");  
    }

    if(readw_flag)
    {
        readw_flag=0;
        dao++;
        if(dao<16)
        {
            qDebug()<<"write  :"<            readTimer->start(1000);
        }
        else
        {
            dbflag=0;
            readTimers->start(20000);
        }
    }               
}

void MainWindow::todo()
{
    QDateTime time = QDateTime::currentDateTime();//获取系统现在的时间
    QString tstr = time.toString("yyyyMMddhhmm"); //设置显示格式
    QString date5=QString("%1").arg(tstr.right(1));
    int shi=date5.toInt();
    qDebug()<<"time now :"<    if((shi==5)&&(f5==0))
    {
        dings=1;f5=1;f0=0;
    }
    if((shi==0)&&(f0==0))
    {
        dings=1;f0=1;f5=0;
    }

    if(dings>=1)
    {
     dings=0;
     readTimers->stop();
     readTimer->start(1000);    

     dao=0;
     dbflag=0;

    dbcopy=" ";
    qDebug()<<" write  :"<    }
    else
    {
        qDebug()<<" time%5 =0  ?? "<    }
}

#7


1、我还真没在Sqlite上用过transaction
2、我也没有这么频繁打开关闭数据库过。
3、插入的id,count如果是数值column,你那个语句写的转义单引号是啥意思啊?

#8


引用 7 楼 foxyz 的回复:
1、我还真没在Sqlite上用过transaction
2、我也没有这么频繁打开关闭数据库过。
3、插入的id,count如果是数值column,你那个语句写的转义单引号是啥意思啊?


insert into %1(id,count) values('%2','%3');
QString("insert ...");

上面的代码是用qt的包装数据库接口,我现在直接换为sqlite的c接口sqlite3_exec(),代码基本一样,目前可以稳定到一天了,目测还会有发展。

#9


我这边的工控机时时刻刻在上传mysql数据。当然也有读数据,同时在本地电子盘存储sqlite数据。上传时通过中间件的,本地sqlite的操作还是很频繁的,每天一个数据文件。
一般这种插入我都是用占位符方式的,另外,sqlite没有一组操作是需要用交易来保护的。
insert into %1(id,count) values('%2','%3');
我一般都是insert into %1(id,count) values(?,?);
然后用addBindValue

推荐阅读
author-avatar
温恭凯364092
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有