Qt开发:QSqlDatabase的常见用法

文章目录

一、概述

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

特点:

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

二、使用流程

1.初始化数据库驱动

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

cpp 复制代码
#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() 方法打开数据库连接。

cpp 复制代码
#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 查询和操作。

cpp 复制代码
#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.关闭数据库连接

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

cpp 复制代码
// 关闭数据库连接
db.close();

三、常用函数的介绍

cpp 复制代码
static QSqlDatabase addDatabase(const QString& type, const QString& connectionName = QLatin1String(defaultConnection));

函数作用:

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

函数作用:

  • 用于设置数据库连接的名称,通常是数据库文件名或者连接字符串
cpp 复制代码
void QSqlDatabase::setHostName(const QString &host);
void QSqlDatabase::setUserName(const QString &name);
void QSqlDatabase::setPassword(const QString &password);

函数作用:

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

函数作用:

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

函数作用:

  • 用于关闭数据库连接。
cpp 复制代码
QSqlError QSqlDatabase::lastError() const;

函数作用:

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

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

cpp 复制代码
#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使用查询数据表中的数据

cpp 复制代码
#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更新数据表中的数据

cpp 复制代码
更新数据表的某一条数据

#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删除数据表中的数据

cpp 复制代码
#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();
}
相关推荐
CodeKwang2 小时前
Qt实战:简易Excel表格 | 附完整源码
qt·excel·qtabwidget·qt控件
r i c k3 小时前
数据库系统学习笔记
数据库·笔记·学习
野犬寒鸦3 小时前
从零起步学习JVM || 第一章:类加载器与双亲委派机制模型详解
java·jvm·数据库·后端·学习
IvorySQL4 小时前
PostgreSQL 分区表的 ALTER TABLE 语句执行机制解析
数据库·postgresql·开源
·云扬·4 小时前
MySQL 8.0 Redo Log 归档与禁用实战指南
android·数据库·mysql
IT邦德4 小时前
Oracle 26ai DataGuard 搭建(RAC到单机)
数据库·oracle
惊讶的猫4 小时前
redis分片集群
数据库·redis·缓存·分片集群·海量数据存储·高并发写
不爱缺氧i4 小时前
完全卸载MariaDB
数据库·mariadb
纤纡.4 小时前
Linux中SQL 从基础到进阶:五大分类详解与表结构操作(ALTER/DROP)全攻略
linux·数据库·sql
jiunian_cn5 小时前
【Redis】渐进式遍历
数据库·redis·缓存