qt 操作 SQLite数据库
关于QSLite
SQLite 是一个软件库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。可以集成在其他软件中,非常适合嵌入式系统。
Qt5及以上版本已集成QSLite。
准备
- 需要在
.pro
文件中加入语句
QT += sql
- 添加头文件
#include <QSqlError>
#include <QSqlDatabase>
#include <QSqlQuery>
使用
需要用到#include <QSqlDatabase>
头文件
建立数据库
设置数据库名称、数据库登录主机名、用户名、密码
QSqlDatabase database;
database = QSqlDatabase::addDatabase("QSQLITE");
database.setDatabaseName("MyDataBase.db"); //数据库名
//设置主机名、用户名、密码。可省略
database.setHostName("acidalia");
database.setUserName("zheng");
database.setPassword("123456");
数据库登录主机名、用户名、密码可省略不写
打开数据库
if (!database.open())
{
qDebug() << "Error: Failed to connect database." << database.lastError();
}
else
{
qDebug() << "Succeed to connect database." ;
}
open()
函数用于打开数据库,成功返回True,失败False
lastError()
返回有关数据库上发生的最后一个错误的信息。
关闭数据库
database.close();
操作数据库
需要用到#include <QSqlQuery>
头文件
创建表格
创建一个名为student的表格,表格包含三列,第一列是id,第二列是名字,第三列是年龄。
QSqlQuery sql_query;
if(!sql_query.exec("create table student (id int primary key, name varchar(30), age int)"))
{
qDebug() << "Error: Fail to create table." << sql_query.lastError();
}
else
{
qDebug() << "Table created!";
}
exec(const QString &query)
执行查询中的SQL。如果执行成功,则返回true并将查询状态设置为active;否则返回false。查询字符串必须使用与要查询的SQL数据库(例如,标准SQL)相应的语法。
调用exec()
时,此查询的最后一个错误将被重置。
对于SQLite,查询字符串一次只能包含一个语句。如果给定多个语句,则函数返回false。
插入数据
- 方法一
if(!sql_query.exec("INSERT into student values(1,\"zhangSan\",16)"))
{
qDebug() << "Error:insert fail 1." << sql_query.lastError();
}
- 方法二
sql_query.prepare("insert into student values(?,?,?)");
int id_test = 2;
sql_query.addBindValue(id_test);
sql_query.addBindValue("xiaoMing");
sql_query.addBindValue(15);
if(!sql_query.exec())
{
qDebug() << "Error:insert fail 2." << sql_query.lastError();
}
prepare()
准备要执行的SQL查询查询。如果查询准备成功,则返回true;否则返回false。
addBindValue()
与 prepare()
一起用,三个addBindValue
分别绑定prepare()
中的第一、二、三个?
。
- 方法三
sql_query.prepare("INSERT INTO student (id, name, age) "
"VALUES (:id, :name, :age)");
sql_query.bindValue(":id", 3);
sql_query.bindValue(":name", "Bart");
sql_query.bindValue(":age", 18);
if(!sql_query.exec())
{
qDebug() << "Error:insert fail 3" << sql_query.lastError();
}
bindValue(" ", " ")
函数用来把语句中的待定变量换成确定值。如:id
,:name
,:age
修改数据(更新数据)
- 方法一
sql_query.exec("update student set name = \"QT\" where id = 1");
if(!sql_query.exec())
{
qDebug() << sql_query.lastError();
}
- 方法二
sql_query.prepare("update student set name = :name where id = :id");
sql_query.bindValue(":name","C++");
sql_query.bindValue(":id",2);
if(!sql_query.exec())
{
qDebug()<<"Error:update fail." << sql_query.lastError();
}
查询数据
sql_query.exec("select * from student");
if(!sql_query.exec())
{
qDebug() <<"Error:selet fail"<<sql_query.lastError();
}
else
{
while(sql_query.next())
{
int id = sql_query.value(0).toInt();
QString name = sql_query.value(1).toString();
int age = sql_query.value("age").toInt();
qDebug()<<QString("id:%1 name:%2 age:%3").arg(id).arg(name).arg(age);
}
}
next
检索结果中的下一条记录(如果可用),并将查询定位到检索到的记录上。请注意,结果必须处于活动状态,并且isSelect()必须在调用此函数之前返回true,否则它将不执行任何操作并返回false。
value(0)
表示第一个数据,即id,value(1)
表示name(也可用value("name")
来表示name)。注意:value()函数的返回值类型是QVariant,因此要用toInt()等函数转换成特定的类型。
删除数据
- 删除单个数据
sql_query.prepare("delete from student where id = ?");
sql_query.addBindValue(1);
//sql_query.exec("delete from student where id = 1");
if(!sql_query.exec())
{
qDebug() << sql_query.lastError();
}
- 清空表格里的所有数据
if(!sql_query.exec("delete from student"))
{
qDebug() <<sql_query.lastError();
}
删除表格
if(!sql_query.exec("drop table student"))
{
qDebug()<<sql_query.lastError();
}
else {
qDebug() << "table cleared";
}