当前位置:   article > 正文

Qt SQL模块:访问ACCESS,SQLITE,模型及视图_qt 数据库视图

qt 数据库视图

目录

一、Qt SQL模块介绍

1.驱动层

2.SQL接口层

3.用户接口层

二、访问ACCESS数据库

三、访问SQLite数据库

四、采用模型、视图方式访问数据库 


一、Qt SQL模块介绍

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对象。

1.驱动层

驱动层为具体的数据库和SQL接口层之间提供了底层的桥梁,主要类包括Q1S0L模块中的QSqIDriver、QSqIDriverCreator、SqDriverCreatorBase、QSqlDriverPlugin和QSqIResult,Q1SQL模块使用数据库驱动插件和不同的数据库接口进行通信。由于Qt的SQL模块接口是独立于数据库的,因此所有具体数据库的代码都包含在了这些驱动程序中。Qt本身提供了多种数据库驱动程序,并且可以添加其他数据库的驱动程序。Qt提供的数据库驱动程序的源码可以作为编写自定义驱动程序的模型。

2.SQL接口层

SQL接口层提供了对数据库的访间,主要类包括Qt SQL模块中的QSa1 Database、QlQuery、QSqError、QSqlField、QSqllndex和QSqIRecord、QSqlDatabase类用于创建数据库连接,SqlQuery类用于使用SQL语句实现与数据库交互。

3.用户接口层

用户接口层的主要类包括QSqIQueryModel、QSqITableModel和SqlRelationalTableModel。.

用户接口层的类使用模型/视图框架实现了将数据库中的数据链接到窗口控件上,是更高层次的抽象,即便用户不熟悉SQL也可以操作数据库。需要注意的是,在使用用户接口层的类之前必须实例化QCoreApplication类的对象。

数据库的操作需要将数据库的内容在界面上进行显示和编辑,Qt采用Model/View结构进行数据库内容的显示,

QTableView是常用的内容显示视图组件,数据模型类有:

QSqlQueryModel QSqlTableModel QSqlRelationalTableModel

这几个类的继承关系:

QSqlQueryModel :通过设置SELECT语句查询获取内容,Model数据是只读的,不能进行编辑。

QSqlTableModel : 直接设置一个数据表的名称,可以获取数据表的全部记录,结果是可编辑的。

QSqlRelationalTableModel: 编辑一个数据表,将代码字段通过关系与代码表关联,将代码字段的编辑转换为直观的内容选择编辑。

QSqlQuery:他可以执行任何SQL语句,特别是没有返回记录的语句,UPDATE,INSERT,DELETE等,通过SQL语句对数据库直接进行编辑修改。

二、访问ACCESS数据库

首先使用EasyAccess软件建立数据库文件,文件名为car.db,文件存放在工程目录下,并建立一张表,取名为carTable。

编写代码,访问数据库并获取表格数据。

  1. //(0)查看qt支持的驱动
  2. QStringList list = QSqlDatabase::drivers();
  3. qDebug()<<list;
  4. //(1)打开数据库
  5. QString path = "C:\\Users\\Administrator\\Desktop\\untitled\\car.mdb";
  6. QSqlDatabase acDb = QSqlDatabase::addDatabase("QODBC", "accessDB");
  7. const QString dsn(QString("DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};FIL={MS Access};DBQ=%1;Uid=%2;Pwd=%3")
  8. .arg(path)
  9. .arg("admin")
  10. .arg("pass")); //path是数据库的路径,admin是用户名,pass是密码
  11. acDb.setDatabaseName(dsn);
  12. qDebug()<<"acDb驱动有效:"<<acDb.isValid();
  13. if(acDb.open())
  14. {
  15. qDebug()<<"连接AccessDB成功";
  16. qDebug()<<"connectionName:"<<acDb.connectionName();
  17. qDebug()<<"databaseName:"<<acDb.databaseName();
  18. qDebug()<<"hostName:"<<acDb.hostName();
  19. }
  20. else
  21. {
  22. qDebug()<<"连接AccessDB失败"<<acDb.lastError().text();
  23. }
  24. //(2)查询操作
  25. QSqlQuery *query = new QSqlQuery(acDb);
  26. bool isOk = query->exec("select * from carTable");
  27. if(!isOk)
  28. {
  29. acDb.close();
  30. }
  31. //(3)得到结果
  32. query->next();
  33. QString col1 = query->value(1).toString();
  34. QString col2 = query->value(2).toString();
  35. QString col3 = query->value(3).toString();
  36. QString col4 = query->value(4).toString();
  37. QString col5 = query->value(5).toString();
  38. QString col6 = query->value(6).toString();
  39. qDebug()<<col1<<col2<<col3<<col4<<col5<<col6;
  40. //(4)另一种得到查询结果
  41. //acDb.open();
  42. QSqlQuery q("select * from carTable",acDb);
  43. QSqlRecord rec = q.record();
  44. qDebug() << "Number of columns: " << rec.count();
  45. int nameCol = rec.indexOf("车号"); // index of the field "车号"
  46. while (q.next())
  47. qDebug() << q.value(nameCol).toString()<<\
  48. q.value(nameCol+1).toString()<<\
  49. q.value(nameCol+2).toString()<<\
  50. q.value(nameCol+3).toString()<<
  51. q.value(nameCol+4).toString(); // output all 车号
  52. //(5)连接状态
  53. qDebug()<<"数据库连接状态:"<<acDb.isOpen();
  54. acDb.close();
  55. qDebug()<<"数据库连接状态:"<<acDb.isOpen();
  56. qDebug()<<"*******************************************";

