Qt5.14.2 无所不能的Qt数据库操作之旅


身为程序员,数据库无疑是我们最为亲密无间的好伙伴。但如何高效地操作数据库,却一直是一个令人颇感棘手的难题。不过,没关系,我们的Qt大神们早已为此开辟出一条华丽绝伦的大道,就让我带你一览他们的绝世数据库操作艺术吧!


一、查询驱动,方能驱车万里


在对数据库开展操作之前,我们首先需要明确该使用何种驱动程序。而对于Qt大神来说,这个问题轻而易举:

QStringList drivers = QSqlDatabase::drivers();
foreach(QString driver, drivers)
    qDebug() << driver;

QSqlDatabase::drivers()这个静态方法会为我们列出Qt当前支持的所有SQL数据库驱动,包括:

QSQLITE
QMYSQL
QMYSQL3
QPSQL
QPSQL7
QOCI 
QTDS
QODBC
QODBC3
QIBASE
QDB2

要启用某个驱动,只需在构建Qt时将其编译进来即可。比如在Windows下启用ODBC驱动:

QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");

ODBC(Open Database Connectivity)是Microsoft推出的数据库连接标准,Qt通过QODBC驱动就能支持任何ODBC兼容的数据库,包括Access、SQL Server、Oracle等等。

接下来,让我们使用Qt连接并操作一个Access数据库,一睹Qt数据库艺术的绝世风采!


二、马到成功,QODBC唱主角


连接Access数据库的第一步,就是设置正确的数据源名称(DSN):

db.setDatabaseName("Driver={Microsoft Access Driver (*.mdb, *.accdb)};FIL={MS Access};DBQ=C:/myDatabase.accdb");
if(db.open())
{
    // 连接成功
}

这里我们将FIL设置为"{MS Access}"就可以使用系统默认的MS Access数据源。而DBQ则指明了数据库文件的实际路径。

一旦打开连接,我们就可以执行各种SQL语句了:

// 插入记录
QSqlQuery query;
query.exec("INSERT INTO students (name, class, age) "
           "VALUES ('Raphael', '5A', 10)");

// 查询记录 
model = new QSqlQueryModel(this);
model->setQuery("SELECT name, class, age FROM students");
ui->tableView->setModel(model);

// 带参数查询
QString name = ui->nameEdit->text();
QString queryStr = "SELECT name, class, age "
                   "FROM students WHERE name = ?";
query.prepare(queryStr);
query.addBindValue(name);
query.exec();

上面的代码为我们一一示范了如何在Qt中通过QSqlQuery类插入、查询和更新数据库记录。

使用很熟悉的SQL语句即可完成基本操作,另外QSqlQueryModel还提供了将SQL查询结果直接绑定到QTableView之类的Model/View UI控件上的便利功能。


总的来说,通过QODBC驱动,我们可以轻松高效地连接和操控各种数据库。这只是Qt数据库操作能力的一个简单示例,它的本领其实远不止如此,往下看,你就会慢慢体会到Qt数据库编程魅力了!


我们见识了Qt通过QODBC驱动连接和操作Access数据库的基本方法。而这仅仅是Qt数据库编程能力的一斑而已,接下来就让我们继续一同欣赏Qt大神们在这一领域内更为精深的绝世功夫。


三、QLite数据库,娇小玲珑胜无垠


在桌面和移动平台上,SQLite数据库无疑是最为常见和便捷的存储手段了。而要想在Qt中使用它,用这一手就绰绰有余:

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("reader.db");
if (!db.open()) return;

// 创建表格
QSqlQuery query;
query.exec("CREATE TABLE IF NOT EXISTS books ("
           "id INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE NOT NULL, "
           "title VARCHAR(40) NOT NULL, "
           "author VARCHAR(40) NOT NULL)");

// 插入新记录            
query.prepare("INSERT INTO books (title, author) "
              "VALUES (:title, :author)");
query.bindValue(":title", title);
query.bindValue(":author", author);
query.exec();

