Qt开发:QSqlDatabase的常见用法

devtools/2025/1/18 10:44:55/

文章目录

    • 一、概述
    • 二、使用流程
    • 三、常用函数的介绍
    • 四、使用QSqlDatabase创建数据表和插入数据
    • 五、使用QSqlDatabase使用查询数据表中的数据
    • 六、使用QSqlDatabase更新数据表中的数据
    • 七、使用QSqlDatabase删除数据表中的数据

一、概述

QSqlDatabase 是 Qt 中用于管理和访问数据库连接的类。它提供了一种统一的方式来连接不同的数据库引擎,执行 SQL 查询和操作数据库。它支持多种数据库管理系统(如 SQLite、MySQL、PostgreSQL 等),并提供了统一的 API 来进行数据库操作。
特点:

  • 支持连接多种数据库引擎,通过相应的驱动程序进行连接。
  • 提供了对数据库连接的管理和控制,包括连接建立、断开、事务控制等功能。
  • 可以执行 SQL 查询、事务操作、元数据查询等数据库操作。

二、使用流程

1.初始化数据库驱动
在使用 QSqlDatabase 之前,需要初始化并加载要使用的数据库驱动。常见的数据库驱动包括 QSQLITE、QMYSQL、QPSQL 等。

#include <QSqlDatabase>
#include <QSqlError>
#include <QDebug>int main(int argc, char *argv[]) 
{ QCoreApplication a(argc, argv);// 初始化数据库驱动QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");// 如果是 MySQL 或 PostgreSQL 等,可以将 "QSQLITE" 替换成对应的驱动名称// QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");// QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL"); return a.exec();
}

2.连接数据库
使用 setHostName()、setDatabaseName()、setUserName()、setPassword() 等方法设置数据库连接的参数,然后调用 open() 方法打开数据库连接。

#include <QSqlDatabase>
#include <QSqlError>
#include <QDebug>int main(int argc, char *argv[]) 
{ QCoreApplication a(argc, argv);// 设置数据库连接参数db.setHostName("localhost");db.setDatabaseName("mydatabase");db.setUserName("username");db.setPassword("password");// 打开数据库连接if (db.open()) {qDebug() << "Database connected!";} else {qDebug() << "Error opening database:" << db.lastError().text();}return a.exec();
}

3.执行 SQL 查询
一旦数据库连接成功,可以通过 QSqlQuery 对象执行 SQL 查询和操作。

#include <QSqlDatabase>
#include <QSqlError>
#include <QDebug>int main(int argc, char *argv[]) 
{ QCoreApplication a(argc, argv);// 创建 QSqlQuery 对象,并执行 SQL 查询QSqlQuery query;if (query.exec("SELECT * FROM mytable")) {while (query.next()) {QString name = query.value(0).toString();int age = query.value(1).toInt();qDebug() << "Name:" << name << ", Age:" << age;}} else {qDebug() << "Query failed:" << query.lastError().text();}return a.exec();

4.关闭数据库连接
在不再需要访问数据库时,应该关闭数据库连接。

// 关闭数据库连接
db.close();

三、常用函数的介绍

static QSqlDatabase addDatabase(const QString& type, const QString& connectionName = QLatin1String(defaultConnection));

函数作用:

  • 该函数用于添加一个数据库连接。
  • type 参数指定数据库驱动类型,例如 “QMYSQL”、“QSQLITE” 等。
  • connectionName 参数指定连接的名称,默认为 defaultConnection。
  • 返回一个 QSqlDatabase 对象,用于后续的数据库配置。
void setDatabaseName(const QString& name);

函数作用:

void QSqlDatabase::setHostName(const QString &host);
void QSqlDatabase::setUserName(const QString &name);
void QSqlDatabase::setPassword(const QString &password);

函数作用:

  • 用于设置数据库服务器的主机名、用户名和密码。
bool QSqlDatabase::open(const QString &user, const QString &password);
bool QSqlDatabase::isOpen() const;

函数作用:

  • open 用于打开数据库连接,参数为用户名和密码。
  • isOpen 用于检查数据库连接是否已经打开。
void QSqlDatabase::close();

函数作用:

QSqlError QSqlDatabase::lastError() const;

函数作用:

  • 用于获取数据库连接的最后一次错误。

四、使用QSqlDatabase创建数据表和插入数据

#include <QCoreApplication>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QDebug>int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);// 添加 SQLite 数据库连接QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");// 设置数据库连接属性db.setDatabaseName("user.db");  // 设置数据库文件名// 打开数据库连接if (db.open()) {qDebug() << "Database connected successfully";// 创建数据表QSqlQuery createTableQuery;if (createTableQuery.exec("CREATE TABLE IF NOT EXISTS users_info (id INTEGER PRIMARY 			      KEY AUTOINCREMENT, name TEXT, age INTEGER)")) {qDebug() << "Table created successfully";// 插入数据QSqlQuery insertDataQuery;if (insertDataQuery.exec("INSERT INTO users_info (name, age) VALUES ('John', 30), ('Alice', 25), ('Bob', 35)")) {qDebug() << "Data inserted successfully";} else {qDebug() << "Data insertion error:" << insertDataQuery.lastError().text();}} else {qDebug() << "Table creation error:" << createTableQuery.lastError().text();}// 关闭数据库连接db.close();} else {qDebug() << "Database connection error:" << db.lastError().text();}return a.exec();
}

