合并多个ADO.NET数据集

时间:2010-02-16 18:42:06

标签: c# .net dataset

方案

我有一个带有gridview的c#winforms应用程序。 gridview数据源由数据集填充。 此数据集的内容每隔几秒就会更新一次,并且数据集中的项目数量并不总是相同。 数据集实际上被多个其他数据集一次一个地传入(或需要填充)。这些数据集在完全随机的时间更新,无法控制。

问题

由于GridView数据集本质上是“持续更新” - 在更新时(需要将现有GridView数据源中包含最新信息的新数据集合并到一起)我需要填充gridview的当前数据集的副本,将其与来自其他数据集的传入数据进行比较,并仅更新新数据。

到目前为止

我尝试过一系列不同的方法,但似乎无法让它发挥作用。我最终得到的数据集只是被添加到不断重复的略有不同的数据,或者行随机被删除(我尝试使用合并所有然后删除方法只能偶尔使用)。

我有什么想法可以绕过这个!?

目前,gridview只是自我更新,以显示最新的传入数据集,而不会将之前的数据集合并到其中......

CODE - 这会随机删除行,即使它在某些点显示所有数据

//If the existing GridView dataset contains any rows that 
//exist in the incoming latest dataset (matched on the two unique fields
//of the dataset), then remove that row from the existing GridView dataset
for (int i = 0; i < existingPriceResultsDTCopyForCompare.Rows.Count; i++)
{
    foreach (DataRow incomingRow in incomingDS.Tables[0].Rows)
    {
        string incomingDate = incomingRow["Date"].ToString();

        DataRow currentRow = existingPriceResultsDTCopyForCompare.Rows[i];
        if ((currentRow["CCY"].ToString().Contains(incomingCcy))
            && (currentRow["Date"].ToString().Contains(incomingDate)))
        {
            existingPriceResultsDT.Rows.RemoveAt(i);

        }
    }
}

//Then merge the existing GridView dataset (Minus the old data that 
//matches the data from the incoming Dataset with the latest information),
//With the brand new incoming data.
incomingDS.Merge(existingPriceResultsDT);

编辑 -

我开始怀疑在迭代有时间完成之前,传入的数据集是否会被下一个传入数据集覆盖。所以我猜我需要锁定传入的DataSet?

3 个答案:

答案 0 :(得分:1)

你有没有试过类似的东西

  DataSet ds1 = new DataSet();
  DataSet ds2 = new DataSet();   

  ds1.Merge(ds2);    
  DataSet ds3 = ds1.GetChanges();

根据您的对象

  DataSet existingPriceResultsDT = new DataSet();
  DataSet incomingDS = new DataSet();

  incomingDS.Merge(existingPriceResultsDT);
  existingPriceResultsDT = incomingDS.GetChanges();

答案 1 :(得分:0)

您可能需要查看Microsoft Sync Framework。这听起来像是一个完美的场景。这个video是一个很好的介绍。您也可以下载教程here

答案 2 :(得分:0)

嵌套的for-loop东西是一个很大的噩梦。你肯定想要摆脱循环这些行 - 很多不必要的比较。

看起来你每次都要比较几个列 - “CCY”和“Date”。您是否考虑过将它们作为桌子的主键?如果这对您的场景有意义,那么您可以提高效率。

你可以考虑做这样的事情:

确定哪些列是主键 - 此处显示CCY和Date适合您。

DataColumn[] keys = new DataColumn[2];
keys[0] = dataTable.column["CCY"];
keys[1] = dataTable.column["Date"];
dataTable.PrimaryKey = keys;

然后当你读入一个新的DataSet时 - 无论如何你都这样做,就像这样调用Merge:

dataSet.Merge(newDataSet, false, MissingSchemaAction.Add);

这里的假设是dataTable是dataSet的Tables [0]。

至少对于我的快速测试程序,这将合并两个DataSet并更新已更改的行并添加任何新的。

而且,我只是设置了我的DataGridView:

dataGridView1.DataSource = dataSet.Tables[0];

似乎为我的测试程序更好地更新了视图。

希望有所帮助。