// 查询
query.prepare("SELECT id, title, author FROM books");
if (!query.exec()) qDebug() << query.lastError();
else {
    while(query.next()) {
        int id = query.value(0).toInt();
        QString title = query.value(1).toString();
        QString author = query.value(2).toString();
    }
}

Qt的SQLite支持是直接内置的,我们无需任何外部依赖,只需简单新建QSqlDatabase实例并指定"QSQLITE"驱动类型即可。

接下来我们可以像其他数据库一样,通过SQL语句自由创建和操作表格。使用QSqlQuery执行查询和插入,绑定参数,获取结果集等等都是理所当然的事情。

值得一提的是,SQLite在桌面/嵌入式平台中使用无需服务器进程,直接以文件形式跨平台访问,使用非常方便。这也是为什么Qt对其有着非常好的开箱即用支持。


四、封装数据库,万变不离其宗


任何一个出色的程序员,都不应当拘泥于底层API,而是要通过良好的设计模式和封装,构建出更高层次的数据库编程模型。看看Qt大神们是如何做到这一点的:

class DatabaseManager : public QObject
{
    Q_OBJECT

public:
    explicit DatabaseManager(const QString &path, QObject *parent = nullptr);
    bool addBook(const Book &book);
    QList<Book> getAllBooks() const;

private:
    QSqlDatabase m_db;
    bool openDatabase();
    bool createTables();

};

DatabaseManager::DatabaseManager(const QString &path, QObject *parent)
        : QObject(parent), m_db(QSqlDatabase::addDatabase("QSQLITE"))
{
    m_db.setDatabaseName(path);
}

bool DatabaseManager::openDatabase()
{
    if (m_db.open()) {
        return createTables();
    } else {
        qDebug() << "Error: Failed to connect to database.";
        return false;
    }
}
bool DatabaseManager::createTables()
{
    QSqlQuery query;

    // 创建图书表
    query.exec("CREATE TABLE IF NOT EXISTS books ("
               "id INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE NOT NULL,"
               "title VARCHAR(40) NOT NULL,"
               "author VARCHAR(40) NOT NULL)");

    // 更多表创建语句...

    return true;
}

bool DatabaseManager::addBook(const Book &book)
{
    QSqlQuery query;
    query.prepare("INSERT INTO books (title, author) VALUES (:title, :author)");
    query.bindValue(":title", book.title());
    query.bindValue(":author", book.author());
    return query.exec();
}

QList<Book> DatabaseManager::getAllBooks() const
{
    QList<Book> books;
    QSqlQuery query("SELECT title, author FROM books");
    
    while (query.next()) {
        Book book;
        book.setTitle(query.value(0).toString());
        book.setAuthor(query.value(1).toString());
        books.append(book);
    }
    
    return books;
}


上面的代码定义了一个DatabaseManager类,它封装了SQLite数据库的打开、创建表格、添加数据和查询数据等常见操作。

在构造函数中,我们指定了要使用的数据库文件路径,之后的各种操作都将在该数据库文件上进行。

openDatabase()方法负责打开连接,如果连接成功则调用createTables()来创建所需的表格结构。

addBook()方法通过预处理SQL语句的方式插入新的Book记录,而getAllBooks()则查询出所有Book对象放入QList返回。

使用这种面向对象的封装方式,我们可以完全屏蔽底层的SQL细节,只需要编写简单的C++代码就能高效使用数据库了。这不仅使程序变得更加安全可靠,也大大提升了开发效率和可维护性。


五、数据库视图,化简为王道


除了对数据库进行底层CRUD(增删改查)操作外,构建视图也是数据库编程中一个常见的需求。而在Qt中,我们可以借助QSqlTableModel等高级接口,以优雅的方式管理数据库视图:

QSqlTableModel *model = new QSqlTableModel(this);
model->setTable("books");
model->setEditStrategy(QSqlTableModel::OnManualSubmit);

if (!model->select()) {
   qDebug() << "Error selecting data: " << model->lastError().text();
   return;
}

