powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как сравнить два DataSet'a ?
16 сообщений из 41, страница 2 из 2
Как сравнить два DataSet'a ?
    #32448743
M234
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Цель: Слить данные из БД2 в БД1.
да, так и потом наоборот из БД1 в БД2, но это уже будет дело техники если получится хотя бы первое сделать.

Вопросы:
1) правильно я понял твою задачу?

да

2) какое количество таблиц в ds1 и ds2?

Их три

3) могут ли записи в ds1 и ds2 совпадать?

Изначально базы на сервере и клиентах идентичны, затем они начинают меняться, т.е. на клиентах появляются новые записи, если клиент К1 создал что-то новое, то это должно быть занесено в серверную БД и быть доступно для других клиентов, например клиент К2 ничего нового не создал и решил сравнить БД, на предмет, а не появилось ли чего но вого на сервере, после сравнения он должен увидеть запись от К1.

4) что надо делать если записи из ds1 и ds2 совпадают по идентификатору но не по содержанию. Оставить в ds1 как есть, переписать их из ds2. Либо спросить юзера что делать?

Сложный вопрос, я думаю, что если запись стала другой у её создателя, то изменения перенять и на сервер, если у другого клиента, то нет.

Я сделал всё что мог, кто может пусть сделает лучше.
...
Рейтинг: 0 / 0
Как сравнить два DataSet'a ?
    #32448876
Фотография Ray D
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Простите, что встреваю, но не проще ли использовать в качестве СУБД на клиенте MSDE и настроить рпеликацию?
...
Рейтинг: 0 / 0
Как сравнить два DataSet'a ?
    #32448914
M234
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Простите, что встреваю, но не проще ли использовать в качестве СУБД на клиенте MSDE и настроить рпеликацию?

А я не знаю !!! Может и проще, подсажите, объясните как.
И кто такой MSDE ?

Я сделал всё что мог, кто может пусть сделает лучше.
...
Рейтинг: 0 / 0
Как сравнить два DataSet'a ?
    #32448927
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Самое простое что сейчас можно сделать без головняков, это написать свой Update и Merge.

Вручную в цикле прокрутить записи ds2 и вставить отсутствующие в ds1. Так как у них DataRowState будет Added. Вернуть их методом changedDataSet = GetChanges(DataRowState.Added) и кинуть в свой Update. В котором
в цикле пробегать по записям changedDataSet и данные передавать хранимой процедуре в БД1. А в этой ХП заложить всю логику: например в начале пытаться вставить, а если запись уже есть то обновить (как обновлять тоже можно решить здесь) или любую другую логику все уже дело техники.

ИМХО только на клиенте нельзя решать вопросы синхронизации(читай репликации) представь что в обоих БД порядка милионна записей и что их все тащить на клиента в начале из одной БД, а потом из другой. Сравнивать и расскидывать изменения по базам - очевидно подход неверный, даже если клиент толстый.
...
Рейтинг: 0 / 0
Как сравнить два DataSet'a ?
    #32449002
M234
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вручную в цикле прокрутить записи ds2 и вставить отсутствующие в ds1.

Ну, так просто тоже не получится. А как быть если клиент изменил какю-нить запись? т.е. ИД у неё остался а содержимое полей изменилось?
Я как раз и пытался избежать варианта, когда я должен каждое поле каждой записи (которая уже есть в БД) одной таблицы сравнивать с каждым полем записи (с тем же ИД) в другой.Ну или хотя бы автоматизироать этот процесс как-то, т.е. не самому код это писать, т.к. работать это будет наверняка медленнее какой-нить встроенной возможности специально для этой задачи сделаной.

Нахрена тогда все эти базы и языки пр-ия и SQL?! Что бы потом всё вручную?
Проблема в том, что я не знаю КАК! Но я уверен, что такое решение задачи "в лоб" - самое худшее из возможных и далеко не единственное, задача-то в общем-то тривиальна и любой кто с БД работает сталкивается сней рано или поздно. Я в инете нарыл десятки вопросов в разных форумах на разных языках и НИ ОДНОГО ответа. т.е. люди сталкиаются часто с этой задачей, неужели никто не решил?! Не верю!


Я сделал всё что мог, кто может пусть сделает лучше.
...
Рейтинг: 0 / 0
Как сравнить два DataSet'a ?
    #32449062
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По поводу Merge он просто заменяет такие проверки.
Может он и делает это супероптиизационным способом но и на милионнах записей Merge умрет, а представь какой DataSet будет в этом случае ведь по сути создание DataSet влечет за собой создание массы объектов DataTable, DataColumn, DataRow и т.д.

