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

can9010 2013-06-28 05:48:21
在tq210的嵌入式linux系统下和虚拟机ubuntu下都是这样。。tq210下大概正常4到5个钟
...全文
294 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
donwmufromdying 2013-07-06
  • 打赏
  • 举报
回复
我这边的工控机时时刻刻在上传mysql数据。当然也有读数据,同时在本地电子盘存储sqlite数据。上传时通过中间件的,本地sqlite的操作还是很频繁的,每天一个数据文件。 一般这种插入我都是用占位符方式的,另外,sqlite没有一组操作是需要用交易来保护的。 insert into %1(id,count) values('%2','%3'); 我一般都是insert into %1(id,count) values(?,?); 然后用addBindValue
can9010 2013-07-03
  • 打赏
  • 举报
回复
引用 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(),代码基本一样,目前可以稳定到一天了,目测还会有发展。
donwmufromdying 2013-07-03
  • 打赏
  • 举报
回复
1、我还真没在Sqlite上用过transaction 2、我也没有这么频繁打开关闭数据库过。 3、插入的id,count如果是数值column,你那个语句写的转义单引号是啥意思啊?
can9010 2013-07-01
  • 打赏
  • 举报
回复
引用 1 楼 foxyz 的回复:
没碰到过。我这边很多的工控机都是7*24h工作的,大量使用sqlite作为参数配置,本地数据存储。没碰到过这种情况。ubuntu12.04裁剪内核版本的
请问你这边sqlite的使用频率怎么样?我是五分钟建一个新数据库,大小不到200k.你使用的语言呢?我是新手,请多指教
can9010 2013-07-01
  • 打赏
  • 举报
回复
引用 2 楼 jiangcaiyang123 的回复:
你看看错误代码,可以确定是哪一方面的错误。
是正常工作4、5个钟,之前编译运行不出错。之后就不行了,程序还在运行,就是创建不了表单插入不了数据。现在已把数据库模块单独拿出来测试,还是一样。怀疑是qt内存泄露、sqlite不稳定或者与qt联用不稳定。关于内存泄露这方面出来new了一个全局的定时器我已经在代码中避免动态申请内存了。我是新手,对c++ 和Qt不熟悉,请多多指教。
can9010 2013-07-01
  • 打赏
  • 举报
回复
引用 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"<<endl;
          }
           else
            dbname=QString(dbcopy);

            QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE","mySQLite");
            db.setDatabaseName(dbname);
            if(!db.open())
                qDebug()<<"cann`t open db."<<endl;
            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 : "<<channel[dao];

            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!"<<endl;  
                break;
                 }
            }            

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

              readw_flag = 1;
}

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

    if(readw_flag)
    {
        readw_flag=0;
        dao++;
        if(dao<16)
        {
            qDebug()<<"write  :"<<channel[dao];
            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 :"<<tstr<<"fen :"<<shi;
    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  :"<<channel[dao];
    }
    else
    {
        qDebug()<<" time%5 =0  ?? "<<endl;
    }
}
donwmufromdying 2013-07-01
  • 打赏
  • 举报
回复
要么你贴代码吧.我这边是C++
彩阳 2013-06-30
  • 打赏
  • 举报
回复
你看看错误代码,可以确定是哪一方面的错误。
donwmufromdying 2013-06-30
  • 打赏
  • 举报
回复
没碰到过。我这边很多的工控机都是7*24h工作的,大量使用sqlite作为参数配置,本地数据存储。没碰到过这种情况。ubuntu12.04裁剪内核版本的

16,173

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