繁体   English   中英

合并多个ADO.NET数据集

[英]Merging Multiple ADO.NET DataSets

情境

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

问题

由于本质上GridView数据集是“连续更新”的-在更新时(需要将其中具有最新信息的新数据集与现有GridView数据源合并的点),我需要复制当前的数据集填充gridview,将其与其他数据集的传入数据进行比较,并仅更新新数据。

至今

我尝试了一系列不同的方法,但似乎无法正常工作。 我要么最终只是将数据集添加到不断重复的略有不同数据的重复项中,要么随机删除了行(我尝试使用“合并所有然后删除”的方法,这种方法仅偶尔起作用)。

有什么想法可以解决这个问题!?

目前,gridview只是更新自身以显示最新的传入数据集,而不会合并先前的数据集.....

代码-即使在某些时候显示所有数据,它也会随机删除行

//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 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();

您可能需要研究Microsoft Sync Framework 这听起来像是一个完美的方案。 视频是一个很好的介绍。 您也可以在此处下载教程。

嵌套的循环循环是一个很大的噩梦。 您绝对想摆脱遍历这些行的麻烦-很多不必要的比较。

好像您每次都在比较几列-“ CCY”和“ Date”。 您是否考虑过将它们用作表的主键? 如果这对您的情况有意义,则可以使工作效率大大提高。

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

确定哪些列是主键-在这里似乎CCY和Date适合您。

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

然后,当您读入一个新的数据集时,尽管如此,请像这样调用Merge:

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

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

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

而且,我只是这样设置了DataGridView:

dataGridView1.DataSource = dataSet.Tables[0];

似乎足以为我的测试程序更新视图。

希望能有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM