1、前置条件
模块
QT += sql
头文件
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlRecord>
QSqlDatabase:
QSqlDatabase是数据库连接管理类,用于建立和管理与数据库的连接。
它提供了静态方法来创建、关闭和访问数据库连接。
QSqlDatabase可以通过添加数据库驱动程序(如SQLite、MySQL等)来连接各种类型的数据库。
它还提供了一些方法来设置数据库连接参数、执行事务等。
QSqlQuery:
QSqlQuery用于执行SQL查询语句并获取结果。
它可以执行各种SQL操作,如SELECT、INSERT、UPDATE、DELETE等。
QSqlQuery提供了方法来绑定参数、执行查询、获取结果集、获取查询状态等。
它还支持对结果集进行遍历和访问,以获取查询结果的行和列数据。
QSqlRecord:
QSqlRecord是用于描述数据库表中每个字段(列)的元数据的类。
它包含了字段的名称、数据类型、长度等信息。
QSqlRecord通常与QSqlQuery配合使用,用于获取和处理查询结果的元数据。
它提供了方法来获取字段数量、字段名称、字段类型等信息。
QSqlDatabase负责管理数据库连接
QSqlQuery负责执行SQL查询并获取结果
QSqlRecord用于描述数据库表的字段元数据。
连接数据库
数据库名称:dbfile.db
QSqlDatabase sqldb;
sqldb = QSqlDatabase::addDatabase("QSQLITE");//添加驱动
sqldb.setDatabaseName("dbfile.db");
if (sqldb.open() == false)
//sqldb.open()打开数据库,返回bool值
{
QMessageBox::critical(0, "error", "Database opening failed!");
}
else
{
QMessageBox::information(0,"成功","成功!");
}
}
上述代码首先添加了驱动,然后设置了数据库名称,最后连接到数据库
注意:即使没有预先创建.db文件也不会打开失败,因为没有它会自己创建一个,文件的位置一般和.exe同目录,使用MSVC时可能会在上一级;
2、条件查询
QSqlDatabase db = QSqlDatabase::database(); // 获取已打开的数据库连接
if (db.isOpen()) {
QSqlQuery query(db);
query.prepare("SELECT DateTime FROM table WHERE Number_1 = ? AND Number_2 = ?");
//query.prepare(QString("SELECT DateTimeH_M_S FROM WaveformRecord WHERE Number_1 = %1 AND Number_2 = %2").arg("0").arg("1"));
query.bindValue(0, _number1); // 设置 Number_1 的条件值为 0
query.bindValue(1, _number2); // 设置 Number_2 的条件值为 1
if (query.exec()) {
while (query.next()) {
QString dateTimeHMS = query.value(0).toString();
}
}
else
{
}
}
基本流程如上,先获取连接,给到QSqlQuery。然后使用prepare函数添加要执行的语句,这里可以像上面一样通过bindValue添加变量,也可以通过字符串直接添加(注释所示) ,这里我的两个Number数据类型是integer,如果数据类型是text,则需要将内容用单引号’ '引上。
最后通过exec函数执行,next函数进行移动,value函数获取内容,这样就通过遍历获取到了所查询的内容
exec()函数:
exec()函数用于执行SQL查询语句,并返回其执行结果。
它接受一个包含有效SQL语句的QString作为参数。
当执行成功时,exec()函数返回true;当执行失败时,返回false。
在执行SELECT查询时,通过exec()函数获取结果集,可以使用next()函数来遍历结果。
next()函数:
next()函数用于在执行SELECT查询后,逐行移动到结果集中的下一行数据。
它返回一个布尔值,指示是否成功移动到下一行。
在每次调用next()函数之前,需要确保exec()函数已经成功执行并返回了结果集。
可以在循环中使用next()函数来遍历结果集,直到遍历完所有行或得到所需的数据。
value()函数:
QSqlQuery的value()函数用于从查询结果集中获取指定字段的值。
该函数有多个重载形式,可以根据需要选择适合的形式。以下是常用的两种形式:
QVariant value(int index) const:
通过索引获取字段的值。
参数index表示结果集中字段在查询语句中的顺序位置,从0开始计数。
返回一个QVariant对象,可以根据具体的字段类型使用toXXX()方法将其转换为相应的数据类型。
QVariant value(const QString& name) const:
通过字段名称获取字段的值。
参数name表示结果集中字段的名称,与查询语句中SELECT子句中的列名对应。
返回一个QVariant对象,可以根据具体的字段类型使用toXXX()方法将其转换为相应的数据类型。
3、插入内容
// 获取数据库连接
QSqlDatabase db = QSqlDatabase::database();
// 插入数据
QSqlQuery query;
query.prepare("INSERT INTO table (Number_1, DateTimeY_M_D, Number_2, DateTimeH_M_S, Name) "
"VALUES (:number_1, :dateYMD, :number_2, :dateHMS, :name)");
query.bindValue(":number_1", _number_1);
query.bindValue(":dateYMD", _strYMD);
query.bindValue(":dateHMS", _strHMS);
query.bindValue(":number_2", _number_2);
query.bindValue(":name", _name);
if(query.exec())
{
qDebug() << "数据插入成功!";
return true;
}
else
{
qDebug() << "数据插入失败!";// << query.lastError().text();
return false;
}
比查询还简单点,插入操作执行完就没有后续了,少了循环遍历结果的部分。
删除、修改操作也是同理
qt关于sqlite的简单内容就这些,增删改查,用到的类和函数只有几个,唯一需要注意的就是sql语句了,毕竟错了编译器检查不出来,要细心点