DataTable.Merge и DataTable.ImportRow не изменяют RowState

У меня возникают проблемы с объединением/импортом данных 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() и изменяя существующую строку.


person Blake Blackwell    schedule 22.09.2009    source источник
comment
Я могу придумать решение, которое изменяет RowState при использовании ImportRow. Будет работать следующий фрагмент кода: dsLocal.Tables[0].ImportRow(changedRow); dsLocal.Tables[0].Rows[dsLocal.Tables[0].Rows.Count - 1].SetAdded(); Однако это работает только при добавлении строк, а не при обновлении строк. Любые идеи по слиянию были бы очень полезны!   -  person Blake Blackwell    schedule 22.09.2009


Ответы (2)


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

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

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

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

person Chad    schedule 27.10.2009
comment
обратите внимание: когда я использую row.SetAdded(), я получаю сообщение об исключении: SetAdded и SetModified могут использоваться только в том случае, если статус строки неизменен. - person IAbstract; 14.12.2010
comment
Вы хотите использовать только один из них за раз. - person JeffO; 28.02.2011

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

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

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

person Mark Sowul    schedule 21.01.2013