// 添加新记录
QSqlRecord record = model->record();
record.setValue("title", newTitle);
record.setValue("author", newAuthor);
if(!model->insertRecord(-1, record)) {
    qDebug() << "Error inserting record: " << model->lastError().text();
}  

// 显示数据
ui->tableView->setModel(model);
ui->tableView->setEditTriggers(QAbstractItemView::DoubleClicked);
// 自动创建基本UI控件
ui->tableView->resizeColumnsToContents();

QSqlTableModel为我们提供了高度抽象和方便的数据库模型接口。通过setTable()方法,我们直接绑定到指定的数据表上。

查询select()会自动读取整张表的所有记录构建视图。而我们可以在获取的Model实例上自由地插入、修改记录,并通过setEditStrategy()控制何时提交这些修改到数据库。


将这个Model设置到QTableView之类的视图组件中,就可以获得一个完整的数据库视图界面。用户可以在其中双击单元格进行编辑,所有变更会被自动跟踪和更新。


这种以面向对象的方式在GUI中直接管理数据库视图的体验,绝对算是Qt数据库编程最大的亮点之一了。我们仅需要简单的几行代码,就能构建出直观高效的数据库CRUD界面。


结语:期待更多


通过上述介绍,我们已经初步领略了Qt大神们在数据库编程领域内的非凡造诣。当然,这只是冰山一角而已,他们实际上对数据库开发的掌控还远不止如此。

