将行从DataTable复制到具有不同列架构的另一行

我正在优化从前一个员工的代码库中分配的一些代码。 除了这个代码很好的“spaghettified”的事实,我遇到了一个问题,我不知道如何正确优化。

下面的代码片段不是一个确切的复制,但应该详细说明问题。

他从一个Excel spreasheet中取出一个DataTable ,并将行放入一个格式一致的DataTable中,后者更新数据库。 这对我来说似乎是合乎逻辑的,但是他复制数据的方式似乎令人费解,而且是修改,维护或添加新格式的极大痛苦。

这是我所看到的:

 private void VendorFormatOne() { //dtSumbit is declared with it's column schema elsewhere for (int i = 0; i < dtFromExcelFile.Rows.Count; i++) { dtSubmit.Rows.Add(i); dtSubmit.Rows[i]["reference_no"] = dtFromExcelFile.Rows[i]["VENDOR REF"]; dtSubmit.Rows[i]["customer_name"] = dtFromExcelFile.Rows[i]["END USER ID"]; //etc etc etc } } 

对我来说,将列映射到不同的模式是完全过分的,但我想不出一种更优雅的方式。 在实际的解决scheme中,大约有20个这样的方法,全部使用了dtFromExcelFile不同格式,而列列表则更长。 dtSubmit的列架构在整个板上保持不变。

我正在寻找一种方法来避免每次公司需要从供应商加载新文件时手动映射这些列。 有没有办法更有效地做到这一点? 我确定我在这里忽略了一些东西,但没有在SO或其他地方find任何相关的答案。

这可能是矫枉过正的,但是你可以定义一个描述哪个Excel列映射到哪个数据库字段的XML文件,然后将其与每个新的Excel文件一起input。 你需要掀起一个或两个类来parsing和使用这个文件,或许还有另外一个类来validationExcel文件是否符合XML文件。

根据你的组织的规模,这可能会给你额外的好处,能够把那个乏味的映射卸载到不熟练的人。 然而,这是一个相当多的设置工作,如果这种情况只发生,你可能不会获得巨大的投资回报,创造这么多的基础设施。

另外,如果你使用的是MS SQL Server,这基本上就是SSIS的基础,尽pipe根据我的经验,大多数程序员发现SSIS非常繁琐。

我原本打算作为一个评论,但空间不足。 这是对弥迦的回答和你的第一个评论。

这里最大的问题是XML映射的数量将等于代码中的手动映射

  • 考虑构build一个小工具,给定一个包含两列的Excel文件,生成XML映射文件。 现在,您可以将映射工作卸载到供应商或实习生,或者确实是任何具有特定供应商项目的需求文档副本的人员。

  • 由于该文件是在运行时在导入应用程序或其他任何地方加载的,因此您可以更改映射而不必重新部署应用程序。

  • 过去我曾多次使用过这种系统,我可以告诉你:你会高兴你花时间去做 – 特别是第一次按照“哎呀,我们需要给我们提供的数据添加一个新的列,我们意识到我们错过了第19列。“

  • 关于唯一可能出错的是数据types转换,但是您可以将其构build到映射文件中(inputfrom / to)并概括导入例程来为您执行转换。

只是我的2C。

前一段时间,我遇到了类似的问题,我从数据库的实际表中将30多个表中的400多列映射到大约60个。 我有同样的困境,无论是与架构或写一些自定义的东西。

有太多的重复,我最终编写了一个简单的助手类与几个重写的方法,基本上从导入表中取出一个列名,并吐出数据库的列名称。 另外,对于列名,我build立了一个单独的格式类

 public static class ColumnName { public const string FirstName = "FirstName"; public const string LastName = "LastName"; ... } 

同样的事情也适用于TableNames。

这使维护表名和列名变得简单多了。 此外,这处理了不同表格中的重复列,很好地避免了重复的代码。