Qt-数据库

前言

  在学习Qt-数据库的相关内容前,建议读者掌握一些基本的SQL知识,应该可以看懂基本的SELECT、INSERT、UPDATE和DELETE等语句,但这不是必须的,因为Qt中提供了不需要SQL知识就可以浏览和编辑数据库的接口。

数据库

   Qt 中的 Qt SQL 模块提供了对数据库的支持,该模块中的众多类基本上分为三层:用户接口层、SQL 接口层、驱动层。
   其中,驱动层为具体的数据库和SQL接口层之间提供了底层的桥梁; SQL接口层提供了对数据库的访问,其中, QSqlDatabase 类用来创建连接, QSqlQuery 类可以使用 SQL 语句来实现与数据库交互,其他几个类对该层提供了支持。用户接口层的几个举实现了将数据库中的数据链接到窗口部件上,这些类是使用模型/视图框如实现的,它们是更高层次的抽象,即便不熟悉SQL也可以操作数据库。要使用 Qt SQL 模块中的这些类时,需要在项目文件(. pro文件)中添加“ QT += sqI "这 一行代码。

一、连接数据库

 1. SQL 数据库驱动

   Qt SQL模块使用数据库驱动插件来和不同的数据库接口进行通信。由于QtSQL模块的接口是独立于数据库的,所以所有数据库特定的代码都包含在这些驱动中。Qt默认支持一此驱动,也可以添加其他驱动。
Qt中包含的驱动如表:

  驱动名称    数据库  
QDB2IBM DB2(7. 1版或者以上版本)
QIBASEBorland InterBase
QMYSQLMySQL
QOC1Oracle Call Interface Driver
QODBCOpen Daabase Cnneiviy(ODBC)-微软sQL Server和其他ODBC兼容数据库
QPSQLPostgreSQL(7.3版本或者更高)
QSQLITE2SQLite版本2
QSQLITESQLite版本3
QTDSSybase Adaptive Server(注:从Qt 4.7开始已经过时)

  在 Qt 安装目录下的plugins/sqldrivers 文件夹中可以看到所有的驱动插件文件。也可以使用QSqlDatabase 类的静态函数 drivers() 来获取可用的驱动表。

 2. 创建数据库连接

要想使用 QSqlQuery 或者 QSqlQueryModel 来访问数据库,那么先要创建并打开一个或者多个数据库连接。数据库连接使用连接名来定义,而不是使用数据库名,可以向相同的数据库创建多个连接。QSqIDatabase 也支持默认连接的概念,默认连接就是一个没有命名的连接。在使用 QSqlQuery 或者 QSqlQueryModel 的成员函数时需要指定一个连接名作为参数,如果没有指定,那么就会使用默认连接。如果应用程序中只需要有一个数据库连接,那么使用默认连接是很方便的。
创建一个连接会创建了一个 QSqIDatabase 类的实例,只有调用open()函数后该连接才可以被使用。下面的代码片段显示了怎样创建一个默认的连接,然后打开它:

QSq1Database db = QSqLDatabase::addDatabase("QMYSQL");
db.setHostName("bigblue");
db.setDatabaseName("flightdb");
db.setUserName("acarlson");
db.setPassword("password");
bool ok = db.open();

   要移除一个数据库连接,需要先使用 QsqlDatabase::close() 关闭数据库,然后使用静态函数 QSqlDatabase::removeDatabase() 移除该链接。
   下面通过一个例子来具体看一下数据库连接的建立过程。在项目中添加新的C++头文件,名称为 connection.h,并将其内容更改为:

#ifndef CONNECTION_H
#define CONNECTION_H
#include <QMessageBox>
#include <QSqlDatabase>
#include <QSqlQuery>

static bool createConnection()
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName(":memory:");
    if (!db.open()) {
        QMessageBox::critical(0, "Cannot open database",
                              "Unable to establish a database connection.", QMessageBox::Cancel);
        return false;
    }
    QSqlQuery query;
    query.exec("create table student (id int primary key, "
               "name varchar(20))");
    query.exec("insert into student values(0, 'LiMing')");
    query.exec("insert into student values(1, 'LiuTao')");
    query.exec("insert into student values(2, 'WangHong')");
    return true;
}
#endif // CONNECTION_H

   再到 main.c 文件中,更改主函数为:

#include <QApplication>
#include <QSqlDatabase>
#include <QDebug>
#include <QStringList>
#include "connection.h"
#include <QVariant>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    // 创建数据库连接
    if (!createConnection()) return 1;
    // 使用QSqlQuery查询整张表
    QSqlQuery query;
    query.exec("select * from student");
    while(query.next())
    {
        qDebug() << query.value(0).toInt() << query.value(1).toString();
    }
    return a.exec();
}

现在运行程序,可以在应用程序输出栏看到 student 表格中的内容。

二、执行SQL语句

  1.执行一个查询

   QSqlQuery 类提供了一个接口,用于执行 SQL 语句和浏览查询的结果集。要执行一个 SQL 语句,则需要简单的创建一个 QSqlQuery 对象,然后调用 QSqlQuery::exec() 函数即可,例如:

QSqlQuery query;
query.exec("select * from student");

   在 QSqlQuery的构造的数中可以接收一个可选的 QqlDatbase对象来指定使用的是哪个数据库连接 。当没有指定连接时 就是使用默认连接。如果发生了错误,那么exec()函数会返回false,可以使用 QSqlQuerylastError()来获取错误信息。

  2.浏览结果集

   QSqlQuery提供了对结果集的访问,可以一次访问一条记录。执行完 exee()函数后,QSalQuery的内部指针会位于第一条记录前面的位置。必须调用一次 QSqlQuery: :next()函数来使其前进到第一条记录,然后可以重复使用 next()函数来访问其他记录。直到该函数的返回值为falsce。例如,可以使用以下代码来遍历个结果集:

while(query.next())
{
    qDebug() << query.value(0).toInt() << query.value(1).toString();
}

   其中,QSqlQuery::value() 函数可以返回当前记录的个字段值。比如 value(0) 就是第一个字段的值,各个字段从 0 开始编号。该函数返回一个 QVariant ,不同的数据库类型自动映射为 Qt 中最接近的相应类型,这里的 toInt() 和 toString() 就是将 QVariant 转换为 int 和 QString 类型。
   QSqlQuery类中提供了多个函数来实现在结果集中进行定位,比如 next() 定位到下一条记录. previous() 定位到前一条记录,first() 定位的第一条记录,last() 定位到最后一条记录,seek(n) 定位到第n条记录。如果只需要使用 next() 和 seek() 来遍历结果集,那么可以在调用 exec( ) 函数以前调用 setForwardOnly(true) ,这样可以显著加快在结果集上的查询速度。当前行的索引可以使用 at() 返回;record() 函数可以返回当前指向的记录;如果数据库支持,那么可以使用size()来返回结果集中的总行数。要判断一个数据库驱动是否支持一个给定的特性,可以使用 QSqlDriver::hasFeature() 函数。

  3.插入、删除和更新记录

query.exec("insert into student (id,name) values (100,'Chen')");

  这样就在student表中重新插入一条记录。如果想在同一时间插入多条记录,那么一个有效的方法就是将查询语句和真实的值分离,这可以使用占位符来完成。Qt 支持两种占位符:名称绑定和位置绑定。列入位置绑定:

query.prepare("insert into student (id,name) values (:id,:name)");
int idValue = 100 ;
QString nameValue = "Chen";
query.bindValue(":id",idValue);
query.bindValue(":name",nameValue);
query.exec();

如果使用位置绑定:

query.prepare("insert into student (id,name) Values (?,?)");
int idValue = 100 ;
QString nameValue = "Chen";
query.addBindValue(":id",idValue);
query.addBindValue(":name",nameValue);
query.exec();

当插入多条记录时,只需要调用 QSqlQuery::prepare() 一次,然后使用多次 bindValue() 或者 addBingValue() 函数来绑定需要的数据,最后调用一次 exec() 函数就可以了。
  对于记录的更新与删除,它们和插入操作是相似的,并且也可以和使用占位符。

// 更新
query.exec("update student set name = 'xiaoming' where id = 20");
// 删除
query.exec("delete from student where id = 21");

  4.事务

  事务可以保证一个复杂操作的原子性,即对于一个数据库操作序列,这些操作要么全部做完,要么一条也不做,它是一个不可分制的工作单位。在 Qt 中,如果底层的数据库引擎支持事务,那么 QSqlDriver: :hasFeature(QSqlDriver::Transactions) 会返回 true 。可以使用 QSqlDatabase::transaction() 来启动一个事务,然后编写此希望在事务中执行的 SQL 语句,最后调用 QSqlDatabase.commit() 提交或者 QSqIDatabase: rollback() 回滚。使用事务时必须在创建在询以前就开始事务,例如:

QSqIDatabase: :database() transaction();
QSqlQuery query;
query.exec("SELECT id FROM employee WHERE naame = 'Totild' );
if (query. next()) { 
int employeeId = query.value(0). toInt();
query.exec("INSERT INTO project (id, nane, owmerid)"
VALUES (201'Manbattan Feaject',"
+ QString::number(employerId) + ')');
}
QSqlDatabase::database().commit();

三、使用 SQL 模型类

  waiting . . .

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MIT-BIH QT数据库是一种包含人类心电图数据的公开数据库,用于研究心脏的电生理特征和心脏疾病的识别与分析。该数据库由麻省理工学院(MIT)和美国国立卫生研究院(NIH)的比坚锡医院(BIH)合作创建,并于1980年发布。 MIT-BIH QT数据库主要包含来自多个健康志愿者和心脏病人的心电图信号,总计500个记录。这些心电图记录在不同的情况下采集,包括静息、运动、药物影响等等。在记录过程中,心电图信号被模拟器进行测量,并通过标准12导联记录,以及记录人员的相关生理和临床信息。 MIT-BIH QT数据库的主要目的是提供一个对心脏r波的测量结果进行快速和可靠分析的参考标准。研究人员可以利用这一数据库来开发和验证心脏疾病的自动识别算法,以及其他相关的心脏研究。 对于心脏病学和生物医学工程学领域的研究人员来说,MIT-BIH QT数据库是一个非常有价值的资源。它为研究心脏疾病的机理、心脏节律障碍和药物对心电图的影响提供了丰富的数据。通过分析和处理MIT-BIH QT数据库中的心电图信号,研究人员可以进一步理解心脏的电生理过程,并且为心脏疾病的诊断和治疗提供更多的依据。 总之,MIT-BIH QT数据库是一个被广泛应用于心脏研究的公开数据库,它对于研究人员来说是一个宝贵的资源,可以帮助他们深入了解心脏疾病的机理和识别方法。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值