目录
一、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。
编写代码,访问数据库并获取表格数据。
//(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()<<"*******************************************";
三、访问SQLite数据库
首先使用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实战 清华大学出版社