当前位置: 首页 > article >正文

Qt开发:QSqlDatabase的常见用法

文章目录

    • 一、概述
    • 二、使用流程
    • 三、常用函数的介绍
    • 四、使用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.kler.cn/a/510232.html

相关文章:

  • 【Spring Boot】掌握 Spring 事务:隔离级别与传播机制解读与应用
  • Rust Actix Web 项目实战教程 mysql redis swagger:构建用户管理系统
  • 通过idea创建的springmvc工程需要的配置
  • 【人工智能】:搭建本地AI服务——Ollama、LobeChat和Go语言的全方位实践指南
  • Java开发提效秘籍:巧用Apache Commons IO工具库
  • python实现pdf转word和excel
  • JAVA实现捡金币闯关小游戏(附源码)
  • xclip和xsel命令行工具详解
  • 大语言模型的语境中“越狱”和思维链
  • 最新-CentOS 7安装Docker容器(适合本地和云服务器安装)
  • 统信V20 1070e X86系统编译安装PostgreSQL-13.11版本以及主从构建
  • 嵌入式工程师必学(67):SWD仿真接口(for ARM)的使用方法
  • 在 Windows 上,如果忘记了 MySQL 密码 重置密码
  • 软考中级复习篇章:数据结构部分的复习
  • 2024年,我的技术探索与成长之路
  • Java(面向对象进阶——接口)
  • springboot基于微信小程序的停车场预订系统
  • 移远通信多模卫星通信模组BG95-S5获得Skylo网络认证,进一步拓展全球卫星物联网市场
  • 基于Java+MySQL实现在线作业提交系统
  • Android 上删除的短信存储在哪里 - 如何恢复
  • dl学习笔记:(4)简单神经网络
  • Java杂记:@TableField注解用法详解
  • HTTPS与HTTP:区别及安全性对比
  • Linux:指令大全(一)
  • Ubuntu把应用程序放到桌面
  • FastAPI 应用的容器化与 Docker 部署:提升性能与可扩展性