Qt中的数据库(简单使用)

在Qt中支持对数据库的操作

Qt中数据库的类有:

  • 驱动层:为具体的数据库和SQL接口层之间提供底层的桥梁
  • SQL层:提供对数据库的访问
    • QSqlDateBase类用来创建连接
    • QSqlQuery可以使用SQL语句实现交互
  • 用户接口层:实现将数据库中的数据链接到窗口部件中

想要使用数据库需要在pro文件中添加:QT+=sql

一:连接数据库

常用的数据库驱动:

驱动名称数据库
QDB2IBM DB2
QIBASEBorland InterBase
QMYSQLMySQL
QOCIOracle Call Interface Driver
QODBCOpen Database Connectivity(ODBC、SQL Server)
QPSQLPostgreSQL
QSQLITE2SQLite版本2
QSQLITESQLite版本3

 QSqlDatabase类:

QSqlDatabase类提供通过连接访问数据库的接口。

常用函数:

addDataBase()添加驱动
setHostName()设置连接的主机名
setDataBaseName()设置连接的数据库的名称
setUserName()设置使用者名称
setPassword()设置连接密码
setPort()设置端口
removeDataBase()从数据库连接列表中删除数据库连接名称
open()使用当前连接值打开数据库连接。成功回报;否则返回 
close()关闭连接
isValid()是否为有效的驱动        
exec()

在数据库上执行 SQL 语句并返回 QSQLQuery对象

lastError()返回最后一个错误
driver()返回用于访问数据库连接的数据库驱动程序
drivers()返回全部可用的驱动
commit()提交事务

1.返回可用的数据库驱动:

    QSqlDatabase db;
    qDebug()<<db.drivers();

 2.创建一个数据库连接

连接 SQL Server的话可以点击该链接,这位大佬总结的比较详细:

Qt与SQL server的连接使用_YJin_Woo的博客-CSDN博客_qt sql serverchaungjian

以下为我总结上面大佬的笔记:

  1. 先创建数据库,然后创建相应的表
  2. 点击安全性
    1. 创建一个新的登录名,设置好登录名和密码
    2. 点击用户映射,选择项目中使用的数据库,点击确定
    3. 右键点击新的登录名,然后点击属性,选择数据库角色
  3. 创建一个ODBC
    1. 电脑上搜索ODBC,点击添加,选择SQL Server,然后设置名称和服务器,描述的话可有可无。名称的话可以随便起一个,服务器的话就是你登录SQL Server的账户

     设置完后进入该页面:填入在安全性中创建的登录名和密码

    之后直确定就可以。

在QT上进行连接:

首先要在pro文件中添加QT+=sql

在main文件中添加以下代码:


    QSqlDatabase db=QSqlDatabase::addDatabase("QODBC");//设置数据库驱动 这里使用的是SQL Server
    db.setHostName("127.0.0.1");//设置主机名称,本地主机为127.0.0.1
    db.setDatabaseName("1234");//添加数据源,在ODBC中添加的
    db.setUserName("aaa");//登录名称,在SQL Server中添加的登录名
    db.setPassword("123456");//密码,在SQL Server中添加的登录名的密码
    if(!db.open())
    {
        qDebug()<<"打开失败";
    }
    else
    {
        qDebug()<<"打开成功";
    }

在我这里测试成功:

 移除数据库连接

  • 首先使用 close()函数关闭连接
  • 再使用removeDataBase()函数进行删除

使用QSqlQuery对数据库进行操作:

QSqlQuery 封装了从再QSqlDataBase 上执行的 SQL 查询中创建、导航和检索数据所涉及的功能。它可用于执行 DML(数据操作语言)语句,例如 、 和 ,以及 DDL(数据定义语言)语句

构造函数:

 常用的函数:

