热门标签 | 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

推荐阅读
  • 注:根据Qt小神童的视频教程改编概论:利用最新的Qt5.1.1在windows下开发的一个小的时钟程序,有指针与表盘。1.Qtforwindows开发环境最新的Qt已经集 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 本文主要介绍关于linux文件描述符设置,centos7设置文件句柄数,centos7查看进程数的知识点,对【Linux之进程数和句柄数】和【linux句柄数含义】有兴趣的朋友可以看下由【东城绝神】投 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
  • 本文介绍了一种轻巧方便的工具——集算器,通过使用集算器可以将文本日志变成结构化数据,然后可以使用SQL式查询。集算器利用集算语言的优点,将日志内容结构化为数据表结构,SPL支持直接对结构化的文件进行SQL查询,不再需要安装配置第三方数据库软件。本文还详细介绍了具体的实施过程。 ... [详细]
  • 深入解析Linux下的I/O多路转接epoll技术
    本文深入解析了Linux下的I/O多路转接epoll技术,介绍了select和poll函数的问题,以及epoll函数的设计和优点。同时讲解了epoll函数的使用方法,包括epoll_create和epoll_ctl两个系统调用。 ... [详细]
  • 第一步:PyQt4Designer设计程序界面该部分设计类同VisvalStudio内的设计,改下各部件的objectName!设计 ... [详细]
  • [翻译]PyCairo指南裁剪和masking
    裁剪和masking在PyCairo指南的这个部分,我么将讨论裁剪和masking操作。裁剪裁剪就是将图形的绘制限定在一定的区域内。这样做有一些效率的因素࿰ ... [详细]
  • 人脸检测 pyqt+opencv+dlib
    一、实验目标绘制PyQT界面,调用摄像头显示人脸信息。在界面中,用户通过点击不同的按键可以实现多种功能:打开和关闭摄像头, ... [详细]
  • [BUUCTF] xman_2019_nooocall
    xman_2019_nooocall总结可以输入shellcode,但是又不能使用任何系统调用。因此,可以使用侧信道攻击,通过一些现象、反馈等猜测出flag。侧信道常用的反馈有错误 ... [详细]
  • 使用PyQt5 for Python gui开发笔记:实现可滚动标签
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了使用PyQt5forPythongui的可滚动标签相关的知识,希望对你有一定的参考价值。 ... [详细]
  • java线程实现图片滚动_Android线程实现图片轮播
    一、实现效果本篇文章实现了简单的图片轮播,初始化3张资源图片,初始化3秒更换一次图片背景,轮换播放。二、知识点Thread线程start( ... [详细]
  • Qt编写自定义控件57直方波形图
    一、前言直方波形图控件非原创控件,控件大全中大概有20-30个控件非自己原创,而是参考了网上开源的代码,自己加以整理和完善,新增了插件的代码使得可以直接集成到QtDesigner或 ... [详细]
  • SQLite3是一个广泛使用的数据库,从linux,windows到安卓都有SQLite的应用。本文介绍SQLite3在windows上的编译。SQLite3提供了多种源代码的下载 ... [详细]
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社区 版权所有