QT提供了通用的数据库接口可以很方便的处理各种数据库,在项目中经常会遇到数据库数据的导入导出的需求. 由于各个数据库的DDL差异比较大,无法做到导出表结构的通用方案,这个只能借助相应数据库特有的SQL语句或者工具来解决, 如postgresql的COPY命令和pg_dump工具等.
Navicat工具的导入导出功能做的非常不错,能够导出包含表结构和二进制数据的sql文件.
需解决问题:
1. 取出数据,组装insert语句
2. 对于二进制数据,无法做到像navicat那样可以直接执行sql语句执行. 只能转化为十六进制文本格式. 在导入时自动解析
3. 对于数据库建表语句, 目前无法提供通用的导出方式,只能借助工具
一. 数据导出
/** *@brief 导出数据库数据到文件中 *@param path 文件路径 */ void ExportDB(const QString &path) { QStringList vList; // 导出数据库所有名称以auth开头的表 QStringList tables=gAuthDB.tables(); foreach(QString table,tables) { if(!table.startsWith("auth")) continue; QSqlQuery query(gAuthDB); QString sql=QString("select * from %1").arg(table); query.exec(sql); QSqlRecord record=query.record(); while(query.next()) { QString prefix=QString("insert into %1(").arg(table); // 记录属性字段名 QString suffix="values("; // 记录属性值 // 遍历属性字段 for(int i=0;i<record.count();i++) { QSqlField field=record.field(i); QString fieldName=field.name(); switch(field.type()) { case QVariant::String: prefix+=fieldName; suffix+=QString("'%1'").arg(query.value(i).toString()); break; case QVariant::ByteArray: { prefix+=fieldName; QByteArray data=query.value(i).toByteArray(); if(data.isNull()) { suffix+="null"; }else { suffix+=QString("E'%1'").arg(data.toHex().data()); // blob数据按16进制格式导出 } } break; default: prefix+=fieldName; suffix+=query.value(i).toString(); } if(record.count()==1) { prefix+=")"; suffix+=")"; }else if(i!=record.count()-1) { prefix+=","; suffix+=","; }else if(i==record.count()-1) { prefix+=")"; suffix+=")"; } } // 组装sql语句 insert into auth_test values(0,'hello',E'003f') QString iSql=QString("%1 %2;").arg(prefix).arg(suffix); vList.append(iSql); } } QFile file(path); file.open(QIODevice::WriteOnly|QIODevice::Truncate); // 将sql语句写入文件 QTextStream out(&file); foreach(QString line,vList) { out<<line+"\n"; } }
二. 数据导入
/** *@brief 读取sql文本内容,并写入至数据库 *@param path sql文件路径 */ void ImportDB(const QString &path) { QSqlQuery query(gAuthDB); QFile file(path); file.open(QFile::ReadOnly); QTextStream in(&file); while(!in.atEnd()) { QString sql=in.readLine(); // 通过分析values(E'),判断是否有二进制数据,如没有直接运行sql语句,如有则需要将16进制文本转换为blob数据 QRegExp reg("E'([0-9a-f]{1,})'"); if(!sql.contains(reg)) { query.exec(sql); }else { int pos=0; QStringList bList; // 探索所有的blob字段 while((pos=reg.indexIn(sql,pos))!=-1) { bList.append(reg.cap(0)); QString blob=reg.cap(1); pos+=reg.matchedLength(); } // blob字段填充占位符 foreach(QString key,bList) { sql.replace(key,"?"); } query.prepare(sql); // 绑定占位符数据 for(int i=0;i<bList.size();i++) { // 去除E'' QString hexBlob=bList[i].mid(2,bList[i].size()-1); // 还原16进制数据 QByteArray ba=QByteArray::fromHex(hexBlob.toLocal8Bit()); query.bindValue(i,ba); } query.exec(); } } }
相关推荐
在QT中导出数据到Excel文件,通常是为了数据分析、报告生成或数据共享的需求。这个"QT导出Excel文件示例"利用了微软的ODBC(Open Database Connectivity)技术,这是一种标准的数据访问接口,允许应用程序与各种...
在这个系统中,XML文件可能被用来存储系统的配置信息,如数据库连接参数,或者用于导出导入销售数据,便于与其他系统集成或者数据迁移。 5. **车辆管理**:此系统的核心功能之一是车辆管理,包括车辆的入库、出库、...
10. **与其他Qt组件集成**:QtXlsxWriter可以与Qt的其他组件,如QTableView或QStandardItemModel,结合使用,实现从数据库或其他数据源直接导出到Excel的功能。 在实际开发中,根据具体需求,你可能还需要了解如何...
7. 文件操作:虽然文件名称列表只显示了"9876",但实际项目中可能涉及到导入导出图书数据的文件操作,如CSV或XML格式,使用Qt的QFile、QTextStream等类实现文件读写。 8. 模块化编程:为了提高代码的可维护性和复用...
数据导入导出则可能支持CSV或Excel格式,方便数据交换。 最后,项目中提供的README.md文件通常会包含详细的安装指南、系统需求、运行步骤以及可能遇到的问题和解决方案。这是理解和使用项目的重要资源,应首先查看...
这个基于C++和QT框架实现的书签管理器源码提供了一个完整的解决方案,不仅涵盖了基本的书签操作,还增加了数据持久化和导入导出功能。下面将详细介绍这个项目中的关键知识点。 1. C++编程语言:C++是这个项目的编程...
【文献管理】文献管理系统的核心功能可能包括文献的导入导出、分类管理、关键词搜索、版本控制等。使用Qt,开发者可以方便地实现这些功能,例如,通过QFileDialog选择文献文件,使用QSqlDatabase模块与数据库交互...
这个功能特别之处在于它是一键式的,且针对特定表格进行了定制,以满足快速、高效地导出数据的需求。 首先,我们要了解Qt 5,这是一个跨平台的应用程序开发框架,广泛应用于桌面、移动以及嵌入式设备。它的C++接口...
5. 导入导出:支持成绩数据的导入导出,方便数据迁移或备份。 通过学习和实践这个QT&C++学生成绩管理系统,你可以深入理解如何结合C++的强类型特性和QT的图形化能力来开发实际应用。此外,你还可以了解到如何进行...
5. 数据导出与导入:将学生信息导出为文件,或从文件导入数据到系统。 6. 用户管理:设置不同的用户权限,例如管理员可以进行所有操作,而普通用户只能查看信息。 开发过程中,开发者可能采用了MVC(模型-视图-控制...
5. 数据导出与导入:系统应支持将学生信息导出为CSV或其他格式的文件,同时也应能导入已有的数据文件。 在实现过程中,开发者可能采用了MVC(Model-View-Controller)设计模式,将业务逻辑、数据展示和用户交互分离...
使用了QT的QTextEdit或QPlainTextEdit部件作为Markdown编辑的基础,可能还结合了QFileSystemModel进行文件系统的操作,以及QProcess或QNetworkAccessManager实现导入导出和网络同步功能。通过QT的信号与槽机制,...
- 为了方便数据迁移和备份,系统支持CSV或XML格式的数据导入导出。这些文件格式通用且易于解析,用户可以将通讯录数据与其他应用进行交换。 总的来说,这个C++编写的通讯录系统结合了C++的面向对象特性、Qt库的GUI...
7. **数据备份与恢复**:提供数据导出和导入功能,以防止数据丢失。 在实现这些功能时,开发者需要熟练掌握C++的面向对象编程思想,如封装、继承和多态,以及Qt库中的各种组件和API。同时,项目可能使用SQLite或...
3. 成绩录入模块:录入学生的各科成绩,支持批量导入和单个录入,同时提供成绩的导出功能。 4. 成绩统计模块:对所有成绩进行统计分析,如平均分、最高分、最低分、及格率等。 5. 查询模块:根据不同条件(如学号、...
`Exchange`类可能涉及到数据交换或导入导出功能。比如,它可能支持将通讯录数据转换为CSV、VCF等格式,以便与其他设备或应用共享。 4. **editwidget.cpp 和 editwidget.h**: `EditWidget`可能是用于编辑联系人...
在交通智能研判系统中,Hive起到了数据存储和预处理的作用,能够方便地进行数据导入、导出和数据清洗,同时为Spark提供了一个统一的数据访问接口。 结合Spark和Hive,这个系统能够实现以下关键功能: 1. **实时数据...
6. **导出/导入数据**:系统应提供功能将通讯录数据导出为文件,以便备份或在不同设备间同步,同时也能导入已存在的数据文件。 在QT C++中实现这些功能时,需要熟练运用面向对象编程(OOP)的概念,如类的设计和...
在电影数据挖掘项目中,QT库可能被用来设计和实现一个用户友好的界面,用户可以通过这个界面输入查询条件,查看挖掘结果,或者进行数据的导入导出。 项目文件“Introduction.pptx”很可能包含了项目的详细介绍,...
8. 文件操作:可能提供导入和导出弹幕文件的功能,涉及文件读写操作。 综上所述,"弹幕工具.rar"是一个集成了C++编程语言和Qt库的桌面应用程序,其主要功能是模拟视频播放器中的弹幕效果。开发者可能运用了多种技术...