数据库Qt数据库编程Qt SQL模块1在项目中使用Qt SQL模块如果要在Qt项目中使用数据库编程功能需要将Qt SQL模块添加到项目中也就是需要在项目配置文件.pro文件中增加下面一条语句:QT sql如果要在头文件或源程序文件中用到Qt SQL模块中的类可以使用如下的包含语句;#include Qtsql这样会将Qt SQL模块中常用的类包含进去。但是使用这条语句并不能包含Qt SQL模块中所有的类例如不能包含QDataWidgetMapper类。2、Qt SQL支持的数据库Qt SQL模块提供了一些常见数据库的驱动,驱动及对应数据库如表9-1所示。通过使用Qt sQL模块提供的功能我们就可以编程实现对这些数据库的连接和操作。3、Qt SQL模块中主要的类Qt SOL模块提供了数据库编程所需的各种类,类名描述QSqlDatabase代表一个数据库连接。可以创建、打开、关闭和管理数据库连接。QSqlQuery提供了一个执行 SQL 查询的接口支持查询、插入、更新和删除等操作。QSqlRecord表示从数据库查询中获取的单行数据。可用于获取字段名及其值。QSqlTableModel基于模型/视图架构的类用于显示和编辑数据库表格数据。QSqlQueryModel只读模型类用于显示从 SQL 查询获得的数据。QSqlError表示 SQL 操作的错误信息提供错误码和描述。QSqlDriver负责与数据库驱动的基本交互定义了数据库驱动的接口。QSqlField表示数据库表中的单个字段包括字段名、值和属性信息。QSqlRelation用于表示数据库表之间的关系通常在模型中使用以连接相关数据。QSqlQueryModel只读模型类用于显示 SQL 查询结果。示例Qt的数据库模块QSqlDatabase、QSqlQuery等连接SQLite数据库#includeQCoreApplication#includeQtSql#includeQDebugboolcreateConnection(){// 1. 创建数据库连接QSqlDatabase dbQSqlDatabase::addDatabase(QSQLITE);db.setDatabaseName(example.db);if(!db.open()){qDebug()无法打开数据库:db.lastError().text();returnfalse;}returntrue;}voidcreateTable(){// 2. 使用QSqlQuery创建表QSqlQuery query;query.exec(CREATE TABLE IF NOT EXISTS person (id INTEGER PRIMARY KEY, name TEXT, age INTEGER));}voidinsertData(){// 3. 插入数据QSqlQuery query;query.prepare(INSERT INTO person (name, age) VALUES (?, ?));query.addBindValue(张三);query.addBindValue(30);query.exec();query.addBindValue(李四);query.addBindValue(25);query.exec();}voidfetchData(){// 4. 查询数据并使用QSqlRecord访问QSqlQueryquery(SELECT id, name, age FROM person);while(query.next()){QSqlRecord recordquery.record();intidrecord.value(id).toInt();QString namerecord.value(name).toString();intagerecord.value(age).toInt();qDebug()ID:idName:nameAge:age;}}intmain(intargc,char*argv[]){QCoreApplicationapp(argc,argv);if(createConnection()){createTable();insertData();fetchData();}returnapp.exec();}代码分析QSqlDatabase用于创建和管理数据库连接。这段代码使用SQLite数据库所以添加SQLite驱动。addDatabase(“QSQLITE”)指定使用SQLite。QSqlQuery用于执行SQL语句包括创建表、插入、查询等操作。QSqlRecord用于从查询结果中检索单行数据以字段名或索引访问值。错误处理通过lastError()获取错误信息并输出到调试窗口。运行结果ID: 1 Name: 张三 Age: 30 ID: 2 Name: 李四 Age: 25数据库编程的模型/视图结构基本原理模型/视图结构用于将数据与UI分离。模型表示数据视图负责显示和编辑数据。模型类与视图组件的结合通过模型类如 QSqlTableModel将数据库中的数据映射到视图组件如 QTableView进行展示和操作。Qt SQL模块中的主要模型类QSqlQueryModel用途用于显示SQL查询结果。特点数据只读不可编辑。实现仅支持 SELECT 语句不支持 INSERT 或 UPDATE。QSqlTableModel用途用于表示单个数据表。特点数据可编辑。实现支持 SELECT、INSERT、UPDATE 等SQL操作。QSqlRelationalTableModel用途用于表示关系数据表。特点数据可编辑支持将编码字段关联到另一表实现直观的列表选择。功能通过关系将编码字段与编码表关联。模型类的继承关系QAbstractItemModel是基础抽象类。QAbstractTableModel派生自 QAbstractItemModel是表格模型的抽象基础类但不能用于实例化。SQL语句和数据库操作关系数据库支持SQL拥有强大的数据操作能力。QSqlTableModel的实现通过内部支持多个SQL语句来实现数据同步和更新。QSqlQueryModel的局限由于仅使用 SELECT无法更新数据到数据库。常用几个数据库类QSqlTableModelQSqlTableModel 是 Qt SQL 模块中的一个重要类主要用于在应用程序中方便地管理和操作数据库表的数据。它实现了模型/视图架构特别适用于需要显示和编辑表格数据的场景。主要特性与数据库表直接关联QSqlTableModel 直接映射到数据库中的表简化了数据访问和更新。支持增、删、改操作可以轻松地插入、删除和更新记录所有更改都会自动反映到数据库中。可与 Qt 视图类集成可以与 QTableView 等视图类结合使用支持用户界面的快速构建。模型支持提供标准的模型接口支持排序、过滤和用户自定义数据展示。处理数据验证在插入或更新操作时可以进行数据验证确保数据的一致性和完整性。主要方法构造函数与基本设置QSqlTableModel*modelnewQSqlTableModel(parent);model-setTable(tableName);model-select();// 加载数据增、删、改操作// 插入新记录model-insertRow(model-rowCount());// 删除记录model-removeRow(rowIndex);// 更新数据model-setData(model-index(rowIndex,columnIndex),newValue);提交和撤销变更model-submitAll();// 提交所有更改model-revertAll();// 撤销所有更改排序与过滤model-setSort(columnIndex,Qt::AscendingOrder);model-setFilter(columnName value);// 设置过滤条件示例如何使用 QSqlTableModel 进行基本的数据库操作。#includeQApplication#includeQSqlDatabase#includeQSqlTableModel#includeQTableViewintmain(intargc,char*argv[]){QApplicationapp(argc,argv);// 连接到数据库QSqlDatabase dbQSqlDatabase::addDatabase(QSQLITE);db.setDatabaseName(example.db);db.open();// 创建模型QSqlTableModelmodel(nullptr,db);model.setTable(students);model.select();// 加载数据// 配置视图QTableView view;view.setModel(model);view.setWindowTitle(Student Records);view.show();returnapp.exec();}QSqlQueryModelQSqlQueryModel 是 Qt SQL 模块中的一个类主要用于处理从 SQL 查询中获取的数据。与 QSqlTableModel 不同QSqlQueryModel 适合只读操作允许开发者从复杂的 SQL 查询中展示数据而不需要直接映射到具体的数据库表。主要特性只读模型QSqlQueryModel 仅用于显示数据不能直接更改数据。适用于需要数据显示的场景。自定义 SQL 查询可使用自定义的 SQL 查询来填充模型支持复杂的 JOIN 操作和过滤条件。高效的数据展示适合展示来自数据库的大量数据提供快速的查询结果视图。与视图类结合可以与 QTableView、QListView 等视图类轻松集成便于展现数据。支持动态数据更新在调用 setQuery() 方法后模型可以动态更新数据。主要方法构造函数与查询设置QSqlQueryModel*modelnewQSqlQueryModel(parent);model-setQuery(SELECT * FROM tableName);数据访问QVariant valuemodel-data(model-index(row,column));动态更新查询model-setQuery(SELECT * FROM tableName WHERE condition);排序model-setHeaderData(columnIndex,Qt::Horizontal,Header Name);// 设置表头示例如何使用 QSqlQueryModel 来显示查询结果#includeQApplication#includeQSqlDatabase#includeQSqlQueryModel#includeQTableViewintmain(intargc,char*argv[]){QApplicationapp(argc,argv);// 连接到数据库QSqlDatabase dbQSqlDatabase::addDatabase(QSQLITE);db.setDatabaseName(example.db);db.open();// 创建模型QSqlQueryModel model;model.setQuery(SELECT id, name FROM students);// 配置视图QTableView view;view.setModel(model);view.setWindowTitle(Student Records);view.show();returnapp.exec();}QSqlQueryQSqlQuery 是 Qt SQL 模块中的一个类用于执行 SQL 语句并处理结果集。它提供了执行各种 SQL 操作如查询、插入、更新和删除的接口并与数据库进行交互。主要特性执行 SQL 语句支持执行标准 SQL 语句包括 SELECT、INSERT、UPDATE、DELETE 等。处理结果集可以检索和迭代查询结果支持获取列数、行数和单个字段的值。参数化查询支持使用占位符以预防 SQL 注入提升安全性。事务支持可以在事务中执行多个操作确保数据的一致性。高性能优化了 SQL 操作的执行效率特别是在处理大量数据时。主要方法执行查询QSqlQuery query;query.exec(SELECT * FROM tableName);获取结果while(query.next()){QString namequery.value(name).toString();intidquery.value(0).toInt();}参数化查询QSqlQuery query;query.prepare(INSERT INTO students (name, age) VALUES (:name, :age));query.bindValue(:name,Alice);query.bindValue(:age,20);query.exec();事务管理QSqlDatabase::database().transaction();// 执行多个操作QSqlDatabase::database().commit();// 提交事务示例如何使用 QSqlQuery 进行数据库操作。#includeQApplication#includeQSqlDatabase#includeQSqlQuery#includeQDebug#includeQtSqlintmain(intargc,char*argv[]){QApplicationapp(argc,argv);// 连接到数据库QSqlDatabase dbQSqlDatabase::addDatabase(QSQLITE);db.setDatabaseName(example.db);if(!db.open()){qDebug()Database error occurred;return-1;}// 执行查询QSqlQuery query;// 插入数据query.prepare(INSERT INTO students (name, age) VALUES (:name, :age));query.bindValue(:name,Alice);query.bindValue(:age,20);if(!query.exec()){qDebug()Insert failed:query.lastError().text();}// 查询数据query.exec(SELECT * FROM students);while(query.next()){QString namequery.value(name).toString();intagequery.value(age).toInt();qDebug()Name:nameAge:age;}returnapp.exec();}QSqlRelationalTableModelQSqlRelationalTableModel 是 Qt SQL 模块中的一个类扩展了 QSqlTableModel适用于处理具有关系的多表数据。它允许使用外键在表之间建立关系从而方便地管理和展示相关数据。主要特性关系模型支持通过外键支持多个表之间的关系简化了数据的展示和管理。自动填充数据可以根据外键自动填充关联表的数据如将 ID 显示为相关联的名称。编辑支持允许用户直接在视图中编辑数据自动管理数据的一致性。方便的查询和过滤支持对数据的查询、排序和过滤能够高效处理复杂的数据结构。主要方法设置关系QSqlRelationalTableModel model;model.setTable(students);model.setRelation(2,QSqlRelation(classes,class_id,class_name));获取和设置数据model.select();// 加载数据QString classNamemodel.data(model.index(row,classColumn)).toString();插入和删除行model.insertRow(row);model.removeRow(row);保存更改model.submitAll();// 提交所有修改示例如何使用 QSqlRelationalTableModel 来展示和编辑具有关系的数据。#includeQApplication#includeQSqlDatabase#includeQSqlRelationalTableModel#includeQTableView#includeQDebugintmain(intargc,char*argv[]){QApplicationapp(argc,argv);// 连接到数据库QSqlDatabase dbQSqlDatabase::addDatabase(QSQLITE);db.setDatabaseName(example.db);if(!db.open()){qDebug()Database connection error;return-1;}// 创建模型QSqlRelationalTableModel model;model.setTable(students);model.setRelation(2,QSqlRelation(classes,class_id,class_name));// 设置外键关系model.select();// 获取数据// 配置视图QTableView view;view.setModel(model);view.setWindowTitle(Student Records);view.show();returnapp.exec();}