在Qt中支持对数据库的操作
Qt中数据库的类有:
- 驱动层:为具体的数据库和SQL接口层之间提供底层的桥梁
- SQL层:提供对数据库的访问
- QSqlDateBase类用来创建连接
- QSqlQuery可以使用SQL语句实现交互
- 用户接口层:实现将数据库中的数据链接到窗口部件中
想要使用数据库需要在pro文件中添加:QT+=sql
一:连接数据库
常用的数据库驱动:
驱动名称 | 数据库 |
QDB2 | IBM DB2 |
QIBASE | Borland InterBase |
QMYSQL | MySQL |
QOCI | Oracle Call Interface Driver |
QODBC | Open Database Connectivity(ODBC、SQL Server) |
QPSQL | PostgreSQL |
QSQLITE2 | SQLite版本2 |
QSQLITE | SQLite版本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
以下为我总结上面大佬的笔记:
- 先创建数据库,然后创建相应的表
- 点击安全性
- 创建一个新的登录名,设置好登录名和密码
- 点击用户映射,选择项目中使用的数据库,点击确定
- 右键点击新的登录名,然后点击属性,选择数据库角色
- 创建一个ODBC
- 电脑上搜索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()回滚