exec()执行SQL语句(执行成功返回true)
prepare()准备要执行的 SQL 查询查询
addBindValue()使用位置值绑定时,将值 val 添加到值列表中。addBindValue() 调用的顺序决定了值将在准备好的查询中绑定到哪个占位符。
bindValue()设置占位符的值
at()获取当前位置
clear()清除结果集并释放相关资源
execBatch()批量执行以前准备好的 SQL 查询
frist()返回第一条数据
last()返回最后一条数据
isSelect()判断是否是查询语句
isValid()查询的是否是有效数据
lastQuery()返回当前查询的文本
next()检索下一条记录
size()返回结果的大小()行数
value()返回当前记录中字段的索引值

创建一个QSqlQuery对象并执行一条语句:

 创建一个QSqlQuery对象时,可以指定是哪一个数据库,不指定的话使用默认连接。

 创建一个Person表:

    QSqlQuery query;
    query.exec("create table Person("
               "id int identity(1000,1) primary key  not null,"
               "name char(10)not null,"
               "pnumber int not null,"
               "age int not null,"
               "height int not null,)");

 在表中添加数据:

    QSqlQuery query;
    query.exec("insert into Person"
               "value('王',123456,12,150),('赵',456789,15,160)");

 遍历整个结果:

    if(query.exec("select * from Person"))//如果查询成功
    {
        while(query.next())
        {
            //每一条记录有5个数据使用value(0-4)来访问
            //query.value()的数据类型为QVariant,输出数据时需要强制转换
            qDebug()<<query.value(0).toInt();
            qDebug()<<query.value(1).toString();
            qDebug()<<query.value(2).toInt();
            qDebug()<<query.value(3).toInt();
            qDebug()<<query.value(4).toInt();
        }
    }

 定位:

  • frist()第一条数据
  • last()最后一条数据
  • seek(int n)定位到第n条数据    位置从0开始计算

获取第一条数据:

    QSqlQuery query;
    query.exec("select * from Person");
    query.first();//获取第一条数据
    qDebug()<<query.value(0).toInt();
    qDebug()<<query.value(1).toString();
    qDebug()<<query.value(2).toInt();
    qDebug()<<query.value(3).toInt();
    qDebug()<<query.value(4).toInt();

 获取最后一条数据:

    QSqlQuery query;
    query.exec("select * from Person");
    query.last();//获取最后一条数据
    qDebug()<<query.value(0).toInt();
    qDebug()<<query.value(1).toString();
    qDebug()<<query.value(2).toInt();
    qDebug()<<query.value(3).toInt();
    qDebug()<<query.value(4).toInt();

使用seek()定位:

    QSqlQuery query;
    query.exec("select * from Person");
    query.seek(1);//获取第2条数据
    qDebug()<<query.value(0).toInt();
    qDebug()<<query.value(1).toString();
    qDebug()<<query.value(2).toInt();
    qDebug()<<query.value(3).toInt();
    qDebug()<<query.value(4).toInt();

 使用prepare()函数来进行准备执行语句:

  • 名称绑定   占位符格式为     :XXX    一定要加:
    • 使用bindValue()来设置值
  • 位置绑定   使用?来表示
    • ​​​​​​​使用addBindValue()来设置值

