Гость
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Непонятное поведение DataSet.Merge() / 25 сообщений из 26, страница 1 из 2
20.09.2012, 09:54
    #37965098
Nikolay206
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятное поведение DataSet.Merge()
Всем добрый день.
У меня клиент-серверное приложение. Передаю 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
20.09.2012, 10:20
    #37965151
pation
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятное поведение DataSet.Merge()
Nikolay206Для экономии места я использую на сервере хранилище DataSet dataSetCache и выполняю Merge с новыми данными.

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

использовать бизнес-классы
...
Рейтинг: 0 / 0
20.09.2012, 10:59
    #37965217
Nikolay206
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятное поведение DataSet.Merge()
Не понимаю что поменяется.
На сколько сильно будет отличаться сериализованный файл бизнес объекта от сериализованного датасета?
Ведь вместо <Table> в сериализации будет имя класса, а вместо <имя колонки> будет имя проперти.
...
Рейтинг: 0 / 0
20.09.2012, 13:13
    #37965545
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятное поведение DataSet.Merge()
MissingSchemaAction.AddWithKey зачем? У тебя походу колонка(и) добавляется. В результате все записи таблицы считаются изменёнными.
...
Рейтинг: 0 / 0
20.09.2012, 13:39
    #37965623
Nikolay206
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятное поведение DataSet.Merge()
Нет, не добавляется. Все колонки одинаковые.
Я же говорю беру сохраненный датасет, далаю WriteXml в файл. Потом мержу на него изменения и снова делаю WriteXml
В результате сравниваю два файла. Они отличаются только одной строчкой.
Сейчас вообще getChanges возвращает null.
...
Рейтинг: 0 / 0
20.09.2012, 13:41
    #37965627
Nikolay206
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятное поведение DataSet.Merge()
Вот код
Код: 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
20.09.2012, 14:36
    #37965770
Nikolay206
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятное поведение DataSet.Merge()
Ни как не могу понять почему dataSet.GetChanges() возвращает null
Хотя данные реально изменены.
...
Рейтинг: 0 / 0
24.09.2012, 10:56
    #37969513
Nikolay206
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятное поведение DataSet.Merge()
Господа, есть ли у кого-нибудь опыт работы с 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
24.09.2012, 15:52
    #37970116
pation
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятное поведение DataSet.Merge()
Nikolay206Господа, есть ли у кого-нибудь опыт работы с dataSet.Merge и dataSet.GetChanges()
Почему после Merge GetChanges возвращает null?

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

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

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

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

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


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


вернет новые данные. Задача определить чем отличается старый DataSet от нового. Результат выполнения функции - xml в которой я понимаю что нужно просто добавить одну строчку и все.
Далее вместо того, чтобы передавать 12 мб клиенту, я передаю этот xml. Клиент накатывает эти изменения и получает свежие данные. Реализацию можно сделать по средствам сравнивания одного DataSet с другим и написания xml сценария (добавить такие строки, удалить следующие, изменить третьи). Есть ли какой-то другой механизм выполнения этих сравнений?
...
Рейтинг: 0 / 0
26.09.2012, 12:52
    #37972772
pation
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятное поведение DataSet.Merge()
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
26.09.2012, 14:09
    #37972892
Nikolay206
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятное поведение DataSet.Merge()
Это я уже понял. Есть ли какой-нибудь механизм, который позволит быстро определить внесенные изменения или мне нужно все прописывать руками?
...
Рейтинг: 0 / 0
26.09.2012, 19:08
    #37973392
ViPRos
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятное поведение DataSet.Merge()
pation,

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

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

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

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

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

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

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


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