`
tcspecial
  • 浏览: 911579 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

QT 通用数据库数据导入导出方案

    博客分类:
  • QT
阅读更多

      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文件,通常是为了数据分析、报告生成或数据共享的需求。这个"QT导出Excel文件示例"利用了微软的ODBC(Open Database Connectivity)技术,这是一种标准的数据访问接口,允许应用程序与各种...

    QT"汽车销售统计系统” (QT结合MySQL数据库与XML文件搭建 QtCarManager.zip)

    在这个系统中,XML文件可能被用来存储系统的配置信息,如数据库连接参数,或者用于导出导入销售数据,便于与其他系统集成或者数据迁移。 5. **车辆管理**:此系统的核心功能之一是车辆管理,包括车辆的入库、出库、...

    qt输出excel文档,linux window下均可使用

    10. **与其他Qt组件集成**:QtXlsxWriter可以与Qt的其他组件,如QTableView或QStandardItemModel,结合使用,实现从数据库或其他数据源直接导出到Excel的功能。 在实际开发中,根据具体需求,你可能还需要了解如何...

    数据库课设:基于Qt+mysql数据库的图书管理系统.zip

    7. 文件操作:虽然文件名称列表只显示了"9876",但实际项目中可能涉及到导入导出图书数据的文件操作,如CSV或XML格式,使用Qt的QFile、QTextStream等类实现文件读写。 8. 模块化编程:为了提高代码的可维护性和复用...

    数据库大作业.:基于C++&QT的仓库管理系统.zip

    数据导入导出则可能支持CSV或Excel格式,方便数据交换。 最后,项目中提供的README.md文件通常会包含详细的安装指南、系统需求、运行步骤以及可能遇到的问题和解决方案。这是理解和使用项目的重要资源,应首先查看...

    基于C++ QT实现的书签管理器源码,管理用户的书签内容, 支持书签的插入, 删除, 排序, 修改, 使用Qt制作应用界面

    这个基于C++和QT框架实现的书签管理器源码提供了一个完整的解决方案,不仅涵盖了基本的书签操作,还增加了数据持久化和导入导出功能。下面将详细介绍这个项目中的关键知识点。 1. C++编程语言:C++是这个项目的编程...

    基于Qt的文献管理系统.zip

    【文献管理】文献管理系统的核心功能可能包括文献的导入导出、分类管理、关键词搜索、版本控制等。使用Qt,开发者可以方便地实现这些功能,例如,通过QFileDialog选择文献文件,使用QSqlDatabase模块与数据库交互...

    ExportData.rar

    这个功能特别之处在于它是一键式的,且针对特定表格进行了定制,以满足快速、高效地导出数据的需求。 首先,我们要了解Qt 5,这是一个跨平台的应用程序开发框架,广泛应用于桌面、移动以及嵌入式设备。它的C++接口...

    QT&C++ 学生成绩管理系统 ,无需配置环境,有安装包,适合快速理解.zip

    5. 导入导出:支持成绩数据的导入导出,方便数据迁移或备份。 通过学习和实践这个QT&C++学生成绩管理系统,你可以深入理解如何结合C++的强类型特性和QT的图形化能力来开发实际应用。此外,你还可以了解到如何进行...

    C++程序设计实践项目——学生信息管理系统,基于Qt+MySQL.zip

    5. 数据导出与导入:将学生信息导出为文件,或从文件导入数据到系统。 6. 用户管理:设置不同的用户权限,例如管理员可以进行所有操作,而普通用户只能查看信息。 开发过程中,开发者可能采用了MVC(模型-视图-控制...

    课设作业:基于QT C++实现的学生信息管理系统.zip

    5. 数据导出与导入:系统应支持将学生信息导出为CSV或其他格式的文件,同时也应能导入已有的数据文件。 在实现过程中,开发者可能采用了MVC(Model-View-Controller)设计模式,将业务逻辑、数据展示和用户交互分离...

    基于Markdown语言的快速笔记软件,QT框架开发.zip

    使用了QT的QTextEdit或QPlainTextEdit部件作为Markdown编辑的基础,可能还结合了QFileSystemModel进行文件系统的操作,以及QProcess或QNetworkAccessManager实现导入导出和网络同步功能。通过QT的信号与槽机制,...

    C++编的通讯录

    - 为了方便数据迁移和备份,系统支持CSV或XML格式的数据导入导出。这些文件格式通用且易于解析,用户可以将通讯录数据与其他应用进行交换。 总的来说,这个C++编写的通讯录系统结合了C++的面向对象特性、Qt库的GUI...

    C++课程设计大作业:基于Qt-C++的学生成绩管理系统.zip

    7. **数据备份与恢复**:提供数据导出和导入功能,以防止数据丢失。 在实现这些功能时,开发者需要熟练掌握C++的面向对象编程思想,如封装、继承和多态,以及Qt库中的各种组件和API。同时,项目可能使用SQLite或...

    C语言程序设计大作业:学生成绩管理系统代码(Qt).zip

    3. 成绩录入模块:录入学生的各科成绩,支持批量导入和单个录入,同时提供成绩的导出功能。 4. 成绩统计模块:对所有成绩进行统计分析,如平均分、最高分、最低分、及格率等。 5. 查询模块:根据不同条件(如学号、...

    C++基于qt的手机通讯录管理系统源码.zip

    `Exchange`类可能涉及到数据交换或导入导出功能。比如,它可能支持将通讯录数据转换为CSV、VCF等格式,以便与其他设备或应用共享。 4. **editwidget.cpp 和 editwidget.h**: `EditWidget`可能是用于编辑联系人...

    基于Spark+hive的交通智能研判系统.zip

    在交通智能研判系统中,Hive起到了数据存储和预处理的作用,能够方便地进行数据导入、导出和数据清洗,同时为Spark提供了一个统一的数据访问接口。 结合Spark和Hive,这个系统能够实现以下关键功能: 1. **实时数据...

    学生通讯录系统.zip

    6. **导出/导入数据**:系统应提供功能将通讯录数据导出为文件,以便备份或在不同设备间同步,同时也能导入已存在的数据文件。 在QT C++中实现这些功能时,需要熟练运用面向对象编程(OOP)的概念,如类的设计和...

    dig-date.zip_dig_dig date

    在电影数据挖掘项目中,QT库可能被用来设计和实现一个用户友好的界面,用户可以通过这个界面输入查询条件,查看挖掘结果,或者进行数据的导入导出。 项目文件“Introduction.pptx”很可能包含了项目的详细介绍,...

    弹幕工具.rar

    8. 文件操作:可能提供导入和导出弹幕文件的功能,涉及文件读写操作。 综上所述,"弹幕工具.rar"是一个集成了C++编程语言和Qt库的桌面应用程序,其主要功能是模拟视频播放器中的弹幕效果。开发者可能运用了多种技术...

Global site tag (gtag.js) - Google Analytics