SQL即结构化查询语言,是关系数据库的标准语言。前面已经提到,在Qt中利用QSqlQuery类实现了执行SQL语句。需要说明,我们这里只是Qt教程,而非专业的数据库教程,所以我们不会对数据库中的一些知识进行深入讲解,下面只是对最常用的几个知识点进行讲解。

我们下面先建立一个工程,然后讲解四个知识点,分别是:

一,操作SQL语句返回的结果集。

二,在SQL语句中使用变量。

三,批处理操作。

四,事务操作。

我们新建Qt4 Gui Application工程,我这里工程名为data2,然后选中QtSql模块,Base class选QWidget。工程建好后,添加C++ Header File ,命名为connection.h ,更改其内容如下:

#ifndef CONNECTION_H
#define CONNECTION_H
#include <QMessageBox>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QtDebug>
#include <QtGui>
#include <qdebug.h>
static bool creatConnection()
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");//添加数据库驱动
    db.setDatabaseName(":memory:"); //数据库连接命名
    if(!db.open()) //打开数据库
    {
        qDebug("open is false");
        return false;
    }
    else
    {
        qDebug("open is OK");
    }
    QSqlQuery query(db); //以下执行相关QSL语句
    bool buscess=query.exec("create table person (id int primary key, firstname varchar(20), lastname varchar(20))");
    //新建person表,id设置为主键,一个firstname项,还有一个lastname项
    query.exec("insert into person values(101, 'Danny', 'Young')");
    query.exec("insert into person values(102, 'Christine', 'Holand')");
    query.exec("insert into person values(103, 'Lars', 'Gordon')");
    query.exec("insert into person values(104, 'Roberto', 'Robitaille')");
    query.exec("insert into person values(105, 'Maria', 'Papadopoulos')");
        //向表中插入5条记录
    if(!buscess)
    {
        qDebug("table is error");
    }
    else
    {
        qDebug("table is sucess");
    }
    return true;
}
#endif // CONNECTION_H

然后更改main.cpp的内容如下:

#include <QtGui/QApplication>
#include "widget.h"
#include "connection.h"
#include <QtSql>
#include <QtDebug>
#include <qdebug.h>
#include <QSqlQuery>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    if(!creatConnection())
        return 1;
    Widget w;
    w.show();
    
    return a.exec();
}

可以看到,我们是在主函数中打开数据库的,而数据库连接用一个函数完成,并单独放在一个文件中,这样的做法使得主函数很简洁。我们今后使用数据库时均使用这种方法。我们打开数据库连接后,新建了一个人员表,并在其中插入了几条记录。

101 "Danny""Young"

102 "Christine" "Holand"

103 "Lars""Gordon"

104 "Roberto""Robitaille"

105 "Maria""Papadopoulos"

表中的一行就叫做一条记录,一列是一个属性。这个表共有5条记录,id、firstname和lastname三个属性。程序中的“id int primary key”表明id属性是主键,也就是说以后添加记录时,必须有id项。

下面我们打开widget.ui文件,在设计器中向界面上添加一个Push Button ,和一个Spin Box 。将按钮的文本改为“查询”,然后进入其单击事件槽函数,更改如下。

void Widget::on_pushButton_clicked()
{
    QSqlQuery query;
    query.exec("select * from person");
    while (query.next())
    {
         qDebug() << query.value(0).toInt() << query.value(1).toString() << query.value(2).toString();
    }
}

我们在widget.cpp中添加头文件:

#include <QSqlQuery>#include <QtDebug>

然后运行程序,单击“查询”按钮,效果如下:

可以看到在输出窗口,表中的所有内容都输出出来了。这表明我们的数据库连接已经成功建立了。

一,操作SQL语句返回的结果集。

在上面的程序中,我们使用query.exec(“select * from person”);来查询出表中所有的内容。其中的SQL语句“select * from person”中“*”号表明查询表中记录的所有属性。而当query.exec(“select * from person”);这条语句执行完后,我们便获得了相应的执行结果,因为获得的结果可能不止一条记录,所以我们称之为结果集。

结果集其实就是查询到的所有记录的集合,而在QSqlQuery类中提供了多个函数来操作这个集合,需要注意这个集合中的记录是从0开始编号的。最常用的有:

seek(int n) :query指向结果集的第n条记录。

first() :query指向结果集的第一条记录。

