Qt开发: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();
}
原文地址:https://blog.csdn.net/TechNomad/article/details/145175666
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!