powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Непонятное поведение DataSet.Merge()
25 сообщений из 26, страница 1 из 2
Непонятное поведение DataSet.Merge()
    #37965098
Nikolay206
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем добрый день.
У меня клиент-серверное приложение. Передаю DataSet через string используя сериализацию. Все таблицы в DataSet имеют первичный ключ.
Я хочу сэкономить трафик передачи данных. Для этого хочу передавать только изменения данных.
Для экономии места я использую на сервере хранилище DataSet dataSetCache и выполняю Merge с новыми данными.

Столкнулся с одной проблемой. Данные отличаются всего в одной строке, а функция GetChanges() возвращает огромный DataSet (после сериализации занимает 5 метров).

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
dataSetCache.AcceptChanges();
//После сохранения получаю dataSet.xml размером в 12 Мб
dataSet.WriteXml("C:\\xmlTemp\\dataSet.xml", XmlWriteMode.WriteSchema);
dataSet.Merge(dataSetCache, false, MissingSchemaAction.AddWithKey);
//После сохранения получаю dataSetCache.xml размером в 12 Мб. Если сравнить их в AraxisMarge то они отличаются 
//всего двумя строчками
dataSet.WriteXml("C:\\xmlTemp\\dataSetCache.xml", XmlWriteMode.WriteSchema);               
var d = dataSet.GetChanges();
if (d != null)
{
   // Размер changes2.xml составляет 5 Мб
   d.WriteXml("C:\\xmlTemp\\changes2.xml");
   dataSet.AcceptChanges();
   d.AcceptChanges();
}



Подскажите в чем может быть проблема.
...
Рейтинг: 0 / 0
Непонятное поведение DataSet.Merge()
    #37965151
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nikolay206Для экономии места я использую на сервере хранилище DataSet dataSetCache и выполняю Merge с новыми данными.

Смешно, выбрал самый громозский класс в нэте для экономии места
...
Рейтинг: 0 / 0
Непонятное поведение DataSet.Merge()
    #37965199
Nikolay206
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А что вы можете предложить взамен?
Нужно из БД считать данные в нескольких таблицах.
...
Рейтинг: 0 / 0
Непонятное поведение DataSet.Merge()
    #37965209
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nikolay206А что вы можете предложить взамен?
Нужно из БД считать данные в нескольких таблицах.

использовать бизнес-классы
...
Рейтинг: 0 / 0
Непонятное поведение DataSet.Merge()
    #37965217
Nikolay206
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не понимаю что поменяется.
На сколько сильно будет отличаться сериализованный файл бизнес объекта от сериализованного датасета?
Ведь вместо <Table> в сериализации будет имя класса, а вместо <имя колонки> будет имя проперти.
...
Рейтинг: 0 / 0
Непонятное поведение DataSet.Merge()
    #37965545
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MissingSchemaAction.AddWithKey зачем? У тебя походу колонка(и) добавляется. В результате все записи таблицы считаются изменёнными.
...
Рейтинг: 0 / 0
Непонятное поведение DataSet.Merge()
    #37965623
Nikolay206
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нет, не добавляется. Все колонки одинаковые.
Я же говорю беру сохраненный датасет, далаю WriteXml в файл. Потом мержу на него изменения и снова делаю WriteXml
В результате сравниваю два файла. Они отличаются только одной строчкой.
Сейчас вообще getChanges возвращает null.
...
Рейтинг: 0 / 0
Непонятное поведение DataSet.Merge()
    #37965627
Nikolay206
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот код
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
                dataSet.AcceptChanges();
                dataSetCache.AcceptChanges();
                dataSet.WriteXml("C:\\xmlTemp\\dataSet.xml", XmlWriteMode.WriteSchema);
                dataSet.Merge(dataSetCache, false, MissingSchemaAction.AddWithKey);
                dataSet.WriteXml("C:\\xmlTemp\\dataSet2.xml", XmlWriteMode.WriteSchema);
                var d = dataSet.GetChanges();
                if (d != null)
                {
                    d.WriteXml("C:\\xmlTemp\\changes2.xml");
                    dataSet.AcceptChanges();
                    d.AcceptChanges();
                }
...
Рейтинг: 0 / 0
Непонятное поведение DataSet.Merge()
    #37965770
Nikolay206
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ни как не могу понять почему dataSet.GetChanges() возвращает null
Хотя данные реально изменены.
...
Рейтинг: 0 / 0
Непонятное поведение DataSet.Merge()
    #37969513
Nikolay206
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Господа, есть ли у кого-нибудь опыт работы с dataSet.Merge и dataSet.GetChanges()
Почему после Merge GetChanges возвращает null?

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
//Старые данные в dataSet
dataSet.AcceptChanges();
//Измененные данные в dataSetCache
dataSetCache.AcceptChanges();
dataSet.Merge(dataSetCache, false, MissingSchemaAction.AddWithKey);
var d = dataSet.GetChanges();
if (d != null)
{
   // Сюда не попадает!!!
}
...
Рейтинг: 0 / 0
Непонятное поведение DataSet.Merge()
    #37970116
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nikolay206Господа, есть ли у кого-нибудь опыт работы с dataSet.Merge и dataSet.GetChanges()
Почему после Merge GetChanges возвращает null?

GetChanges всегда будет возвращать null после AcceptChanges() , Merge здесь непричём
...
Рейтинг: 0 / 0
Непонятное поведение DataSet.Merge()
    #37970164
