Объединение нескольких наборов данных ADO.NET - PullRequest
1 голос
/ 16 февраля 2010

Сценарий

У меня есть приложение c # winforms с 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?

Ответы [ 3 ]

1 голос
/ 16 февраля 2010

Вы пробовали что-то подобное

  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();
0 голосов
/ 16 февраля 2010

Этот вложенный материал для цикла - большой кошмар. Вы определенно хотите выйти из цикла циклического прохождения этих строк - много ненужных сравнений.

Похоже, у вас есть пара столбцов, которые вы сравниваете каждый раз - "CCY" и "Date". Рассматривали ли вы их использование в качестве основного ключа для таблицы? Если это имеет смысл для вашего сценария, вы можете сделать вещи значительно более эффективными.

Вы могли бы рассмотреть возможность сделать что-то вроде этого:

Определите, какие столбцы являются первичными ключами - здесь показано, что CCY и Дата для вас.

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 - это таблицы [0] набора данных.

Это, по крайней мере для моей программы быстрого тестирования, объединит два набора данных и обновит измененные строки и добавит новые.

И я только что настроил свой DataGridView так:

dataGridView1.DataSource = dataSet.Tables[0];

Похоже, что обновление достаточно хорошо для моей тестовой программы.

Надеюсь, это поможет.

0 голосов
/ 16 февраля 2010

Возможно, вы захотите взглянуть на Microsoft Sync Framework .Это звучит как идеальный сценарий для этого.Это видео является хорошим введением.Вы также можете скачать учебные пособия здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...