名称绑定:

    query.prepare("insert into Person values(:n1,:n2,:n3,:n4)");
    //添加数据,使用了name,number,age,height占位符
    char a[10]="李";
    int b=1234567;
    int c=16;
    int d=170;

    query.bindValue(":n1",a);
    query.bindValue(":n2",b);
    query.bindValue(":n3",c);
    query.bindValue(":n4",d);
    query.exec();//执行以上语句

 位置绑定:

    query.prepare("insert into Person values(?,?,?,?)");
    char a[10]="张";
    int b=2345678;
    int c=17;
    int d=175;

    query.addBindValue(a);
    query.addBindValue(b);
    query.addBindValue(c);
    query.addBindValue(d);
    query.exec();//执行以上语句

 批量添加数据:

  • 使用QVaiantList 存储数据
  • 使用addBindValue()添加数据
  • 使用execBatch()执行
    query.prepare("insert into Person values(?,?,?,?)");
    QVariantList list1;
    list1<<"谢"<<"宋"<<"邱";
    query.addBindValue(list1);
    QVariantList list2;
    list2<<12121212<<13131313<<14141414;
    query.addBindValue(list2);
    QVariantList list3;
    list3<<18<<19<<20;
    query.addBindValue(list3);
    QVariantList list4;
    list4<<180<<185<<190;
    query.addBindValue(list4);
    query.execBatch();//执行以上语句

 在Qt数据库中使用事务:

  • hasFeature()检测是否支持事务
  • transaction()启动一个事务
  • commit()提交
  • rollback()回滚

 

 

  • 3
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt,可以使用`QSqlDatabase`类连接和操作数据库,同时还提供了一些其他的数据库类,如`QSqlQuery`、`QSqlTableModel`、`QSqlRelationalTableModel`等,用于执行SQL查询、管理数据表、设置关系等操作。下面以MySQL数据库为例,介绍一些常用的数据库类的使用方法。 1. 连接数据库 使用`QSqlDatabase`类连接数据库,可以参考前面的回答。连接成功后,可以使用`QSqlQuery`类执行SQL查询语句。 2. 执行SQL查询 使用`QSqlQuery`类可以执行SQL查询语句,例如: ``` QSqlQuery query; query.exec("SELECT * FROM myTable"); while (query.next()) { // 处理查询结果 } ``` 这里执行了一个简单的查询语句,返回`myTable`表的所有数据,并使用`while`循环遍历查询结果。在`while`循环,可以使用`query.value()`函数获取指定列的值。 3. 插入数据 使用`QSqlQuery`类可以执行SQL插入语句,例如: ``` QSqlQuery query; query.prepare("INSERT INTO myTable (name, age) VALUES (:name, :age)"); query.bindValue(":name", "Tom"); query.bindValue(":age", 20); query.exec(); ``` 这里执行了一个简单的插入语句,将一个名为`Tom`,年龄为`20`的记录插入到`myTable`表。 4. 更新数据 使用`QSqlQuery`类可以执行SQL更新语句,例如: ``` QSqlQuery query; query.prepare("UPDATE myTable SET age=:age WHERE name=:name"); query.bindValue(":age", 25); query.bindValue(":name", "Tom"); query.exec(); ``` 这里执行了一个简单的更新语句,将`myTable`表名为`Tom`的记录的年龄更新为`25`。 5. 删除数据 使用`QSqlQuery`类可以执行SQL删除语句,例如: ``` QSqlQuery query; query.prepare("DELETE FROM myTable WHERE name=:name"); query.bindValue(":name", "Tom"); query.exec(); ``` 这里执行了一个简单的删除语句,将`myTable`表名为`Tom`的记录删除。 6. 使用模型类管理数据表 在Qt使用`QSqlTableModel`类可以管理数据表,例如: ``` QSqlTableModel model; model.setTable("myTable"); model.setFilter("name='Tom'"); model.select(); ``` 这里创建了一个`QSqlTableModel`对象`model`,并设置其操作的数据表名为`myTable`,筛选条件为名字为`Tom`的记录。最后,调用`select()`函数执行查询操作。 7. 设置数据表关系 在Qt使用`QSqlRelationalTableModel`类可以设置数据表之间的关系,例如: ``` QSqlRelationalTableModel model; model.setTable("myTable"); model.setRelation(1, QSqlRelation("myTable2", "id", "name")); model.select(); ``` 这里设置了`myTable`表和`myTable2`表之间的关系,将`myTable`表的第二列(即`id`列)与`myTable2`表的`id`列关联起来,并在`myTable`表显示`myTable2`表`name`列的值。最后,调用`select()`函数执行查询操作。 以上是一些常用的数据库类的使用方法,需要根据实际需求进行具体的操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值