三、访问SQLite数据库

首先使用Navicat软件建立数据库文件,文件名为CarSqliteDB.db,文件存放在工程目录下,并建立一张表,取名为carTable。

编写代码,访问数据库并获取表格数据。

  1. //(0)查看qt支持的驱动
  2. QStringList list = QSqlDatabase::drivers();
  3. qDebug()<<list;
  4. //(1)打开数据库
  5. QString path = "C:\\Users\\Administrator\\Desktop\\untitled\\CarSqliteDB.db";
  6. QSqlDatabase sqliteDb = QSqlDatabase::addDatabase("QSQLITE","Car");
  7. sqliteDb.setDatabaseName(path);
  8. qDebug()<<"sqliteDb驱动有效:"<<sqliteDb.isValid();
  9. if(sqliteDb.open())
  10. {
  11. qDebug()<<"连接SQLiteDB成功";
  12. qDebug()<<"connectionName:"<<sqliteDb.connectionName();
  13. qDebug()<<"databaseName:"<<sqliteDb.databaseName();
  14. qDebug()<<"hostName:"<<sqliteDb.hostName();
  15. }
  16. else
  17. {
  18. qDebug()<<"连接SQLiteDB失败"<<sqliteDb.lastError().text();
  19. }
  20. //(2)查询操作
  21. QSqlQuery *query = new QSqlQuery(sqliteDb);
  22. bool isOk = query->exec("select * from carTable");
  23. if(!isOk)
  24. {
  25. qDebug()<<"SqlQuery失败"<<query->lastError().text();
  26. sqliteDb.close();
  27. }
  28. //(3)得到结果
  29. query->next();
  30. QString col1 = query->value(1).toString();
  31. QString col2 = query->value(2).toString();
  32. QString col3 = query->value(3).toString();
  33. QString col4 = query->value(4).toString();
  34. QString col5 = query->value(5).toString();
  35. QString col6 = query->value(6).toString();
  36. qDebug()<<col1<<col2<<col3<<col4<<col5<<col6;
  37. //(4)另一种得到查询结果
  38. //acDb.open();
  39. QSqlQuery q("select * from carTable",sqliteDb);
  40. QSqlRecord rec = q.record();
  41. qDebug() << "Number of columns: " << rec.count();
  42. int nameCol = rec.indexOf("车号"); // index of the field "车号"
  43. while (q.next())
  44. qDebug() << q.value(nameCol).toString()<<\
  45. q.value(nameCol+1).toString()<<\
  46. q.value(nameCol+2).toString()<<\
  47. q.value(nameCol+3).toString()<<
  48. q.value(nameCol+4).toString(); // output all 车号
  49. qDebug()<<"*******************************************";

四、采用模型、视图方式访问数据库 

        QSqlTableModel类继承至QSqlQueryModel类,该类提供了一个可读写单张SQL表的可编辑数据模型,功能:修改,插入,删除,查询,和排序。

        QSqlTableModel类为单个数据库表提供了一个可编辑的数据模型。QSqlTableModel是一个从单个表读取和写入数据库记录的高级接口。它构建在较低级别的QSqlQuery之上,并且可以用来提供数据给诸如QTableView的视图类。

将QSqlTableModel与QSqlDatabase绑定,然后将model与QTableView绑定。

        首先使用Navicat软件建立数据库文件,文件名为test.db,文件存放在工程目录下,并建立一张表,取名为Table_one,并填充数据。

具体实现代码如下:

  1. //(1)打开数据库
  2. QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE","connDb");
  3. QString dbPath = QCoreApplication::applicationDirPath() + "/test.db";
  4. //qDebug()<<QCoreApplication::applicationDirPath();
  5. //QString dbPath = "C:\\Users\\Administrator\\Desktop\\untitled\\test.db";
  6. db.setDatabaseName(dbPath);
  7. bool ok = db.open();
  8. if(ok)
  9. {
  10. qDebug()<<"数据库连接成功!";
  11. }
  12. else
  13. {
  14. QSqlError err= db.lastError();
  15. qDebug()<<err.text();
  16. }
  17. //(2)模型关联数据库
  18. QSqlTableModel *model = new QSqlTableModel(this,db);
  19. model->setTable("Table_one");
  20. model->select();
  21. //(3)视图控件关联模型
  22. ui->tableView->setModel(model);

 运行后效果。

参考书目:Qt 5.12实战  清华大学出版社

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/681638
推荐阅读
  

闽ICP备14008679号