小弟昨天遇到一个相对比较棘手的问题,就像标题说的那样、如何将一张树型结构的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及关系并保存

#region 类、项、种 注意此时的数据表与数据库的表结构不一致

//类

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

处理方式见下:

、、前台工作
将Excel保存到DataTable中,然后将DataTable 传至后台

、、后台工作

// 数据处理:利用前台传过来的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表格中的数据导入到多张数据库表中...相关推荐

  1. EF架构~单表一对多集合的插入(树型结构)

    单表一对多关系很常见,它是一种树形结构,如系统菜单表,部门表,分类表,这些都可以做成单表一对多关系,而这些表做成一对多关系后,如果通过EntityFramework进行插入操作时,会很方便,EF会自动 ...

  2. excel几个表合成一张_Excel中怎样把多张表格中的数据合并到一张表格中

    由于各种需要,我们往往会需要把多张表格中的数据内容合并成一张表格,那么应该怎么操作呢?我们以下为例: 下图中Sheet1是2011年的数据,sheet2是2012年的数据,最后要把它们合并在一张新表上 ...

  3. mysql 转成树_Mysql树型结构2种方式及相互转换

    Mysql实现树型结构,数据库上常见有2种方式:领接表.预排序遍历树(MPTT). 领接表方式-- 主要依赖于一个 parent 字段,用于指向上级节点,将相邻的上下级节点连接起来,id 为自动递增自 ...

  4. axure树形表格_Axure教程:可增删改的树型结构

    原标题:Axure教程:可增删改的树型结构 今天,教大家如何做一个树型结构,以及节点与节点之间相互交互的内容. 演示地址:http://b0bgsg.axshare.cn/#g=1&p=树 一 ...

  5. 无限极分类php简单,创建无限极分类树型结构的简单方法

    先上效果图 顶级分类其实就是一级分类,二级分类也叫作一级分类的子分类,在这个基础上,子分类还可以拥有子分类,这样就构成了无限极分类. 接下来看具体实现的代码: 一.在控制器中按字段查询,查询出所有分类 ...

  6. 二叉树Ⅰ · 树型结构 · 二叉树 · 满二叉树 · 完全二叉树 · 二叉树的性质 · 二叉树的存储

    目录 一.树型结构(了解) 1.1 引入和特点 1.2 概念(重要) 1.3 树的表示形式(了解) 二.二叉树(重点) 2.1 概念 2.2 二叉树的基本形态 2.3 两种特殊的二叉树 满二叉树 完全 ...

  7. Linux TC 流量控制与排队规则 qdisc 树型结构详解(以HTB和RED为例)

    1. 背景 Linux 操作系统中的流量控制器 TC (Traffic Control) 用于Linux内核的流量控制,它规定建立处理数据包的队列,并定义队列中的数据包被发送的方式,从而实现对流量的控 ...

  8. 树型结构(数据结构)

    6.1树的基本概念 树型结构是区别于线性结构的另一大数据结构,它具有分支性和层次性. 树是由n(n>=0)个结点构成的有限集合.n=0的树称为空树:当n!=0时,树中的结点度应该满足下列条件: ...

  9. mysql插入多行数据来自另一张表_mysql从一张表查询批量数据并插入到另一表中的完整实例...

    说在前面 nodejs 读取数据库是一个异步操作,所以在数据库还未读取到数据之前,就会继续往下执行代码. 最近写东西时,需要对数据库进行批量数据的查询后,insert到另一表中. 说到批量操作,让人最 ...

最新文章

  1. 某口腔app发现了不友善词汇(f*ckMobile)
  2. JavaScript获取节点类型、节点名称和节点值
  3. 分享12306抢票心得-终极秒杀思路篇
  4. 存储维护和服务器的区别,存储服务器和普通服务器区别是什么? 你想知道吗服务器类型一般是什么...
  5. [Ext JS 4] 实战之 ComboBox 和 DateField 的点击事件在IE下失效
  6. glmark2移植到嵌入式Linux,嵌入式中移植基于Framebuffer的LittlevGL
  7. 繁凡的对抗攻击论文精读(一)CVPR 2019 基于决策的高效人脸识别黑盒对抗攻击(清华朱军)
  8. Linux文字识别软件,linux下的文字识别软件tesseract ( OCR software in Linux: tesseract )
  9. 两小时从零学会vue-admin-template框架
  10. Android 仿照美团城市选择,微信小程序仿美团城市选择
  11. 瑞鹄转债上市价格预测
  12. 强力数据恢复精灵 v1.9.0
  13. Neuroink的8个疯狂梦想
  14. fitbit手表中文说明书_最佳Fitbit:哪一个适合您?
  15. 12种食品狂吸走你的多余脂肪
  16. 卧槽,这竟然不是阿汤哥?这个「真的吓人」视频火爆全网
  17. 杨振宁:佛教与科学彻底相容
  18. 更换主板开机logo
  19. 解决上传图片到服务器 水印文字显示框框不显示文字的问题
  20. 2021SC@SDUSC PALISADE开源库(二)CKKS讲解系列(一)普通编码和解码

热门文章

  1. 【重磅】吴恩达宣布 Drive.ai 自动驾驶汽车服务落地 理想就这样成了现实!
  2. 人工智能对医疗行业影响的专题研究:基本结论
  3. 业界 | 计算芯片革命来临?英伟达谷歌入局紧逼英特尔
  4. 挑战 Linux 之父认为的“不可能”:向 M1 Mac 移植 Linux
  5. 校招容易踩雷?这份“避雷针”指南拿走不谢
  6. BBSSDK插件技术方案
  7. (volatile int)(x)与*(volatile int *)(x)
  8. Git学习系列之Git基本操作提交项目(图文详解)
  9. 迁移不是云计算面临的唯一障碍
  10. mosquitto---config.mk