DataTable.Merge и DataTable.ImportRow не изменяют RowState - PullRequest
5 голосов
/ 22 сентября 2009

У меня проблемы со слиянием / импортом данных ADO.NET 2.0. Мне нужно обновить / вставить данные из одной универсальной таблицы в другую таблицу с обеими таблицами, поддерживающими идентичную схему. Следующий код отлично работает локально, но не вносит изменения в базу данных:

        OleDbDataAdapter localDA = loadLocalData();            
        OleDbDataAdapter hostedDA = loadHostedData();            

        DataSet dsLocal = new DataSet();            
        localDA.Fill(dsLocal);

        DataSet dsChanges = new DataSet();
        hostedDA.Fill(dsChanges);

        dsLocal.Tables[0].Merge(dsChanges.Tables[0],false);

        localDA.Update(dsLocal.Tables[0]);

То же самое верно с этим фрагментом кода:

        OleDbDataAdapter localDA = loadLocalData();
        OleDbDataAdapter hostedDA = loadHostedData();

        DataSet dsLocal = new DataSet();
        localDA.Fill(dsLocal);

        DataSet dsChanges = new DataSet();
        hostedDA.Fill(dsChanges);

        foreach (DataRow changedRow in dsChanges.Tables[0].Rows)
        {
            if (recordExists(dsLocal.Tables[0], changedRow["ID"]))
            {

            }
            else
            {
                dsLocal.Tables[0].ImportRow(changedRow);
            }
        }

        localDA.Update(dsLocal.Tables[0]);

Когда я посмотрел на свойство RowState для измененных / добавленных строк, они остались "неизменными". Я хочу, чтобы избежать отображения данных столбцов, если это возможно, что я, возможно, должен сделать с помощью метода NewRow () и изменения существующей строки.

Ответы [ 2 ]

6 голосов
/ 27 октября 2009

Вам нужно отключить соответствующую функцию для каждого DataRow.

  • DataRow.SetAdded ()
  • DataRow.SetModified ()

Это обновит значение DataRow.RowState. Это то, что использует DataAdapter, чтобы определить, какие строки нуждаются в том, какие действия над ними выполнены.

Было бы хорошо, если бы они были чем-то вроде набора данных в .net, чтобы он управлял этими мирскими деталями для нас.

5 голосов
/ 22 января 2013

Чтобы получить желаемое поведение, вместо dsLocal.Tables[0].Merge(dsChanges.Tables[0],false); я сделал следующее:

using (DataTableReader changeReader = new DataTableReader(dsChanges.Tables[0]))
    dsLocal.Tables[0].Load(newTableReader, LoadOption.Upsert);

Это считывает таблицу изменений и «upserts» в «локальную» таблицу, давая вам соответствующие уведомления об изменениях.

...