【唠叨两句】如何将一张树型结构的Excel表格中的数据导入到多张数据库表中...
小弟昨天遇到一个相对比较棘手的问题,就像标题说的那样、如何将一张树型结构的Excel表格中的数据导入到多张数据库表中,在现实中实际是七张数据库表,这七张表之间有着有着相对比较复杂的主外键关系,对于我这么洼的水平,刚遇到时确实愣了一下。不过还好、等冷静下来之后,慢慢的找到的了解决的办法。现在与大家分享一下处理思路及方法。
先说一下这里用到的一些主要的东东吧:
一、DataView类:
构造函数 DataView(dataTable)
方法
dataView.ToTable(String, Boolean, String[]) 【已重载】
方法解释:根据现有 DataView 中的行,创建并返回一个新的 DataTable。
二、DataTable类
dataTable.Merge(dataTable);[已重载]
方法解释:将指定的 DataTable 与当前的 DataTable 合并
三、DataRelation类:该类是用来表示两个DataTable中间的关系的。
DataRelation 的一项主要功能就是在 DataSet 中从一个 DataTable 浏览到另一个。 它使您能够在给定相关 DataTable 中的单个 DataRow 的情况下检索一个 DataTable 中的所有相关 DataRow 对象。
DataRelation 常用的构造函数,还有其他构造函数哦
名称 |
说明 |
DataRelation(String, DataColumn, DataColumn) |
使用指定的 DataRelation 名称,父级和子级 DataColumn 对象,初始化 DataRelation 类的新实例。 |
DataRelation(String, DataColumn[], DataColumn[]) |
使用指定的 DataRelation 名称以及父级和子级 DataColumn 对象的匹配的数组,初始化 DataRelation 类的新实例。 |
DataRelation中的常用属性
ChildColumns |
获取此关系的子 DataColumn 对象。 |
ChildTable |
获取此关系的子表。 |
DataSet |
获取 DataRelation 所属的 DataSet。 |
ParentColumns |
获取作为此 DataRelation 的父列的 DataColumn 对象的数组。 |
ParentTable |
获取此 DataRelation 的父级 DataTable。 |
RelationName |
获取或设置用于从 DataRelationCollection 中检索 DataRelation 的名称。 |
关于DataRelation的一个MSDN上的简单例子:
DataRelation customerOrdersRelation =
customerOrders.Relations.Add("CustOrders",
customerOrders.Tables["Customers"].Columns["CustomerID"],
customerOrders.Tables["Orders"].Columns["CustomerID"]);
foreach (DataRow custRow in customerOrders.Tables["Customers"].Rows)
{
Console.WriteLine(custRow["CustomerID"].ToString());
foreach (DataRow orderRow in custRow.GetChildRows(customerOrdersRelation))
{
Console.WriteLine(orderRow["OrderID"].ToString());
}
}
四、SqlBulkCopy 对象【适用于MSSQL】:用于极速插入数据
有了上述的这些东西我们就可以实现将一张树型结构的Excel表格中的数据导入到多张数据库表中了,下面我简单的说一下我的思路 及 处理方法。
在此以 类 、项、 种 为例,其中类是项的上一级,项是种的上一级。
类 数据库 表名:Classcification 字段名:ClassificationID【PK】,ClassificationName
项 数据库 表名:Term 字段名:TermID【PK】, TermName, ClassificationID
种 数据库 表名:Kind 字段名:KindID【PK】, KindName, TermID
先定义两个全局私有字段
#region 全局私有字段
/// <summary>
/// 源数据视图
/// </summary>
private DataView dvSource;
/// <summary>
/// 全部变量用来临时存放三个表及三个表之间的关系DataRelation
/// </summary>
private DataSet dsTemp;
#endregion
//全局阶段(1)
//类
DataTable Classification =new DataTable("Classification");
Classification.Columns.Add("ClassificationID");
Classification.Columns.Add("ClassificationName");
this.dsTemp.Tables.Add(Classification);
//项
DataTable Term =new DataTable("Term");
Term.Columns.Add("TermID");
Term.Columns.Add("TermName");
Term.Columns.Add("ClassificationID");
//辅助作用
Term.Columns.Add("ClassificationName");
//保存DataTable至全局变量DataSet中
this.dsTemp.Tables.Add(Term);
//建立类与项之间的关系
DataRelation ReClassTerm =new DataRelation("ReClassTerm", Classification.Columns["ClassificationName"], Term.Columns["ClassificationName"]);
//保存关系至DataSet
this.dsTemp.Relations.Add(ReClassTerm);
//种
DataTable Kind =new DataTable("Kind");
Kind.Columns.Add("KindID");
Kind.Columns.Add("KindName");
Kind.Columns.Add("TermID");
//辅助作用
Kind.Columns.Add("TermName");
//保存DataTable至全局变量DataSet中
this.dsTemp.Tables.Add(Kind);
//建立关系
DataRelation ReTermKind =new DataRelation("ReTermKind", Term.Columns["TermName"], Kind.Columns["TermName"]);
//保存关系至Dataset
this.dsTemp.Relations.Add(ReTermKind);
#endregion
处理方式见下:
、、前台工作 、、后台工作 // 数据处理:利用前台传过来的DataTable实例化全局的DataView // 全局阶段 // (1)生成 七张数据表DataTable 及他们之间的关系保存到全局DataSet中 // (2)源数据视图.ToTable()生成一个新的Table实例【此时的表中含有辅助作用的数据列】【Merge到 全局DateSet的相应表中】 // // 类-阶段 // (1)【获取全局DateSet中相应的表中的数据】 保存到DataTable // (2)获取数据库中已有的数据行 // (3)Foreach循环对比过滤重复数据行、将数据库中已经存在的数据行从当前的DataTable中移除。 // (4)写入主键值DateTime.Now.Ticks.ToString(); 用自动加一的方式赋值主键 // (5)用数据库框架结构表Merge(当前的数据表) // (6)SqlBulkCopy。WriteToServer(数据库框架结构表)【向数据库中插入数据】 // (7)清空当前DateSet中的当前表的所有记录 // (8)从数据库中读取所有的新记录,然后再次保存到全局DataSet中的相应表中 // 项-阶段 // (9) 【获取全局DateSet中相应的表中的数据】 保存到DataTable // (10)获取数据库中已有的数据行 // (11)Foreach循环对比过滤重复数据行即将数据库中已经存在的数据行从当前的DataTable中移除。 // (12)将父表的主键值写入到当前表的相应的数据列中【此时需要借助DataRelation连接父表】 // (13)注意:移除辅助作用数据列【因为数据库中不存在该数据列】 // (14)用数据库框架结构表Merge(当前的数据表) // (15)SqlBulkCopy。WriteToServer(数据库框架结构表)【插入数据】 // (16)清空当前DateSet中的当前表的所有记录 // (17)从数据库中读取所有的新记录,然后再次保存到全局DataSet中的相应表中 // 种-阶段 类似于项阶段 |
OK,到此结束了。。。
最后再唠叨两句,对于三个表而言这样做是有点繁琐了,但是对于多表而言,这样做我感觉还是不错的。
在整个过程中有两点需要注意:
(1)Merge的使用,这个方法使用来合并相识的两个DataTable,此方法不但能够改变Table中的数据而且可以改变table的结构。
(2)关于DateSet的,千万不能 用新DataTable 去赋值 全局DataSet中的DataTable,否则其DataRelation将会失效。此时如果想对DataSet中的某一个DataTable 用DataTable去赋值,请选用Merge方法。
如果大侠们还有好的建议或者想法 欢迎指教。。。
嘿嘿,我要休息喽。。。
转载于:https://www.cnblogs.com/08shiyan/archive/2010/08/16/1800362.html
【唠叨两句】如何将一张树型结构的Excel表格中的数据导入到多张数据库表中...相关推荐
- EF架构~单表一对多集合的插入(树型结构)
单表一对多关系很常见,它是一种树形结构,如系统菜单表,部门表,分类表,这些都可以做成单表一对多关系,而这些表做成一对多关系后,如果通过EntityFramework进行插入操作时,会很方便,EF会自动 ...
- excel几个表合成一张_Excel中怎样把多张表格中的数据合并到一张表格中
由于各种需要,我们往往会需要把多张表格中的数据内容合并成一张表格,那么应该怎么操作呢?我们以下为例: 下图中Sheet1是2011年的数据,sheet2是2012年的数据,最后要把它们合并在一张新表上 ...
- mysql 转成树_Mysql树型结构2种方式及相互转换
Mysql实现树型结构,数据库上常见有2种方式:领接表.预排序遍历树(MPTT). 领接表方式-- 主要依赖于一个 parent 字段,用于指向上级节点,将相邻的上下级节点连接起来,id 为自动递增自 ...
- axure树形表格_Axure教程:可增删改的树型结构
原标题:Axure教程:可增删改的树型结构 今天,教大家如何做一个树型结构,以及节点与节点之间相互交互的内容. 演示地址:http://b0bgsg.axshare.cn/#g=1&p=树 一 ...
- 无限极分类php简单,创建无限极分类树型结构的简单方法
先上效果图 顶级分类其实就是一级分类,二级分类也叫作一级分类的子分类,在这个基础上,子分类还可以拥有子分类,这样就构成了无限极分类. 接下来看具体实现的代码: 一.在控制器中按字段查询,查询出所有分类 ...
- 二叉树Ⅰ · 树型结构 · 二叉树 · 满二叉树 · 完全二叉树 · 二叉树的性质 · 二叉树的存储
目录 一.树型结构(了解) 1.1 引入和特点 1.2 概念(重要) 1.3 树的表示形式(了解) 二.二叉树(重点) 2.1 概念 2.2 二叉树的基本形态 2.3 两种特殊的二叉树 满二叉树 完全 ...
- Linux TC 流量控制与排队规则 qdisc 树型结构详解(以HTB和RED为例)
1. 背景 Linux 操作系统中的流量控制器 TC (Traffic Control) 用于Linux内核的流量控制,它规定建立处理数据包的队列,并定义队列中的数据包被发送的方式,从而实现对流量的控 ...
- 树型结构(数据结构)
6.1树的基本概念 树型结构是区别于线性结构的另一大数据结构,它具有分支性和层次性. 树是由n(n>=0)个结点构成的有限集合.n=0的树称为空树:当n!=0时,树中的结点度应该满足下列条件: ...
- mysql插入多行数据来自另一张表_mysql从一张表查询批量数据并插入到另一表中的完整实例...
说在前面 nodejs 读取数据库是一个异步操作,所以在数据库还未读取到数据之前,就会继续往下执行代码. 最近写东西时,需要对数据库进行批量数据的查询后,insert到另一表中. 说到批量操作,让人最 ...
最新文章
- 某口腔app发现了不友善词汇(f*ckMobile)
- JavaScript获取节点类型、节点名称和节点值
- 分享12306抢票心得-终极秒杀思路篇
- 存储维护和服务器的区别,存储服务器和普通服务器区别是什么? 你想知道吗服务器类型一般是什么...
- [Ext JS 4] 实战之 ComboBox 和 DateField 的点击事件在IE下失效
- glmark2移植到嵌入式Linux,嵌入式中移植基于Framebuffer的LittlevGL
- 繁凡的对抗攻击论文精读(一)CVPR 2019 基于决策的高效人脸识别黑盒对抗攻击(清华朱军)
- Linux文字识别软件,linux下的文字识别软件tesseract ( OCR software in Linux: tesseract )
- 两小时从零学会vue-admin-template框架
- Android 仿照美团城市选择,微信小程序仿美团城市选择
- 瑞鹄转债上市价格预测
- 强力数据恢复精灵 v1.9.0
- Neuroink的8个疯狂梦想
- fitbit手表中文说明书_最佳Fitbit:哪一个适合您?
- 12种食品狂吸走你的多余脂肪
- 卧槽,这竟然不是阿汤哥?这个「真的吓人」视频火爆全网
- 杨振宁:佛教与科学彻底相容
- 更换主板开机logo
- 解决上传图片到服务器 水印文字显示框框不显示文字的问题
- 2021SC@SDUSC PALISADE开源库(二)CKKS讲解系列(一)普通编码和解码
热门文章
- 【重磅】吴恩达宣布 Drive.ai 自动驾驶汽车服务落地 理想就这样成了现实!
- 人工智能对医疗行业影响的专题研究:基本结论
- 业界 | 计算芯片革命来临?英伟达谷歌入局紧逼英特尔
- 挑战 Linux 之父认为的“不可能”:向 M1 Mac 移植 Linux
- 校招容易踩雷?这份“避雷针”指南拿走不谢
- BBSSDK插件技术方案
- (volatile int)(x)与*(volatile int *)(x)
- Git学习系列之Git基本操作提交项目(图文详解)
- 迁移不是云计算面临的唯一障碍
- mosquitto---config.mk