输出结果:
在这里插入图片描述

五、使用QSqlDatabase使用查询数据表中的数据

#include <QCoreApplication>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QDebug>int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);// 添加 SQLite 数据库连接QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");// 设置数据库连接属性db.setDatabaseName("user.db");  // 设置数据库文件名// 打开数据库连接if (db.open()) {qDebug() << "Database connected successfully";// 查询数据表数据QSqlQuery query("SELECT * FROM users_info");// 执行查询if (query.exec()) {// 打印查询结果while (query.next()) {int id = query.value("id").toInt();QString name = query.value("name").toString();int age = query.value("age").toInt();qDebug() << "ID:" << id << "Name:" << name << "Age:" << age;}} else {qDebug() << "Query error:" << query.lastError().text();}// 关闭数据库连接db.close();} else {qDebug() << "Database connection error:" << db.lastError().text();}return a.exec();
}

输出结果:
在这里插入图片描述

六、使用QSqlDatabase更新数据表中的数据

更新数据表的某一条数据#include <QCoreApplication>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QDebug>int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);// 添加 SQLite 数据库连接QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");// 设置数据库连接属性db.setDatabaseName("user.db");  // 设置数据库文件名// 打开数据库连接if (db.open()) {qDebug() << "Database connected successfully";// 更新数据表数据QSqlQuery updateQuery;// 使用参数化查询,防止 SQL 注入攻击updateQuery.prepare("UPDATE users_info SET age = :newAge WHERE id = :userId");// 绑定参数updateQuery.bindValue(":newAge", 60);     // 新的年龄updateQuery.bindValue(":userId", 1);      // 待更新的用户ID// 执行更新if (updateQuery.exec()) {qDebug() << "Data updated successfully";} else {qDebug() << "Update error:" << updateQuery.lastError().text();}// 关闭数据库连接db.close();} else {qDebug() << "Database connection error:" << db.lastError().text();}return a.exec();
}

输出结果:
在这里插入图片描述

七、使用QSqlDatabase删除数据表中的数据

