SQL数据库驱动
pro文件中添加如下一行代码
QT += sql widgets
main.cpp
#include <QApplication>
#include <QSqlDatabase>
#include <QStringList>
int main(int argc, char *argv[])
{QApplication a(argc, argv);qDebug() << "Available drivers:";//函数获取当前 Qt 环境下可用的数据库驱动名称列表,并将其存储到 QStringList 类型的变量 drivers 中QStringList drivers = QSqlDatabase::drivers();for(const QString&driver:drivers)qDebug() << driver;return a.exec();
}
主要目的是展示当前 Qt 开发环境下可用的数据库驱动有哪些,它本身没有实际连接和操作具体的数据库,但为后续基于 Qt 进行数据库相关开发(比如选择合适的数据库驱动去连接数据库、执行 SQL 查询等操作)提供了基础信息,帮助开发者了解系统的数据库驱动支持情况。
创建数据库连接
添加新的C++头文件,名称为connection.h
#ifndef CONNECTION_H
#define CONNECTION_H#include <QMessageBox>
#include <QSqlDatabase>
#include <QSqlQuery>static bool createConnection()
{QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");// 如果数据库文件不存在,SQLite会自动创建它db.setDatabaseName("test.db");if (!db.open()) {QMessageBox::critical(0, "Cannot open database","Unable to establish a database connection.", QMessageBox::Cancel);return false;}QSqlQuery query;/** 通过 query 对象执行一条 CREATE TABLE 的 SQL 语句,* 在数据库中创建一个名为 student 的表,该表包含两个列,* id 列的数据类型为整数(int )并且被设置为主键(primary key ),* name 列的数据类型为可变长度字符串(varchar ),最大长度为 20 个字符。*/query.exec("create table student (id int primary key, ""name varchar(20))");query.exec("insert into student values(0, 'LiMing')");query.exec("insert into student values(1, 'LiuTao')");query.exec("insert into student values(2, 'WangHong')");return true;
}#endif // CONNECTION_H
main.cpp文件中
#include <QApplication>
#include <QSqlDatabase>
#include <QStringList>
#include "connection.h"
#include <QVariant>
int main(int argc, char *argv[])
{QApplication a(argc, argv);if (!createConnection()) return 1;// 使用QSqlQuery查询整张表QSqlQuery query;query.exec("select * from student");while(query.next()) {qDebug() << query.value(0).toInt() << query.value(1).toString();}return a.exec();
}
#include <QApplication>
#include <QSqlDatabase>
#include <QStringList>
#include "connection.h"
#include <QVariant>
int main(int argc, char *argv[])
{QApplication a(argc, argv);if (!createConnection()) return 1;// 使用QSqlQuery查询整张表QSqlQuery query;query.exec("select * from student");while(query.next()) {qDebug() << query.value(0).toInt() << query.value(1).toString();}//就在student表中重新插入了一条记录query.exec("insert into student (id, name) values (100, 'ChenYun')");query.prepare("insert into student (id, name) values (:id, :name)");int idValue = 190;QString nameValue = "Chenzhen";query.bindValue(":id", idValue);query.bindValue(":name", nameValue);query.exec();return a.exec();
}
#include <QApplication>
#include <QSqlDatabase>
#include <QStringList>
#include "connection.h"
#include <QVariant>
int main(int argc, char *argv[])
{QApplication a(argc, argv);if (!createConnection()) return 1;// 使用QSqlQuery查询整张表QSqlQuery query;query.exec("select * from student");while(query.next()) {qDebug() << query.value(0).toInt() << query.value(1).toString();}//就在student表中重新插入了一条记录/*这里直接调用 QSqlQuery 类的 exec 函数,并传入一条完整的 INSERT INTO 类型的 SQL 语句。* 这条语句的作用是向名为 student 的数据库表中插入一条记录,* 指定了要插入的列 id 和 name ,以及对应的值分别为 100 和 'ChenYun'。* 通过这种方式,可以简单直接地向表中插入固定数据,* 适合在数据明确且不需要动态变化的情况下使用。*/query.exec("insert into student (id, name) values (100, 'ChenYun')");/** 首先调用 query.prepare 函数,传入一条带有命名占位符(这里使用 :id 和 :name 作为占位符)* 的 INSERT INTO 类型的 SQL 语句模板。这种方式允许我们先准备好 SQL 语句的结构,* 后续再动态地绑定具体的参数值,使得 SQL 语句可以在不同的数据情况下重复使用,增强了灵活性。接着定义了两个变量 idValue(整数类型,赋值为 190 )和nameValue(QString 类型,赋值为 "Chenzhen" ),这两个变量分别对应要插入到表中的 id 和 name 字段的值。然后通过 query.bindValue(":id", idValue); 和query.bindValue(":name", nameValue); 这两行代码,将具体的变量值绑定到对应的占位符上。bindValue 函数的第一个参数是占位符名称(要和 prepare 语句中的占位符严格对应),第二个参数是要绑定的值,这样就把实际的数据和 SQL 语句中的占位符关联起来了。最后调用 query.exec() 执行这条已经绑定好参数的 SQL 语句,将包含具体数据(id 为 190 ,name 为 "Chenzhen" )的记录插入到 student 表中。*/query.prepare("insert into student (id, name) values (:id, :name)");int idValue = 190;QString nameValue = "Chenzhen";query.bindValue(":id", idValue);query.bindValue(":name", nameValue);query.exec();/** 同样先调用 query.prepare 函数,不过这次使用的是 ? 作为占位符来构建 INSERT INTO 类型* 的 SQL 语句模板,这种占位符方式也是常见的参数化 SQL 语句的形式。然后定义了 idValue1(整数类型,赋值为 1009 )和 nameValue1(QString 类型,赋值为 "xiaoYun" )两个变量,用于存储要插入的数据。接着通过 query.addBindValue(idValue1); 和 query.addBindValue(nameValue1);依次将变量值添加到绑定参数列表中,按照顺序与 SQL 语句模板中的 ? 占位符一一对应,即第一个 addBindValue 绑定的值对应第一个 ? 占位符,第二个 addBindValue 绑定的值对应第二个 ? 占位符。最后执行 query.exec() ,将带有具体绑定参数(id 为 1009 ,name 为 "xiaoYun" )的SQL 语句提交给数据库执行,实现向 student 表中插入相应记录的操作。*/query.prepare("insert into student (id, name) values (?, ?)");int idValue1 = 1009;QString nameValue1 = "xiaoYun";query.addBindValue(idValue1);query.addBindValue(nameValue1);query.exec();return a.exec();
}
#include <QApplication>
#include <QSqlDatabase>
#include <QStringList>
#include "connection.h"
#include <QVariant>#include <QSqlError>int main(int argc, char *argv[])
{QApplication a(argc, argv);if (!createConnection()) return 1;// 使用QSqlQuery查询整张表QSqlQuery query;query.exec("select * from student");while(query.next()) {qDebug() << query.value(0).toInt() << query.value(1).toString();}//就在student表中重新插入了一条记录/*这里直接调用 QSqlQuery 类的 exec 函数,并传入一条完整的 INSERT INTO 类型的 SQL 语句。* 这条语句的作用是向名为 student 的数据库表中插入一条记录,* 指定了要插入的列 id 和 name ,以及对应的值分别为 100 和 'ChenYun'。* 通过这种方式,可以简单直接地向表中插入固定数据,* 适合在数据明确且不需要动态变化的情况下使用。*/query.exec("insert into student (id, name) values (100, 'ChenYun')");/** 首先调用 query.prepare 函数,传入一条带有命名占位符(这里使用 :id 和 :name 作为占位符)* 的 INSERT INTO 类型的 SQL 语句模板。这种方式允许我们先准备好 SQL 语句的结构,* 后续再动态地绑定具体的参数值,使得 SQL 语句可以在不同的数据情况下重复使用,增强了灵活性。接着定义了两个变量 idValue(整数类型,赋值为 190 )和nameValue(QString 类型,赋值为 "Chenzhen" ),这两个变量分别对应要插入到表中的 id 和 name 字段的值。然后通过 query.bindValue(":id", idValue); 和query.bindValue(":name", nameValue); 这两行代码,将具体的变量值绑定到对应的占位符上。bindValue 函数的第一个参数是占位符名称(要和 prepare 语句中的占位符严格对应),第二个参数是要绑定的值,这样就把实际的数据和 SQL 语句中的占位符关联起来了。最后调用 query.exec() 执行这条已经绑定好参数的 SQL 语句,将包含具体数据(id 为 190 ,name 为 "Chenzhen" )的记录插入到 student 表中。*/query.prepare("insert into student (id, name) values (:id, :name)");int idValue = 190;QString nameValue = "Chenzhen";query.bindValue(":id", idValue);query.bindValue(":name", nameValue);query.exec();/** 同样先调用 query.prepare 函数,不过这次使用的是 ? 作为占位符来构建 INSERT INTO 类型* 的 SQL 语句模板,这种占位符方式也是常见的参数化 SQL 语句的形式。然后定义了 idValue1(整数类型,赋值为 1009 )和 nameValue1(QString 类型,赋值为 "xiaoYun" )两个变量,用于存储要插入的数据。接着通过 query.addBindValue(idValue1); 和 query.addBindValue(nameValue1);依次将变量值添加到绑定参数列表中,按照顺序与 SQL 语句模板中的 ? 占位符一一对应,即第一个 addBindValue 绑定的值对应第一个 ? 占位符,第二个 addBindValue 绑定的值对应第二个 ? 占位符。最后执行 query.exec() ,将带有具体绑定参数(id 为 1009 ,name 为 "xiaoYun" )的SQL 语句提交给数据库执行,实现向 student 表中插入相应记录的操作。*/query.prepare("insert into student (id, name) values (?, ?)");int idValue1 = 1009;QString nameValue1 = "xiaoYun";query.addBindValue(idValue1);query.addBindValue(nameValue1);query.exec();/*首先,调用 QSqlQuery 类的 prepare 函数来准备一条 INSERT INTO 类型的 SQL 语句模板。* 这里使用 ? 作为占位符,表明后续会为这两个位置(对应 id 和 name 字段)动态绑定具体的值。* 通过提前准备语句模板的方式,可以提高执行多条结构相似的 SQL 语句时的效率,* 因为数据库系统通常会对预编译的语句进行优化处理。*/query.prepare("insert into student (id, name) values (?, ?)");/** 创建 QVariantList 用于存储 id 值:创建了一个 QVariantList 类型的列表 ids。QVariantList 是 Qt 中的一种容器,它可以存储多种不同类型的数据(通过 QVariant 类型进行统一封装),在这里用于存储要插入到数据库表中 id 字段的值。填充 id 值到列表:使用 << 操作符向 ids 列表中依次添加了三个整数值 20、21 和 22,表示准备插入三条记录的 id 字段将分别使用这些值。绑定 id 值列表到 SQL 语句占位符:接着调用 query.addBindValue(ids); 将包含 id 值的列表绑定到 SQL 语句模板中第一个 ? 占位符对应的位置。这意味着数据库在执行时会将这个列表中的每个元素依次替换到该占位符处,用于多次插入操作中的 id 值部分。*/QVariantList ids;ids << 20 << 21 << 22;query.addBindValue(ids);QVariantList names;names << "xiaoming" << "xiaoliang" << "xiaogang";query.addBindValue(names);//执行批量插入操作及错误处理/** 执行批量插入:* 调用 query.execBatch() 函数来执行批量插入操作。* 这个函数会将之前绑定的 QVariantList 中的数据元素按照顺序,* 以批量的方式多次执行预编译的 SQL 语句(每次使用一组对应的占位符绑定值),* 向数据库表 student 中插入多条记录。* 如果批量插入操作成功执行,execBatch 函数返回 true;反之,* 如果在执行过程中出现问题,比如数据类型不匹配、违反表约束、数据库连接问题等,* 函数返回 false。* 错误处理:* 通过 if 语句判断 execBatch 函数的返回值,如果为 false,即插入操作失败,* 就调用 query.lastError() 获取最后一次发生的错误信息,并通过 qDebug()* 将错误信息输出到控制台(一般是程序运行时所在的终端环境)。这样在出现插入失败的情况时,* 可以方便地查看具体是什么原因导致的问题,便于进行调试和修复。*/if(!query.execBatch()) qDebug() << query.lastError();/*这行代码执行了一条 UPDATE 类型的 SQL 语句,* 目的是更新数据库中 student 表内的数据。* 具体来说,它要将表中满足 id = 20 这个条件的记录的 name 字段值更新为 'xiaohong'。* 也就是在 student 表中查找 id 为 20 的那行记录,然后把该行记录对应的 name 字段原来的* 值替换成 'xiaohong'。*/query.exec("update student set name = 'xiaohong' where id = 20"); // 更新/** 这行代码执行的是一条 DELETE FROM 类型的 SQL 语句,* 用于从数据库的 student 表中删除满足特定条件的数据记录。* 在这里的作用是删除 student 表中 id 等于 1009 的那条记录。* 只要表中存在 id 为 1009 的记录,执行这条语句后,该记录就会被从表中永久删除。*/query.exec("delete from student where id = 1009"); // 删除return a.exec();
}
#include <QApplication>
#include <QSqlDatabase>
#include <QStringList>
#include "connection.h"
#include <QVariant>
#include <QDebug>
#include <QSqlError>int main(int argc, char *argv[])
{QApplication a(argc, argv);if (!createConnection()) return 1;QSqlDatabase::database().transaction();QSqlQuery query;query.exec("SELECT id FROM student WHERE name = 'LiuTao'");if (query.next() == true){qDebug() << "-------" ;int employeeId = query.value(0).toInt();qDebug() << "id:" << employeeId ;int newId = employeeId + 999;query.exec("INSERT INTO student (id, name) VALUES (" + QString::number(newId) + ", 'Jack')");}QSqlDatabase::database().commit();return a.exec();
}