.NET使用不同的模式将DataTable的内容转换为另一个DataTable

时间:2013-07-24 14:17:06

标签: sql .net linq ado.net

我有一个程序,用户可以选择使用不可预测的列模式映射各种数据源。因此,他们可能有一个带有10个字段的SQL Server数据库或带有20个的excel文件 - 名称可以是任何内容,字段的数据类型可以是文本和数字,日期等的混合。

然后,用户必须提供每个字段的含义映射。因此,第4列是“LocName”,第2列是“LocX”,第1列是“LocDate”等。用户作为要映射的选项呈现的名称和数据类型由DataSet DataTable很好地定义( XSD xchema文件)。

例如,如果源包含如下格式的数据:

User Column 1: "LocationDate" of type string
User Column 2: "XCoord" of type string
User Column 3: "YCoord" of type string
User Column 4: "LocationName" of type int

并且用户提供的映射需要转换为应用程序所需的DataTable:

Application Column "LocName" of type string   = Column **4** of user table
Application Column "LocX" of type double      = Column **2** of user table
Application Column "LocY" of type double      = Column **3** of user table
Application Column "LocDate" of type datetime = Column **1** of user table

我有连接到源的例程,并以“原始”格式将用户查询的数据作为DataTable提取 - 因此它采用了源的模式。

我的问题是,那么将数据从原始DataTable“转换”到我所需的应用程序DataTable中的最佳方法是什么,此投影必须考虑类型转换?

foreach显然会起作用,但这似乎是暴力,因为它必须考虑每行上每个循环的数据类型。使用LINQ或ADO.NET是一种“光滑”的方式吗?

1 个答案:

答案 0 :(得分:0)

我通常会选择“看起来像”目标表,但使用源表中的数据。您还可以根据需要应用数据转换。

Select
  Cast (LocationNameLocationName As varChar(...) As LocName
, LocX  As XCoord
, ...
From SourceTable

很难用简单的答案来描述。我过去所做的是发出一个“空”查询,例如“Select * From sourcetable Where 1 = 0”,它不返回任何行,但会使结果集中的所有列及其类型可用。您可以遍历列ADO对象以获取每个对象的类型。然后,您可以使用该信息动态构建带有转换的真实SQL语句。

您仍然有很多逻辑来决定转换,但它们都是在您构建语句时发生的,而不是在读取表时。您仍然必须在代码中说“如果源列是Integer而目标列是字符,那么我想生成select',Cast(作为Varchar)'”

当你完成构建select的文本时,你有一个可以在ADO中运行的选择来获取行,实际的移动变得像读/写一样简单,字段就像你想要的那样进入。您也可以使用该选项进行“插入选择...”。

希望这是有道理的。这个概念比描述更容易。