А на небольших массивах разницы между в лоб и merge не будет - а будет уверенность что все делается правильно и в соответствие с выбранной логикой синхронизации.

>А как быть если клиент изменил какю-нить запись? т.е. ИД у неё остался а содержимое полей изменилось?
В логике хранимой процедуры. А вообще в подобных (но не в этом случае) лучше делать все изменения и проверки на стороне сервера, очищать датасет и загружать его уже изменнеными (актуальными) данными. Чем кромсать в клиенте передавать серверу, а потом принимать от сервера.

А в вашем случае надо делать репликацию между БД1 и БД2.
Вопрос надо задавать в форуме MS SQL если вы используете MS SQL.
...
Рейтинг: 0 / 0
Как сравнить два DataSet'a ?
    #32449507
M234
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Обращения в другие форумы не принесло мне пока облегчения, ждёмс... :)
2. Дело всё-таки сдвинулось с мёртвой точки, причем добавлением всего двух строчек кода. (так всегда пыхтиш всю неделю, думаешь, ищешь, а когда находишь, то это обычно не что-то такое, а всего пара строчек :) )

oleDbDataAdapter1.AcceptChangesDuringFill=false;
oleDbDataAdapter1.Fill(dataSet11);


oleDbDataAdapter2.AcceptChangesDuringFill=false;
oleDbDataAdapter2.Fill(dataSet21);

Теперь всё в БД записывается и записывается то, что надо, НО не так как надо, т.е. есть запись у которой есть ид поле, которое является автоинкрементным и первичным ключём, так вот если в обеих таблицах есть записи с одинаковым ид полем, но в клиентской таблице эта запись изменилась, то после команды упдате в таблце на сервере пишется ещё одна строка с другим ид и темже содержанием, что и на клиенте, а мне нужно в этом случае только проапдейтить эту запись.


Я сделал всё что мог, кто может пусть сделает лучше.
...
Рейтинг: 0 / 0
Как сравнить два DataSet'a ?
    #32449781
M234
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Предыдущий вопрос про ид-поле отпал. Теперь другая проблема с мерге:
Если я делаю dataSet11.Merge(dataSet21,true); ,то в случае наличия в dataSet21 новых или модифицированных записей они отображаются в результирующем dataSet11 и это меня устраивает, но вот если в dataSet21 была удалена какая-то запись, то в результирующем dataSet11 она остаётся и это мне совершенно не нужно.

Как быть?

Я сделал всё что мог, кто может пусть сделает лучше.
...
Рейтинг: 0 / 0
Как сравнить два DataSet'a ?
    #32449824
M234
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ещё вопрос:
Как в DataSet'е удалить строки с состоянием Deleted ?



Я сделал всё что мог, кто может пусть сделает лучше.
...
Рейтинг: 0 / 0
Как сравнить два DataSet'a ?
    #32449997
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То что у тебя Access сняло бы многие предложения от нас по поводу ХП, репликации и т.д. Это как раз тот случай когда чем больше скажешь тем раньше решишь проблему.

Вообще задачу синхронизации в твоем случае можно решить использую DataReader (как наиболее производительный класс), не загружая все данные в отсоединенный кэш (в данном случае DataSet). Ну да ладно с DataReaderом придется все делать ручками. Тут еще полно различных камней но все они связаны с тем что все таки для подобной задачи надо поднимать СУБД.

Если же все таки исползовать DataSet тем более у тебя продвижения в этом плане. Предлагаю все таки задуматься что когда нибудь ты не сможешь загрузить в него всё, и как вариант в таком случае это работать с данными порционно. (можно просто за последний период какой либо - я не знаю это зависит от задачи)

Теперь к вопросу как избавиться от Deleted
Для этого можешь для merge из второго Dataset брать все записи кроме удаленных например так
Код: plaintext
1.
2.
DataSet allRowsWithoutDeleted = ((DataSet) this.dataSet21.GetChanges(System.Data.DataRowState.Added|System.Data.DataRowState.Modified|System.Data.DataRowState.Unchanged));
dataSet11.Merge(allRowsWithoutDeleted,true);
...
Рейтинг: 0 / 0
Как сравнить два DataSet'a ?
    #32450142
Фотография Ray D
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я так чувствую, вам поразвлекаться хочется...
Вам Access как воздух нужен? Даже если и так, MS SQL поддерживает репликацию с гетерогенных источников. Настройте репликацию и не мучайтесь. Поиск по форуму MS SQL поможет.
...
Рейтинг: 0 / 0
Как сравнить два DataSet'a ?
    #32450150
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> MS SQL поддерживает репликацию с гетерогенных источников. Настройте репликацию и не мучайтесь. Поиск по форуму MS SQL поможет.

