2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > 【唠叨两句】如何将一张树型结构的Excel表格中的数据导入到多张数据库表中...

【唠叨两句】如何将一张树型结构的Excel表格中的数据导入到多张数据库表中...

时间:2022-08-28 13:53:01

相关推荐

【唠叨两句】如何将一张树型结构的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中的常用属性

关于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

处理方式见下:

OK,到此结束了。。。

最后再唠叨两句,对于三个表而言这样做是有点繁琐了,但是对于多表而言,这样做我感觉还是不错的。

在整个过程中有两点需要注意:

(1)Merge的使用,这个方法使用来合并相识的两个DataTable,此方法不但能够改变Table中的数据而且可以改变table的结构。

(2)关于DateSet的,千万不能 用新DataTable 去赋值 全局DataSet中的DataTable,否则其DataRelation将会失效。此时如果想对DataSet中的某一个DataTable 用DataTable去赋值,请选用Merge方法。

如果大侠们还有好的建议或者想法 欢迎指教。。。

嘿嘿,我要休息喽。。。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。