0

我有一个程序,用户可以选择使用不可预测的列模式映射各种数据源。所以他们可能有一个包含 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 是一种“巧妙”的方法吗?

4

1 回答 1

0

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

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

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

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

当您完成构建选择的文本时,您可以在 ADO 中运行一个选择以获取行,并且实际的移动变得像读/写一样简单,字段按照您的需要进入。您还可以将该选择用于“插入选择...”。

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

于 2013-07-24T14:24:41.860 回答