赞
踩
目录
Qt SQL 模块提供数据库变成的支持,MySQL、Oracle、MS SQL Server、SQlite等。
Qt SQL 模块包含多个类,实现数据库的连接,SQL语句执行,数据获取与界面显示,数据与界面之间使用Model/View结构,方便的实现数据的显示和操作。
Qt SQL模块提供了一个平台无关且数据库无关的访问SQL数据库的接口。Qt通过一个个模块对某种功能进行支持,其中的数据库功能也是通过模块来支持的。Qt就是通过QtSQL模块提供了对SQL数据库的支持,如果要使用Qt SQL模块中的类,就需要在项目文件(pr0文件)中添加“QT+=sql”代码。
Qt SQL模块提供了下表所示的类对SQL数据库进行访问。
用于对SQL数据库访问的类
类 | 说明 |
QSQL | 包含整个Qt SQL模块中使用的各种标识符 |
QSglDriverCreatorBase | SQL驱动程序工厂的基类 |
QSqlDriverCreator | 模板类,为特定驱动程序类型提供SQL驱动程序工厂 |
QSqlDatabase | 表示与数据库的连接 |
QSqlDriver | 用于访问特定SQL数据库的抽象基类 |
QSqlError | SQL数据库错误信息 |
QSqlField | 处理SQL数据库表和视图中的字段 |
QSqlIndex | 用于操作和描述数据库索引的函数 |
QSqlQuery | 执行和操作SQL语句的方法 |
QSqlRecord | 封装数据库记录 |
QSqlResult | 用于从特定SQL数据库访问数据的抽象接口 |
QSqlQueryModel | SQL结果集的只读数据模型 |
QSqlRelationalTableModel | 具有外键支持的单个数据库表的可编辑数据模型 |
QSqlTableModel | 单个数据库表的可编辑数据模型 |
这些类可以分为3层:驱动层、SQL接口层、用户接口层。值得注意的是,在使用的类之前都必须实例化QCoreApplication对象。
驱动层为具体的数据库和SQL接口层之间提供了底层的桥梁,主要类包括Q1S0L模块中的QSqIDriver、QSqIDriverCreator、SqDriverCreatorBase、QSqlDriverPlugin和QSqIResult,Q1SQL模块使用数据库驱动插件和不同的数据库接口进行通信。由于Qt的SQL模块接口是独立于数据库的,因此所有具体数据库的代码都包含在了这些驱动程序中。Qt本身提供了多种数据库驱动程序,并且可以添加其他数据库的驱动程序。Qt提供的数据库驱动程序的源码可以作为编写自定义驱动程序的模型。
SQL接口层提供了对数据库的访间,主要类包括Qt SQL模块中的QSa1 Database、QlQuery、QSqError、QSqlField、QSqllndex和QSqIRecord、QSqlDatabase类用于创建数据库连接,SqlQuery类用于使用SQL语句实现与数据库交互。
用户接口层的主要类包括QSqIQueryModel、QSqITableModel和SqlRelationalTableModel。.
用户接口层的类使用模型/视图框架实现了将数据库中的数据链接到窗口控件上,是更高层次的抽象,即便用户不熟悉SQL也可以操作数据库。需要注意的是,在使用用户接口层的类之前必须实例化QCoreApplication类的对象。
数据库的操作需要将数据库的内容在界面上进行显示和编辑,Qt采用Model/View结构进行数据库内容的显示,
QTableView是常用的内容显示视图组件,数据模型类有:
QSqlQueryModel QSqlTableModel QSqlRelationalTableModel
这几个类的继承关系:
QSqlQueryModel :通过设置SELECT语句查询获取内容,Model数据是只读的,不能进行编辑。
QSqlTableModel : 直接设置一个数据表的名称,可以获取数据表的全部记录,结果是可编辑的。
QSqlRelationalTableModel: 编辑一个数据表,将代码字段通过关系与代码表关联,将代码字段的编辑转换为直观的内容选择编辑。
QSqlQuery:他可以执行任何SQL语句,特别是没有返回记录的语句,UPDATE,INSERT,DELETE等,通过SQL语句对数据库直接进行编辑修改。
首先使用EasyAccess软件建立数据库文件,文件名为car.db,文件存放在工程目录下,并建立一张表,取名为carTable。
编写代码,访问数据库并获取表格数据。
- //(0)查看qt支持的驱动
- QStringList list = QSqlDatabase::drivers();
- qDebug()<<list;
- //(1)打开数据库
- QString path = "C:\\Users\\Administrator\\Desktop\\untitled\\car.mdb";
- QSqlDatabase acDb = QSqlDatabase::addDatabase("QODBC", "accessDB");
- const QString dsn(QString("DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};FIL={MS Access};DBQ=%1;Uid=%2;Pwd=%3")
- .arg(path)
- .arg("admin")
- .arg("pass")); //path是数据库的路径,admin是用户名,pass是密码
-
- acDb.setDatabaseName(dsn);
- qDebug()<<"acDb驱动有效:"<<acDb.isValid();
- if(acDb.open())
- {
- qDebug()<<"连接AccessDB成功";
- qDebug()<<"connectionName:"<<acDb.connectionName();
- qDebug()<<"databaseName:"<<acDb.databaseName();
- qDebug()<<"hostName:"<<acDb.hostName();
- }
- else
- {
- qDebug()<<"连接AccessDB失败"<<acDb.lastError().text();
- }
- //(2)查询操作
- QSqlQuery *query = new QSqlQuery(acDb);
- bool isOk = query->exec("select * from carTable");
- if(!isOk)
- {
- acDb.close();
- }
- //(3)得到结果
- query->next();
- QString col1 = query->value(1).toString();
- QString col2 = query->value(2).toString();
- QString col3 = query->value(3).toString();
- QString col4 = query->value(4).toString();
- QString col5 = query->value(5).toString();
- QString col6 = query->value(6).toString();
- qDebug()<<col1<<col2<<col3<<col4<<col5<<col6;
-
- //(4)另一种得到查询结果
- //acDb.open();
- QSqlQuery q("select * from carTable",acDb);
- QSqlRecord rec = q.record();
-
- qDebug() << "Number of columns: " << rec.count();
-
- int nameCol = rec.indexOf("车号"); // index of the field "车号"
- while (q.next())
- qDebug() << q.value(nameCol).toString()<<\
- q.value(nameCol+1).toString()<<\
- q.value(nameCol+2).toString()<<\
- q.value(nameCol+3).toString()<<
- q.value(nameCol+4).toString(); // output all 车号
-
- //(5)连接状态
- qDebug()<<"数据库连接状态:"<<acDb.isOpen();
- acDb.close();
- qDebug()<<"数据库连接状态:"<<acDb.isOpen();
-
- qDebug()<<"*******************************************";
首先使用Navicat软件建立数据库文件,文件名为CarSqliteDB.db,文件存放在工程目录下,并建立一张表,取名为carTable。
编写代码,访问数据库并获取表格数据。
- //(0)查看qt支持的驱动
- QStringList list = QSqlDatabase::drivers();
- qDebug()<<list;
- //(1)打开数据库
- QString path = "C:\\Users\\Administrator\\Desktop\\untitled\\CarSqliteDB.db";
- QSqlDatabase sqliteDb = QSqlDatabase::addDatabase("QSQLITE","Car");
- sqliteDb.setDatabaseName(path);
- qDebug()<<"sqliteDb驱动有效:"<<sqliteDb.isValid();
- if(sqliteDb.open())
- {
- qDebug()<<"连接SQLiteDB成功";
- qDebug()<<"connectionName:"<<sqliteDb.connectionName();
- qDebug()<<"databaseName:"<<sqliteDb.databaseName();
- qDebug()<<"hostName:"<<sqliteDb.hostName();
- }
- else
- {
- qDebug()<<"连接SQLiteDB失败"<<sqliteDb.lastError().text();
- }
- //(2)查询操作
- QSqlQuery *query = new QSqlQuery(sqliteDb);
- bool isOk = query->exec("select * from carTable");
- if(!isOk)
- {
- qDebug()<<"SqlQuery失败"<<query->lastError().text();
- sqliteDb.close();
- }
- //(3)得到结果
- query->next();
- QString col1 = query->value(1).toString();
- QString col2 = query->value(2).toString();
- QString col3 = query->value(3).toString();
- QString col4 = query->value(4).toString();
- QString col5 = query->value(5).toString();
- QString col6 = query->value(6).toString();
- qDebug()<<col1<<col2<<col3<<col4<<col5<<col6;
-
- //(4)另一种得到查询结果
- //acDb.open();
- QSqlQuery q("select * from carTable",sqliteDb);
- QSqlRecord rec = q.record();
-
- qDebug() << "Number of columns: " << rec.count();
-
- int nameCol = rec.indexOf("车号"); // index of the field "车号"
- while (q.next())
- qDebug() << q.value(nameCol).toString()<<\
- q.value(nameCol+1).toString()<<\
- q.value(nameCol+2).toString()<<\
- q.value(nameCol+3).toString()<<
- q.value(nameCol+4).toString(); // output all 车号
- qDebug()<<"*******************************************";
QSqlTableModel类继承至QSqlQueryModel类,该类提供了一个可读写单张SQL表的可编辑数据模型,功能:修改,插入,删除,查询,和排序。
QSqlTableModel类为单个数据库表提供了一个可编辑的数据模型。QSqlTableModel是一个从单个表读取和写入数据库记录的高级接口。它构建在较低级别的QSqlQuery之上,并且可以用来提供数据给诸如QTableView的视图类。
将QSqlTableModel与QSqlDatabase绑定,然后将model与QTableView绑定。
首先使用Navicat软件建立数据库文件,文件名为test.db,文件存放在工程目录下,并建立一张表,取名为Table_one,并填充数据。
具体实现代码如下:
- //(1)打开数据库
- QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE","connDb");
- QString dbPath = QCoreApplication::applicationDirPath() + "/test.db";
- //qDebug()<<QCoreApplication::applicationDirPath();
- //QString dbPath = "C:\\Users\\Administrator\\Desktop\\untitled\\test.db";
- db.setDatabaseName(dbPath);
- bool ok = db.open();
- if(ok)
- {
- qDebug()<<"数据库连接成功!";
- }
- else
- {
- QSqlError err= db.lastError();
- qDebug()<<err.text();
- }
-
- //(2)模型关联数据库
- QSqlTableModel *model = new QSqlTableModel(this,db);
- model->setTable("Table_one");
- model->select();
-
- //(3)视图控件关联模型
- ui->tableView->setModel(model);
运行后效果。
参考书目:Qt 5.12实战 清华大学出版社
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。