0

好吧,假设我从一开始就有 2 个数据表。

第一个(源)包含来自 da 数据库的数据。第二个还包含来自数据库的数据,这些值必须更新到第一个数据库中。

不幸的是,它们没有相同的结构。sourcedatatable 有一些额外的列,第二个没有。

例如:

First DT: ID | Name | Company | Age
Second DT: Name | Company | Age

如果存在一些差异(并且只有差异),我希望使用第二个 DataTable 中的值更新第一个 DataTable。

关于如何解决这个问题的任何想法?任何关于性能的建议,即使使用非常大的数据库?

4

2 回答 2

0

如果您正在处理大量数据,我建议您尽可能靠近数据库(如果可能在存储过程中)。

如果必须坚持使用 .NET,那么根据您提供的场景描述,我会考虑这些选项。

首先我会选择如何加载数据(我会考虑它们的顺序):

  1. 生成实体 (LINQ to SQL)。
  2. 使用 F# 类型提供程序
  3. 直接使用 ADO

在此之后,我会:

  1. 在 IQueryable 源上使用 .Select 和 .Except,或
  2. 做一些类似于http://canlu.blogspot.ro/2009/05/how-to-compare-two-datatables-in-adonet.html的事情,如果我有机会使用 ADO.NET

如果您不提供有关数据类型、数量、硬件、数据库类型的更多信息,则很难给出具体而准确的答案。

注意:无论您选择哪种解决方案,您都应该记住,很难比较不同结构的事物,因此需要一个额外的步骤来将空列添加到缺少列的列中。

于 2013-09-20T10:38:48.563 回答
0

此代码仅供参考,我没有时间测试它。它可能需要一些调整。尝试类似:

var a = new DataTable();
a.Columns.Add("ID");
a.Columns.Add("Name");
a.Columns.Add("Company");
a.Columns.Add("Age");

var b = new DataTable();
b.Columns.Add("Name");
b.Columns.Add("Company");
b.Columns.Add("Age");

var destination = a.AsEnumerable();
var localValues = b.AsEnumerable();


var diff = destination.Join(localValues, dstRow => dstRow["Name"], srcRow => srcRow["Name"],
    (dstRow, srcRow) => 
new {Destination = dstRow, Source = srcRow})
.Where(combinedView =>
    combinedView.Destination["Age"] != combinedView.Source["Age"] ||
    combinedView.Destination["Company"] != combinedView.Source["Company"]);

此外,我真的会转移到一个合适的数据库,也许会改进数据模型。

于 2013-09-20T11:19:47.190 回答