Content Table

数据库

Qt 是用 C++ 实现的,那么 C,C++ 访问数据库的方式也同样适用于 Qt,如要访问 MySQL,需要相应的头文件和库文件(例如 Windows 下的 dll 或者 lib,Linux 下的 .so 或者 .a),如果你安装了 MySQL,会在安装目录下找到这些库文件,如果没有安装,也可以在网上找到,在代码里 #include "MySQL Headers",然后用提供的函数访问 MySQL。访问 Sqlite,Oracle 等任何一个数据库,都和访问 MySQL 差不多,需要它们自己的头文件和库文件,使用它们提供的函数访问数据库。

这样做的缺点很明显:

  • 访问不同数据库代码不一样
  • 甚至于在不同的平台下访问同一个数据库的代码都不一样
  • 同一个平台下访问同一个数据库有可能有很多不同的库
  • 切换数据库就需要修改代码

为了解决上面八仙过海,各显神通访问数据库的方式,Qt 的 SQL 模块抽象了访问数据库的接口,统一了在 Qt 的程序里访问数据库的方式,实现了在不同的平台,访问不同的数据库用的都是同样的代码。

通过 Qt 的 sql 模块,使用统一的接口访问不同的数据库,也既是说即使更换了数据库,在不同的平台,访问数据库的代码基本上不用修改。为什么说是基本呢?因为有些 SQL 语句需要根据不同的数据库做相应的调整。如果 SQL 语句是写死在代码里的,修改后需要重新编译工程。但如果 SQL 语句不是写在代码里的,而是放在文件里,动态的读取到程序里,那么修改了 SQL 语句后不需要重新编译工程就能生效,会有专门的章节介绍怎么实现这样的技术。

访问数据库常用的类有:

Class Description
QSqlDatabase 表示一个数据库连接,好多人和我有同样的想法,这个类叫 QSqlConnection 更合适
QSqlQuery 用来执行 SQL 语句
QSqlRecord Record 表示数据库表中的一行,QSqlRecord 可以操作行的数据,例如获取列的数据,列名,修改列的数据等
QSqlError 访问数据库时的错误信息
QSqlQueryModel 只读的数据模型,里面的数据是 SQL 语句执行的结果
QSqlTableModel 可读写的数据模型,只支持一个表
QSqlRelationalTableModel 可读写的数据模型,通过关联支持多个表(不一定是外键)

QSqlDatabase 通过数据库驱动和数据库建立连接(底层通过数据库提供的库文件,对我们的代码是透明的),使用 QSqlQuery 和数据库进行交互,得到数据后就可以做想做的事了。