Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Синхронизация данных С# - MS SQL Server, синхронизация данных 
V
    Опции темы
yesno
Дата 8.8.2006, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 8.8.2006

Репутация: нет
Всего: нет



Народ помогите! 
Ситуация такая: есть база данных MS SQL Server, есть клиентское приложение, которое эту базу юзает, причем с использванием DataSet, никаких хранимых процедур. В этой базе есть две таблицы - одна содержит primary key, а другая соответственно secondary key. 
Так вот, запускаем клиентсоке приложение, добавляем в primary таблицу новую запись (в DataSet добавилась, а в базу еще нет) и создаем новую запись в secondary таблице по id-шнику только что созданной записи. Запускаем одновременно второго клиента и делаем тоже самое. Закрываем обоих клиентов и... Получается что DataSet в обоих клиентах в primary таблице создал разные записи с одинаковыми id-шниками, но в базу данных эти записи записались уже с другими id-шниками. Но в secondary таблице использовалось значение этих id-шников. Получается, что две записи из secondary таблицы будут пренадлежать одной записи из primary таблицы (той что сохранилась на сервере первой), а изначально предпологалось, что будут две пары.
Вот такая вот [censored 6] фигня получается. Дело явно связано с синхронизацией данных. Если кто че знает или может литературки подкитуть, помогите плз.


PM MAIL   Вверх
kobra
Дата 8.8.2006, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 730
Регистрация: 15.6.2005
Где: Грузия, Тбилиси

Репутация: 1
Всего: 9



David Sceppa Microsoft ADO.NET рекомендую.
кстати, гдето валяется и в електронном виде, гдето 73 метра.

Добавлено @ 21:56 
а если в двух словах, после записи в базу, нужно считать созданное id и вписать в датасет, при етом автоматом произаидет замена в подчиненнои таблице, если канесно связи установлены. 
PM MAIL   Вверх
Exception
Дата 8.8.2006, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 2
Всего: 186



Постой, я не шибко понял, почему у двух разных клиентов ID-шники получаются одинаковые? Ты как их генерируешь?
PM   Вверх
arilou
Дата 8.8.2006, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 4
Всего: 61



Цитата(Exception @  8.8.2006,  22:06 Найти цитируемый пост)
почему у двух разных клиентов ID-шники получаются одинаковые

Потому что это две разные программы.


yesno, тут на форуме звучало мнение, что можно сделать ключи GUID'ами. Тогда коллизий не будет. А вообще тебе транзакции надо использовать. От каждого клиента все обновление должно происходить в рамках своей транзакции (и master, и child таблиц).


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
mr.DUDA
Дата 8.8.2006, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 8
Всего: 232



yesno, во-первых, сохранять в БД нужно сначала parent-таблицу, потом её child-таблицы. Например, если есть таблица Order и Customer, и в таблице Order есть поле CustomerID, то таблица Customer является главной, т.к. от неё зависит таблица Order. Соответственно, сохраняем адаптером (Update) сначала таблицу Customer, потом - Order.

Во-вторых, при добавлении в таблицу датасета записи, её primary key формируется по правилам датасета, а не по правилам БД. Это означает, что в качестве последнего значения autoincrement-а используется внутренне значение датасета, а не реальной базы данных. Само по себе в некоторых ситуациях это может привести к коллизиям с БД, поэтому официально MSDN рекомендует выставлять у таблиц датасета отрицательный autoincrement, начиная с -1.

В-третьих, если записи в таблице создаются на разных клиентских машинах, то закономерно что могут быть созданы дублирующие друг друга записи. Избежать такой ситуации можно, если добавить в БД unique constraint на то поле, которое однозначно идентифицирует запись. Например, если запись таблицы уникальна по полю Name, то клиент, создавший дублирующую запись, получит исключение, и теоретически сможет его обработать (откатить изменения в таблице датасета, подгрузить свежие данные с сервера, соединить запись в подчинённой таблице с записью датасета и сохранить датасет в БД).


--------------------
user posted image
PM MAIL WWW   Вверх
yesno
Дата 9.8.2006, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 8.8.2006

Репутация: нет
Всего: нет



kobra, а как нвстроить DataSet, чтобы кактолько я добавляю новую запись, она сразу записывалась на сервер и возвращался ее id. Может примерчик есть какойнить.
PM MAIL   Вверх
arilou
Дата 9.8.2006, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 4
Всего: 61



yesno, автоматически никак. DataSet - это отсоединенный источник данных. Только вручную вызывать DataAdapter.Update(DataSet)


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
yesno
Дата 9.8.2006, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 8.8.2006

Репутация: нет
Всего: нет



а как это в книге David Sceppa Microsoft ADO.NET описано. может у кого есть сцылочка на эту книгу.
PM MAIL   Вверх
kobra
Дата 9.8.2006, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 730
Регистрация: 15.6.2005
Где: Грузия, Тбилиси

Репутация: 1
Всего: 9



Цитата(arilou @  9.8.2006,  15:18 Найти цитируемый пост)
Только вручную вызывать DataAdapter.Update(DataSet) 
и когда добавляются записи в главнои и подчиненои таблицах, даже этого не достаточно, нужны дополнителние наворотки. 
про автоматическое изменение я говорил внутри датасета, когда ты уже сохранил новые записи главнои таблицы и узнал новые идентификаторы из базы.

почитаи книжку что я рекомендовал. она лущая из тех которые мне поподалис.
PM MAIL   Вверх
yesno
Дата 9.8.2006, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 8.8.2006

Репутация: нет
Всего: нет



Все большое СПАСИБА за советы и рекомендации. Нашлась ссылка которая решает мою проблему:
http://www.gotdotnet.com/Community/UserSam...61-CD83A5D5AD7A
Там решается немного другой баг с id-шниками, но проблема породившая его такаже самая как и в моем случае. Еще не пробовал сделать так как там говориться, но судя по примеру, мне это должно помочь. Всем советую посмотреть, может че нового для себя узнаете.
PM MAIL   Вверх
arilou
Дата 9.8.2006, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 4
Всего: 61



Цитата(kobra @  9.8.2006,  15:40 Найти цитируемый пост)
 когда добавляются записи в главнои и подчиненои таблицах, даже этого не достаточно, нужны дополнителние наворотки. 

Типа чего?


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
mr.DUDA
Дата 9.8.2006, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 8
Всего: 232



Цитата(arilou @ 9.8.2006,  21:38)
Цитата(kobra @  9.8.2006,  15:40 Найти цитируемый пост)
 когда добавляются записи в главнои и подчиненои таблицах, даже этого не достаточно, нужны дополнителние наворотки. 

Типа чего?

Видимо, речь идёт о том, что адаптер обновляет таблицы по отдельности, и связи (relations) между ними после обновления теряются.


--------------------
user posted image
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Базы данных под .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0529 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.