Копирование строк с использованием tableadapter не фиксирует изменения на диске - PullRequest
1 голос
/ 03 апреля 2019

Я пытаюсь скопировать недостающие записи из одной базы данных в другую. Две базы данных - это старые базы данных Access. Я использую C #, набор данных, адаптеры таблиц и т. Д. Целевой объект таблицы заканчивается с правильным количеством строк, но базовая база данных не обновляется. Что мне не хватает? И я делаю примерно правильные вещи или есть лучший, более простой способ. У рассматриваемых таблиц нет индексов, поэтому я определяю, существует ли запись, создавая Hashset того, что должно быть ключевым полем в целевой таблице.

Код ниже. Источники данных и т. Д. Были созданы с помощью мастера в VS 2019.

Я исследовал сеть, но нашел только много примеров того, как копировать объекты таблицы данных, и ничего о фиксации изменений в базовой базе данных.


namespace ImportTstatDB
{
    class Program
    {
        static void Main(string[] args)
        {
            var srcDataSet = new _TSTAT_SPECDataSetSrc();
            var dstDataSet = new _TSTAT_SPECDataSetDst();
            ImportMissingSpecificationMain(srcDataSet, dstDataSet);
            //ImportMissingResultSets(srcDataSet, dstDataSet);
            dstDataSet.AcceptChanges();
            srcDataSet.RejectChanges();
        }


        private static void ImportMissingSpecificationMain(_TSTAT_SPECDataSetSrc srcDataSet, _TSTAT_SPECDataSetDst dstDataSet)
        {
            var srcTableAdapter = new _TSTAT_SPECDataSetSrcTableAdapters.SpecificationMainTableAdapter();
            srcTableAdapter.Fill(srcDataSet.SpecificationMain);
            var srcTable = srcTableAdapter.GetData();

            var dstTableAdapter = new _TSTAT_SPECDataSetDstTableAdapters.SpecificationMainTableAdapter();
            dstTableAdapter.Fill(dstDataSet.SpecificationMain);
            var dstTable = dstTableAdapter.GetData();

            var transformerIDs = new HashSet<string>();
            foreach (var dstRow in dstTable)
            {
                var transformerID = dstRow.TransformerID;
                transformerIDs.Add(transformerID);
            }
            foreach (var srcRow in srcTable)
            {
                var transformerID = srcRow.TransformerID;
                if (!transformerIDs.Contains(transformerID))
                {
                    // Doesn't exist so copy
                    srcRow.SetAdded();
                    dstTable.ImportRow(srcRow);
                }
            }
            dstTable.AcceptChanges();
            dstTableAdapter.Update(dstTable);

        }

1 Ответ

0 голосов
/ 03 апреля 2019

Эта строка встречается в моих комментариях:

// Do NOT call AcceptChanges here as this would clear property RowState.

Таким образом, попробуйте закомментировать эту строку:

// dstTable.AcceptChanges();
dstTableAdapter.Update(dstTable);
...