Nikolay206
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, но разве Merge не сливает два DataSource?
Логично было бы сделать метод для просмотра данных, которые были добавлены.
Есть ли вообще такая возможность?
...
Рейтинг: 0 / 0
Непонятное поведение DataSet.Merge()
    #37970218
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nikolay206Да, но разве Merge не сливает два DataSource?
Логично было бы сделать метод для просмотра данных, которые были добавлены.
Есть ли вообще такая возможность?

информация для GetChanges берётся из DataRow.RowState, а оное, после AcceptChanges, = Unchanged
...
Рейтинг: 0 / 0
Непонятное поведение DataSet.Merge()
    #37970245
Nikolay206
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
То есть для получения изменений Merge не подходит. Как я понимаю я должен тупо сравнить новый DataSet со старым в цикле и добавить в старый отсутствующие данные а так же измененные. Далее я должен пробежаться по старому DataSet и удалить из него строки, отсутствующие в новом DataSet. А после всего этого сделать GetChanges. Так я получу все изменения DataSet?
...
Рейтинг: 0 / 0
Непонятное поведение DataSet.Merge()
    #37970400
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nikolay206То есть для получения изменений Merge не подходит. Как я понимаю я должен тупо сравнить новый DataSet со старым в цикле и добавить в старый отсутствующие данные а так же измененные. Далее я должен пробежаться по старому DataSet и удалить из него строки, отсутствующие в новом DataSet. А после всего этого сделать GetChanges. Так я получу все изменения DataSet?

не нужно всего этого просто не делай AcceptChanges()
...
Рейтинг: 0 / 0
Непонятное поведение DataSet.Merge()
    #37970883
Nikolay206
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня есть DataSet со старыми данными. Далее я выполняю SqlCommand cmd = new SqlCommand("GetDataStoredProc");
для вызова хранимки получения данных. А дальше я хочу передать только измененные данные по сети. Если передавать DataSet с новыми данными, то он очень большой.
...
Рейтинг: 0 / 0
Непонятное поведение DataSet.Merge()
    #37971261
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nikolay206У меня есть DataSet со старыми данными. Далее я выполняю SqlCommand cmd = new SqlCommand("GetDataStoredProc");
для вызова хранимки получения данных. А дальше я хочу передать только измененные данные по сети. Если передавать DataSet с новыми данными, то он очень большой.

теперь тоже самое по-русски
...
Рейтинг: 0 / 0
Непонятное поведение DataSet.Merge()
    #37972523
Nikolay206
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я заливаю данные в DataSet через хранимки.

Код: c#
1.
SqlCommand cmd = new SqlCommand("GetDataStoredProc"); 


После выполнения этой команды я получаю 12 мб данных.
Через какое-то время данные изменились, например добавилась одна строчка.
Повторный вызов
Код: c#
1.
SqlCommand cmd = new SqlCommand("GetDataStoredProc"); 


вернет новые данные. Задача определить чем отличается старый DataSet от нового. Результат выполнения функции - xml в которой я понимаю что нужно просто добавить одну строчку и все.
Далее вместо того, чтобы передавать 12 мб клиенту, я передаю этот xml. Клиент накатывает эти изменения и получает свежие данные. Реализацию можно сделать по средствам сравнивания одного DataSet с другим и написания xml сценария (добавить такие строки, удалить следующие, изменить третьи). Есть ли какой-то другой механизм выполнения этих сравнений?
...
Рейтинг: 0 / 0
Непонятное поведение DataSet.Merge()
    #37972772
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nikolay206Я заливаю данные в DataSet через хранимки.

Код: c#
1.
SqlCommand cmd = new SqlCommand("GetDataStoredProc"); 



После выполнения этой команды я получаю 12 мб данных.
Через какое-то время данные изменились, например добавилась одна строчка.
Повторный вызов
Код: c#
1.
SqlCommand cmd = new SqlCommand("GetDataStoredProc"); 



вернет новые данные. Задача определить чем отличается старый DataSet от нового. Результат выполнения функции - xml в которой я понимаю что нужно просто добавить одну строчку и все.
Далее вместо того, чтобы передавать 12 мб клиенту, я передаю этот xml. Клиент накатывает эти изменения и получает свежие данные. Реализацию можно сделать по средствам сравнивания одного DataSet с другим и написания xml сценария (добавить такие строки, удалить следующие, изменить третьи). Есть ли какой-то другой механизм выполнения этих сравнений?

здесь вам Merge не подходит, он не для этого создан
...
Рейтинг: 0 / 0
Непонятное поведение DataSet.Merge()
    #37972892
Nikolay206
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это я уже понял. Есть ли какой-нибудь механизм, который позволит быстро определить внесенные изменения или мне нужно все прописывать руками?
...
Рейтинг: 0 / 0
Непонятное поведение DataSet.Merge()
    #37973392
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pation,

а для чего он создан?
...
Рейтинг: 0 / 0
Непонятное поведение DataSet.Merge()
    #37973396
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRospation,

а для чего он создан?

как видно из названия он предназначен для объединения данных,
но никак не для поиска различий между ними
...
Рейтинг: 0 / 0
Непонятное поведение DataSet.Merge()
    #37973419
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pation,

а если после объединения вызвать адаптер для сохранения то что будет?
...
Рейтинг: 0 / 0
Непонятное поведение DataSet.Merge()
    #37974380
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRospation,

а если после объединения вызвать адаптер для сохранения то что будет?

попробуй, посмотрим результат
...
Рейтинг: 0 / 0
Непонятное поведение DataSet.Merge()
    #37975151
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pation,

я уже 10 лет пробую
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Непонятное поведение DataSet.Merge()
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]