Зачем же так с MS SQL извращаться. Если уж начать поднимать MS SQL то сражу делать все по уму. Все пользователи будут работать с одной БД размещенной на MS SQL. Если accessовский интерфейс нужен, то существующий переделать в adp проект.
...
Рейтинг: 0 / 0
Как сравнить два DataSet'a ?
    #32452612
M234
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не исключаю возможности пересесьть на MS SQL, хотелось бы только сперва знать, какие плюсы это мне принесёт и что значит "сразу делать все по уму"?
Так же был бы признателен за объяснение организации репликации, т.е. как это примерно делается и какими средствами. Нужно только заметить, что оставить клиентов совсем без собственной БД я не могу, задача не позволяет, поэтому ещё раз - в принципе на всех клиентах и на сервере должна быть в конечном итоге одна и таже информация в БД, клиенты дополняют серверную БД своими новыми записями и получают с сервера инф-ю которую уже внесли другие клиенты.

Я сделал всё что мог, кто может пусть сделает лучше.
...
Рейтинг: 0 / 0
Как сравнить два DataSet'a ?
    #32453335
M234
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотелось бы вот ещё что отметить, у меня есть Windows-программа с которой работают клиенты, эта программа опирается на БД и нужно, что бы человек все необходимые ему вещи мог сделать из этой программы, поэтому все рекомендации сделать (настроить) репликацию средствами самой БД не очень подходят. Я это себе в самом начале предстовлял так:

Клиент давит кнопку "обновить БД", появляется запрос на установление соединения (модемного) с интернет, после его установления программа связывается с ВебСервисом на сервере и передаёт ему слепок (Датасет, как я это хотел делать) клиентской БД, на сервере происходит сравнение и запись новых записей на серверную БД, затем снова сравнение и пересылка клиенту отсутствующих у него новых данных (которые слили на сервер другие клиенты)

Вот примерно так я хотел это делать, но теперь после почти недельного общения на эту тему на этом форуме - Я В ПОЛНОМ ТУПИКЕ:(

Можно это вообще на С# + Access(на клиентах) + WebService + MSSQL(на сервере) реализовать? Я думаю да, вопрос в том с какой стороны зайти :).
В общем буду благодарен за любую помощь. Sa отдельное большое спасибо за потраченное на меня время.


Я сделал всё что мог, кто может пусть сделает лучше.
...
Рейтинг: 0 / 0
Как сравнить два DataSet'a ?
    #32453881
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Очень трудно со своей колокольни сказать что же тебе надо сделать и надо ли что то делать вообще. Тут задача глубоко системного анализа - реинжиниринга бизнес-процессов, работа над полученной функциональной модели - как результат создания проекта будущей информационной системы с большой буквы.

Что касается "все по уму" то ИМХО Идеальный вариант : одна предметная область - одна база данных. База данных должна обеспечивать ЦЕЛОСТНОСТЬ и ДОСТОВЕРНОСТЬ информации. Поэтому возлагать на клиента (даже если это и в его интересах) задачи синхронизации данных считаю не правильным.
Такие локальные средства как MS Access, FoxPro не считаю системами управления базами данных (хотя последним занимался очень долго и плотно, начиная с VFP 2.6 под DOS). Но в тоже время существует множество успешных проектов выполненных этими или подобными средствами. И такие средства все еще актуальны и ИМХО будут востребованы всегда. Поэтому рубить шашкой (предлагать Oracle Application, SAP R/3 :-) ) особо не хочется да и не имею права.

Что касается вашей задачи.
Ведь главное это достижение цели (хотя и в будущее тоже неплохо заглянуть). Если у вас все получилось и результат устраивает заказчика(или надо внушить заказчику что это то что ему надо :-) ) - значит все отлично. Единственное применительно использования двух DataSet я бы подумал о порционной обработке данных. То есть загрузки данных для синхронизации по частям или например только за последний период (считая или добиваясь чтобы предыдущие периоды были закрыты и синхронизированны)
...
Рейтинг: 0 / 0
Как сравнить два DataSet'a ?
    #32455122
M234
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Единственное применительно использования двух DataSet я бы подумал о порционной обработке данных. .............например только за последний период (считая или добиваясь чтобы предыдущие периоды были закрыты и синхронизированны)

Очччень толковый совет. Так и буду делать, в конечном итоге поможет сократить траффик и ускорить обработку. Спасибо.

На этой оптимистической ноте думаю закрыть эту объёмную тему, в случае появления конкретных вопросов буду постить в новых или соответствующих топиках.

М234


Я сделал всё что мог, кто может пусть сделает лучше.
...
Рейтинг: 0 / 0
16 сообщений из 41, страница 2 из 2
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как сравнить два DataSet'a ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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