last() :query指向结果集的最后一条记录。

next() :query指向下一条记录,每执行一次该函数,便指向相邻的下一条记录。

previous() :query指向上一条记录,每执行一次该函数,便指向相邻的上一条记录。

record() :获得现在指向的记录。

value(int n) :获得属性的值。其中n表示你查询的第n个属性,比方上面我们使用“select * from person”就相当于“select id, firstname,lastname from person”,那么value(0)返回id属性的值,value(1)返回firstname属性的值,value(2)返回lastname属性的值。该函数返回QVariant类型的数据,关于该类型与其他类型的对应关系,可以在帮助中查看QVariant。

at() :获得现在query指向的记录在结果集中的编号。

需要说明,当刚执行完query.exec(“select * from person”);这行代码时,query是指向结果集以外的,我们可以利用query.next(),当第一次执行这句代码时,query便指向了结果集的第一条记录。当然我们也可以利用seek(0)函数或者first()函数使query指向结果集的第一条记录。但是为了节省内存开销,推荐的方法是,在query.exec(“select * from person”);这行代码前加上query.setForwardOnly(true);这条代码,此后只能使用next()和seek()函数。

下面将“查询”按钮的槽函数更改如下:

void Widget::on_pushButton_clicked()
{
    QSqlQuery query;
    query.exec("select * from person");
    //while (query.next())
    //{
    //     qDebug() << query.value(0).toInt() << query.value(1).toString() << query.value(2).toString();
    //}
    qDebug()<<"exec next()";
    if(query.next())
    //开始就先执行一次next()函数,那么query指向结果集的第一条记录
    {
        int rowNum= query.at();
        //获取query所指向的记录在结果集中的编号
        int columnNum=query.record().count();
        //获取每条记录中属性(即列)的个数
        int fieldNo1=query.record().indexOf("firstname");
        //获取firstname属性所在列的编号,列从左向右编号,最左边的编号为0
        int fieldNo2=query.record().indexOf("lastname");
        //获取lastname属性所在列的编号,列从左向右编号,最左边的编号为0
        int id = query.value(0).toInt();
        //获取id属性的值,并转换为int型
        QString firstname = query.value(1).toString();
        //获取firstname属性的值
        QString lastname = query.value(2).toString();
        //获取lastname属性的值
        qDebug()<<"rowNum is:"<<rowNum//将结果输出
                <<"columnNum is :"<< columnNum
                <<"fieldNo1 is:"<<fieldNo1
                <<"fieldNo2 is:"<<fieldNo2
                << "id is: " << id
                << "firstname is :"<< firstname
                << "lastname is :"<< lastname;
    }
    qDebug() << "exec seek(2) :";
    if(query.seek(2))
    //定位到结果集中编号为2的记录,即第三条记录,因为第一条记录的编号为0
    {
        qDebug()<<"rowNum is:"<<query.at()
                << "id is: " << query.value(0).toInt()
                << "firstname is :"<< query.value(1).toString()
                << "lastname is :"<< query.value(2).toString();
    }
    qDebug() << "exec last() :";
    if(query.last())
    //定位到结果集中最后一条记录
    {
        qDebug()<<"rowNum is:"<<query.at()
                << "id is: " << query.value(0).toInt()
                << "firstname is :"<< query.value(1).toString()
                << "lastname is :"<< query.value(2).toString();
    }
}

然后在widget.cpp文件中添加头文件。

#include <QSqlRecord>

运行程序,结果如下:

Qt数据库:(三)利用QSqlQuery类执行SQL语句(一)相关推荐

  1. [Qt教程] 第23篇 数据库(三)利用QSqlQuery类执行SQL语句

    [Qt教程] 第23篇 数据库(三)利用QSqlQuery类执行SQL语句 楼主  发表于 2013-5-15 22:39:29 | 查看: 813| 回复: 0 利用QSqlQuery类执行SQL语 ...

  2. 【Qt入门第23篇】 数据库(三)利用QSqlQuery类执行SQL语句

    导语 SQL即结构化查询语言,是关系数据库的标准语言.前面两节中已经在Qt里利用QSqlQuery类执行了SQL语句,这一节我们将详细讲解该类的使用.需要说明,因为我们重在讲解Qt中的数据库使用,而非 ...

  3. Qt数据库(三)利用QSqlQuery类执行SQL语句(一)

    本文章原创于www.yafeilinux.com 转载请注明出处. SQL即结构化查询语言,是关系数据库的标准语言.前面已经提到,在Qt中利用QSqlQuery类实现了执行SQL语句.需要说明,我们这 ...

  4. qt之QSqlQuery类执行SQL语句

    转载自:https://wizardforcel.gitbooks.io/qt-beginning/content/28.html 导语 SQL即结构化查询语言,是关系数据库的标准语言.前面两节中已经 ...

  5. 帝国cms php sql,帝国CMS下在PHP文件中调用数据库类执行SQL语句实例

    帝国CMS下在PHP文件中调用数据库类执行SQL语句实例 例1:连接MYSQL数据库例子.(a.php) db_close(); //关闭MYSQL链接$empire=null; //注消操作类变量? ...

  6. 云服务器怎么执行sql文件在哪里,总结帝国CMS下在PHP文件中怎么调用数据库类执行SQL语句实例...

    总结帝国CMS下在PHP文件中怎么调用数据库类执行SQL语句实例 发布时间:2020-10-19 14:58:08 来源:亿速云 阅读:83 作者:小新 这篇文章将为大家详细讲解有关总结帝国CMS下在 ...

  7. 帝国cms与mysql数据库_帝国CMS下在PHP文件中调用数据库类执行SQL语句实例

    例1:连接MYSQL数据库例子.(a.php) require('e/class/connect.php'); //引入数据库配置文件和公共函数文件 require('e/class/db_sql.p ...

  8. pdo_fetch执行mysql_PDO中执行SQL语句的三种方法

    在PDO中,我们可以使用三种方式来执行SQL语句,分别是 exec()方法,query方法,以及预处理语句prepare()和execute()方法~大理石构件来图加工 在上一篇文章<使用PDO ...

  9. python 执行sql语句_python中脚本怎么执行sql语句?

    python连接mysql并执行SQL语句的方法步骤: 1.创建与数据库连接对象 2.建立游标对象 3.利用游标对象 执行SQL语句命令 4.#提交到数据库 5.关闭游标对象 6.关闭数据库连接 7. ...

最新文章

  1. Linux 的相关介绍
  2. StringBuffer类的说明
  3. cmd连接mysql连接:mysql-h主机地址-u用户名-p用户密码(注:u与root可以不用加)
  4. pcb地线应该不应该做成环路_干货|图文详解EMC的PCB设计技术
  5. 森林门前的小路用计算机弹奏歌曲,抖音森林外的小路是什么歌 森林外的小路歌曲介绍...
  6. Android Alertdialog之多选对话框
  7. visa卡号生成器 在线_作为一名程序员,我都收集了哪些好玩的生成器?
  8. 点云数据的类型主要分为_点云数据处理方法概述
  9. DoTween函数汇总
  10. C语言如何输出100以内的质数?(带注释)
  11. Flink在流处理上的Source和sink操作、Flink--sink到kafka
  12. 满足功能安全要求的代码测试方案:Parasoft C++test
  13. 0.75次方怎么用计算机按,FR-E720-0.75K参数设置三菱FR-E720-0.75K指导手册(应用) - 三菱...
  14. 【字节跳动】2019后端笔试题
  15. 方法详解(命名规则)
  16. 齐次弦振动方程的matlab解法,ode45求解振动微分方程
  17. Spring Security安全机制
  18. ArcGIS教程:“格网和经纬网向导”快速浏览
  19. python做一个银行系统的gui_自助取款机系统(python+mysql+GUI)
  20. android控件向内弧度_android给View设置边框 填充颜色 弧度

热门文章

  1. (纪录片)数学的故事 The Story of Maths (2008)
  2. html怎么修改表格行列间距,html表格如何设置间距
  3. VS编译失败,找不到源文件!!!
  4. [论文解读]Going out on a limb: Joint Extraction of Entity Mentions and Relations without...
  5. 基于Javaweb实现的人脸识别考勤系统
  6. Bsp开发的几个层次
  7. Java WORD转换PDF 并添加水印 (附赠jar提取链接)
  8. jQuery使用ajaxSubmit()提交表单以及AjaxSubmit的一些用法
  9. jQuery使用ajaxSubmit()提交表单示例
  10. java md5加密长度_java中使用MD5加密算法进行加密