Qt实战案例(25)——利用QSQL相关类实现对SQLite数据库的增删改查操作

Qt提供了一种进程内数据库SQLite。它小巧灵活,无须额外安装配置且支持大部分ANSI SQL92标准,是一个轻量级的数据库,概括起来具有以下优点。

  1. SQLite的设计目的是实现嵌入式SQL数据库引擎,它基于纯C语言代码,已经应用在非常广泛的领域内。
  2. SQLite在需要持久存储时可以直接读写硬盘上的数据文件,在无须持久存储时也可以将整个数据库置于内存中,两者均不需要额外的服务器端进程,即SQLite是无须独立运行的数据库引擎。
  3. 开放源代码,整套代码少于3万行,有良好的注释和90%以上的测试覆盖率。
  4. 少于250KB的内存占用容量(gcc编译情况下)。
  5. 支持视图、触发器和事务,支持嵌套SQL功能。
  6. 提供虚拟机用于处理SQL语句。
  7. 不需要配置,不需要安装,也不需要管理员。
  8. 支持大部分ANSI SQL92标准。
  9. 大部分应用的速度比目前常见的客户端/服务器结构的数据库快。就3
  10. 编程接口简单易用。

目录

    • 一、项目介绍
    • 二、项目基本配置
    • 三、UI界面设计
    • 四、主程序实现
      • 4.1 pro文件
      • 4.2 main.cpp文件
    • 五、效果演示

一、项目介绍

利用Qt对SQLite数据库完成数据的增、删、改、查等操作。

二、项目基本配置

新建一个Qt案例,项目名称为“SQLTest”,基类选择“QWidget”,取消创建UI界面复选框的选中状态,完成项目创建。

三、UI界面设计

无UI界面

四、主程序实现

4.1 pro文件

在SQLTest.pro文件中添加如下代码:

QT+=sql

4.2 main.cpp文件

源文件main.cpp中代码如下:
首先需要创建SQLite数据库,然后激活与数据库的物理连接:

    QSqlDatabase db =QSqlDatabase::addDatabase ("QSQLITE");//创建SQLite数据库
    db.setHostName ("SQLite-001") ;//设置数据库主机名
    db.setDatabaseName ("qtDB.db");//设置数据库名
    db.setUserName ("Wendy") ;     //设置数据库用户名
    db.setPassword("123456") ;     //设置数据库密码
    db.open();                    //打开连接

创建数据库表:

    //创建数据库表
    QSqlQuery query;  //创建QSqlQuery对象
    bool success=query.exec("create table automobil"
        "(id int primary key,attribute varchar,"
        "type varchar,kind varchar,nation int,"
        "carnumber int,elevaltor int,"
        "distance int,oil int,"
        "temperature int)");  //创建数据表automobil,该表具有10个字段其中id为主键【引号内均为SQL语句】
    if (success)
        qDebug()<<QObject::tr("数据库表创建成功!\n");
    else
        qDebug()<<QObject::tr("数据库表创建失败!\n");

I.数据查询:

    //I.数据查询
    query.exec("select * from automobil");//查询automobil表中所有数据
    QSqlRecord rec=query.record();
    qDebug()<<QObject::tr("automobile表的字段数:")<< rec.count();//列数

II.数据插入:

    //II.数据插入
    QTime t;
    t.start();  //启动一个计时器,统计操作耗时
    query.prepare("insert into automobil values(?,?,?,?,?,?,?,?,?,?)");//数据插入(预先分配空间),此处使用了ODBC类型的定位占位符?
    long records=100;  //向表中插入任意的100条记录
    for (int i=0; i<records; i++){
        //绑定要插入的值
        query.bindValue(0,i) ;      //id int
        query.bindValue(1, "四轮"); //attribute varchar
        query.bindValue(2, "轿车");   //type varchar
        query.bindValue(3,"富康") ;   //kind varchar
        query.bindValue(4,rand()%100);//nation int
        query.bindValue(5,rand()%10000);//carnumber int
        query.bindValue(6,rand()%300);//elevaltor int
        query.bindValue(7, rand()%200000);//distance int
        query.bindValue(8,rand()%52);   //oil int
        query.bindValue(9,rand()%100);  //temperature int

        success=query.exec();   //调用exec()函数在query中插入上述值
        if(!success){
            QSqlError lastError=query.lastError();//返回最后一个错误信息
            qDebug ()<<lastError.driverText()<<QString(QObject::tr("插入失败"));
        }
    }
    qDebug()<<QObject::tr("插入%1条记录,耗时:%2ms").arg (records).arg(t.elapsed());//插入100条数据,输出消耗的时间

    t.restart() ;  //重启计时器
    success=query.exec("select * from automobil order by id desc") ;//按id字段的降序将查询表中刚插入的数据进行排序
    if (success)
        qDebug() <<QObject::tr("排序%1条记录,耗时:%2 ms").arg (records).arg(t.elapsed());//输出操作耗时
    else
        qDebug()<<QObject::tr("排序失败!");

III.数据修改:

    //III.数据修改
    t.restart();//重启计时器
    for (int i=0;i<records;i++)
    {
        query.clear() ;
        query.prepare(QString ("update automobil set attribute=?, type=?,"
                        "kind=?, nation=?,"
                        "carnumber=? ,elevaltor=?,"
                        "distance=?,oil=?, "
                        "temperature=? where id=%1").arg(i));  //SQL语句的更新操作【数据修改】(与插入操作类似)
        query.bindValue(0, "四轮") ;
        query.bindValue(1, "轿车") ;
        query.bindValue(2, "富康") ;
        query.bindValue(3, rand()%100) ;
        query.bindValue(4, rand()%10000);
        query.bindValue(5, rand()%300);
        query.bindValue(6, rand()%200000) ;
        query.bindValue(7, rand()%52) ;
        query.bindValue(8, rand()%100) ;

        success=query.exec();    //调用exec()函数在query中插入上述值
        if (!success)
        {
            QSqlError lastError=query.lastError();//返回最后一个错误信息
            qDebug ()<<lastError.driverText()<<QString (QObject::tr ("更新失败"));
        }
    }
    qDebug()<<QObject::tr("更新%1条记录,耗时:%2ms").arg (records).arg(t.elapsed());

IV.数据删除:

//IV.数据删除
t.restart();//重启计时器
query.exec("delete from automobil where id=15") ;//删除id为15的数据
qDebug()<<QObject::tr("删除一条记录,耗时:%1 ms") .arg(t.elapsed()) ;//输出操作耗时
return 0;
//return a.exec() ;

【注意】:以上代码均为Qt5相关代码,Qt6及以上版本取消了QTime类下的t.restart()函数和t.elapsed()函数,将其封装到了QElapsedTimer类中,请使用相应代码代替,完整代码参考:资源。

五、效果演示

完整效果如下:
Qt实战案例(25)——利用QSQL相关类实现对SQLite数据库的增删改查操作_第1张图片
生成的qtDB.db文件如下:
Qt实战案例(25)——利用QSQL相关类实现对SQLite数据库的增删改查操作_第2张图片

如果没有看懂的话,完整代码可以参考:https://download.csdn.net/download/didi_ya/76627517
当然,这里也提供了Qt6实现的相关代码,可以参考:https://download.csdn.net/download/didi_ya/76630272


ok,以上便是本文的全部内容了,如果对你有所帮助,记得点个赞哟~

你可能感兴趣的:(Qt,数据库,sqlite,qt,c++,database)