比如在SQL查询方面,Qt提供了强大的QSqlQueryModel帮助我们构建任意自定义的数据视图;再如在数据库报表输出方面,Qt Preview框架则为我们提供了现成的解决方案,等等。

  • 29
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 可以使用MySQL Connector / C++ 5.14.2库来连接MySQL数据库。要在Qt 5.14.2中连接MySQL数据库,您需要安装Qt的MySQL驱动程序。以下是连接MySQL数据库的步骤: 1. 安装MySQL驱动程序 在Qt Creator中,打开菜单 "工具" -> "选项" -> "Kits" -> "Qt 5.14.2" -> "Desktop Qt 5.14.2 GCC 64-bit",然后在 "Qt版本" 下面的 "Qt模块" 中找到 "Qt SQL",确保其已选中。 2. 创建数据库连接 在Qt Creator中,打开菜单 "文件" -> "新建文件或项目" -> "应用程序" -> "Qt控制台应用程序",然后在 "项目名称" 和 "项目路径" 中输入名称和路径,点击 "下一步"。在 "类名" 中输入 "mainwindow",然后点击 "下一步"。在 "高级设置" 中选择 "Qt Widgets应用程序",然后点击 "完成"。 在 "mainwindow.cpp" 文件中添加以下代码: ``` #include <QCoreApplication> #include <QtSql/QSqlDatabase> #include <QtSql/QSqlQuery> #include <QDebug> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); db.setHostName("localhost"); // MySQL服务器地址 db.setDatabaseName("database"); // 数据库名称 db.setUserName("username"); // 用户名 db.setPassword("password"); // 密码 if (db.open()) { qDebug() << "Connected to database!"; db.close(); } else { qDebug() << "Failed to connect to database!"; } return a.exec(); } ``` 请替换上述代码中的 "localhost"、"database"、"username" 和 "password" 为您的MySQL服务器地址、数据库名称、用户名和密码。然后编译和运行程序,如果连接成功,将在控制台输出 "Connected to database!"。 希望这能帮助到您! ### 回答2: 在Qt中使用MySQL数据库,需要先安装MySQL驱动程序。Qt提供了两个MySQL驱动程序:QMYSQL和QMYSQL3。其中,QMYSQL3已经被弃用,因此建议使用QMYSQL。 1. 安装MySQL驱动程序 在Qt Creator中,选择Tools -> Options -> Build & Run -> Kits,选中你正在使用的Kit,然后点击“Desktop Qt X.X.X”选项卡中的“Manual”按钮,在下拉菜单中选择“MySQL”,并在右侧配置MySQL的安装路径。配置完成后,点击“Apply”按钮,然后点击“OK”按钮,关闭选项对话框。 2. 创建连接 在代码中,要创建一个QSqlDatabase对象,并使用QSqlDatabase::addDatabase()函数来注册一个MySQL连接。连接参数和MySQL服务器的相关信息应该以键值对的形式放入QSqlDatabase对象中。如下面的代码所示: ``` QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); db.setHostName("localhost"); db.setDatabaseName("mydatabase"); db.setUserName("root"); db.setPassword("mypassword"); if (!db.open()) { qDebug() << "Failed to connect MySQL database!"; } ``` 上述代码中,“localhost”是MySQL服务器的主机名,“mydatabase”是要连接的数据库的名称,“root”是MySQL用户名,“mypassword”是用户的密码。如果连接失败,会在输出窗口中输出“Failed to connect MySQL database!”信息。 3. 执行SQL语句 连接成功后,就可以使用QSqlQuery对象执行SQL语句了。如下面的代码所示: ``` QSqlQuery query; query.exec("SELECT * FROM mytable"); while (query.next()) { QString name = query.value(0).toString(); int age = query.value(1).toInt(); qDebug() << name << " " << age; } ``` 上述代码中,“mytable”是要查询的表名,query.exec()函数用于执行SQL语句。如果SQL语句有返回结果,可以使用QSqlQuery::next()函数遍历结果集,并使用QSqlQuery::value()函数获取每一列的值。 在使用完毕后,需要关闭连接: ``` db.close(); ``` ### 回答3: Qt是一个跨平台的C++应用程序开发框架,可以非常轻松地实现界面设计、事件处理、网络通信和数据库操作等功能。MySQL是目前最流行的开源关系型数据库管理系统之一,其社区活跃、易于安装和维护,深受开发者欢迎。 在Qt中连接MySQL数据库,需要进行以下几个步骤: 1. 安装MySQL驱动程序 Qt自带的驱动程序没有MySQL的驱动,需要手动下载MySQL驱动程序并安装。在Qt官网的下载页面上可以找到各个平台的MySQL驱动程序,下载后解压缩,将解压缩后的文件复制到Qt的安装目录下的plugins\sqldrivers文件夹内,即可完成驱动程序的安装。 2. 在Qt项目中添加MySQL驱动程序 在Qt项目的.pro文件中添加库文件libmysql.dll,如下所示: LIBS += -L/path/to/mysql -lmysql 其中,/path/to/mysql是MySQL安装目录的路径。 3. Qt中连接MySQL数据库Qt代码中,使用如下代码连接MySQL数据库: QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); db.setHostName("localhost"); // 设置主机名 db.setPort(3306); // 设置端口号 db.setDatabaseName("dbname"); // 设置数据库名 db.setUserName("username"); // 设置用户名 db.setPassword("password"); // 设置密码 bool ok = db.open(); // 连接数据库 if(ok) { qDebug() << "数据库连接成功!"; } else { qDebug() << "数据库连接失败!"; } 其中,QSqlDatabase是Qt数据库对象的基类,addDatabase()函数用于创建一个MySQL数据库对象,setHostName()、setPort()、setDatabaseName()、setUserName()和setPassword()函数用于设置连接MySQL数据库的参数,open()函数用于连接数据库,返回值表示连接是否成功。 4. Qt中查询MySQL数据库Qt代码中,使用如下代码查询MySQL数据库: QSqlQuery query; query.exec("SELECT * FROM table"); while(query.next()) { QString name = query.value("name").toString(); int age = query.value("age").toInt(); qDebug() << name << age; } 其中,QSqlQuery是Qt中查询对象的基类,exec()函数用于执行SQL语句,next()函数用于遍历查询结果,value()函数用于获取查询结果的值,toString()函数和toInt()函数用于将值转换为QString和int类型,分别表示姓名和年龄。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

w风雨无阻w

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值