#include <QCoreApplication>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QDebug>#include <QCoreApplication>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QDebug>int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);// 添加 SQLite 数据库连接QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");// 设置数据库连接属性db.setDatabaseName("user.db");  // 设置数据库文件名// 打开数据库连接if (db.open()) {qDebug() << "Database connected successfully";// 删除数据表数据QSqlQuery deleteQuery;// 使用参数化查询,防止 SQL 注入攻击deleteQuery.prepare("DELETE FROM users_info WHERE id = :userId");// 绑定参数deleteQuery.bindValue(":userId", 1);  // 待删除的用户ID// 执行删除if (deleteQuery.exec()) {qDebug() << "Data deleted successfully";} else {qDebug() << "Delete error:" << deleteQuery.lastError().text();}// 关闭数据库连接db.close();} else {qDebug() << "Database connection error:" << db.lastError().text();}return a.exec();
}

在这里插入图片描述


http://www.ppmy.cn/devtools/151539.html

相关文章

解决Element Plus el-date-picker组件清空时,触发两次change的问题

问题 el-date-picker 组件在选择日期范围时会触发两次 change 事件。当用户选择了范围的开始时&#xff0c;会立即触发一次 change 事件。而当用户选择了范围的结束时&#xff0c;又会触发一次 change 事件。 解决方法 1. 延迟更新 <template><div>选择日期--{…

大疆最新款无人机发布,可照亮百米之外目标

近日&#xff0c;DJI 大疆发布全新小型智能多光旗舰 DJI Matrice 4 系列&#xff0c;包含 Matrice 4T 和 Matrice 4E 两款机型。DJI Matrice 4E 价格为27888 元起&#xff0c;DJI Matrice 4T价格为38888元起。 图片来源&#xff1a;大疆官网 DJI Matrice 4E DJI Matrice 4T D…

网络是怎么样连接的--输入www.baidu.com之后网络的底层运行

网络是怎么样连接的这本书就是在讲**浏览器输入一个网址之后&#xff0c;到页面渲染计算机网络层和软件层面发生了什么变化。** DNS解析 1.首先对网址进行解析&#xff0c;我们输入的一个http://www.baidu.com/ 如果后面不带任何的资源路径&#xff0c;默认访问的是跟目录下面…

关于php语言api接口开发的流程

确定接口需求&#xff1a;首先明确接口的功能和需求&#xff0c;包括输入参数、输出结果以及接口的业务逻辑。 设计接口路由&#xff1a;根据接口需求&#xff0c;设计具体的接口路由&#xff0c;即URL路径&#xff0c;用于访问接口。 搭建PHP环境&#xff1a;确保你的服务器上…

冒泡排序 选择排序 插入排序

package com.nobody.sort; /** author Mr.nobody Description 插入排序 date 2020/9/5 */ public class Code01_InsertionSort { public static void insertionSort(int[] arr) { // 数组为空&#xff0c;或者数组长度小于2就没必要操作 if (null arr || arr.length …

【机器学习实战入门】使用OpenCV和Keras的驾驶员疲劳检测系统

嗜睡驾驶者警报系统 防止司机疲劳驾驶警报系统 中级 Python 项目 - 司机疲劳检测系统 疲劳检测是一种安全技术&#xff0c;能够预防因司机在驾驶过程中入睡而造成的事故。 本中级 Python 项目的目标是建立一个疲劳检测系统&#xff0c;该系统将检测到一个人的眼睛闭合了一段时…

STM32 FreeRTOS时间片调度---FreeRTOS任务相关API函数---FreeRTOS时间管理

目录 时间片调度简介 FreeRTOS任务相关API函数介绍 延时函数介绍 时间片调度简介 在FreeRTOS中&#xff0c;同等优先级的任务会轮流分享相同的CPU时间&#xff0c;这个时间被称为时间片。在这里&#xff0c;一个时间片的长度等同于SysTick中断的周期。 FreeRTOS任务相关API…

使用Nginx正向代理让内网主机通过外网主机访问互联网

目录 环境概述 流程说明 在外网服务器上安装部署nginx? 安装前准备 下载nginx ?编译安装nginx 开始配置正向代理 创建systemd服务单元文件&#xff0c;用于管理Nginx服务的启动、停止和重新加载 启动nginx ?代理服务器本地验证 ?内网服务器验证 ?将代理地址添…