DevCon 11

Вход на сайт:

Windows Live ID
Регистрация аккаунта

Последние новости    RSS-подписка

Microsoft объявляет о выходе CTP3 SQL Server «Denali»
Компания Microsoft делает важный шаг в разработке и выводе на рынок новой версии SQL Server, известной под кодовым названием «Denali», и объявляет о выходе ее третьей CTP-версии (community technology preview). //
20.07.2011

Важные ссылки

Разработка мобильных решений синхронизации данных с использованием Microsoft Synchronization Services for ADO.NET

8,00
Рейтинг доклада: 

Описание доклада

Microsoft Synchronization Services for ADO.NET – это платформа для создания приложений без постоянного соединения, в которых для обеспечения бесперебойного доступа к данным используется синхронизация. В последней версии данной платформы стало возможным создавать приложения для мобильных устройств на основе Windows Mobile. Мы обсудим некоторые аспекты создания решений для устройств при помощи Synchronization Services, посмотрим на процесс создания таких решений в Visual Studio, а также поговорим об архитектуре Synchronization Services.

Ресурсы для дальнейшего изучения

Комментарии пользователей (24)     RSS-подписка

в начало    |  1  | 2 | в конец

Пользователь GavrSS написал 20.03.2009 в 13:42 #1
Огромное спасибо за такой подробный вебкаст.
Не могли бы вы так сказать поставить точку - подскажите как опубликовать MiddleTierServiceLibrary не на локальный компьютер, а на сервер, который смотрит в Интернет и как к этому сервису потом подключиться с КПК (возможно потребуются другие настройки в клиентском приложении по поводу авторизации?)
Пользователь shark777 написал 06.04.2009 в 07:56 #2
Большое спасибо за такой подробный урок.Но у меня почемуто во время синхронизации,приложение валится на вот этом месте:
Microsoft.Synchronization.Data.SyncStatistics syncStats = syncAgent.Synchronize();
выдаёт ошибку:
"TargetInvocationException".
Подскажите где я ошибся,где надо подправить.
Спасибо.
Пользователь GavrSS написал 06.04.2009 в 16:50 #3
to shark777 :
Скорее всего клиент не видет сервиса. Возможно он пытается доступиться не по IP адресу, а по имени хоста?
Пользователь shark777 написал 06.04.2009 в 18:53 #4
Пытается вот так:baseAddress ="http://localhost:8080
потому что я,попробовал изменить localhost на аддресс как в примере,так WSF SERVИЦЕ HOST разругался,что мол вобще такого не понимает,пришлось оставить localhost:8080.
Думаете в этом дело,тогда подскажите как подсунуть ему ip аддресс,как в примере.
Спасибо.
Пользователь GavrSS написал 08.04.2009 в 18:25 #5
Т.е. ругается даже когда http://localhost:8080 ?
1. А сервис-то запущен на http://localhost:8080 ?
2. Емулятор находится в режиме Cradle (если клиент на эмуляторе запускается)
Емулятор или КПК - когда подключены в кредл должны отображать а в AcriveSync надпись "Гость" и чуть ниже "Подключено"
Пользователь shark777 написал 08.04.2009 в 21:30 #6
Да ругается даже на : http://localhost:8080
А как проверить,запущен сервис или нет,может мне надо где то галочку поставить или наоборот убрать. ???
Пользователь GavrSS написал 09.04.2009 в 10:31 #7
Давайте наверное по почте :)
Sergey.Gavrilenko@izotrop.com.ua
Пользователь shark777 написал 09.04.2009 в 19:21 #8
Ok
Пользователь shark777 написал 12.04.2009 в 01:12 #9
GavrSS ну где же вы пропали,я вам уже на почту написал.Надеюсь на вашу помощь.Спасибо.
Пользователь GavrSS написал 13.04.2009 в 11:48 #10
Да, я получил письмо, был занят.. сегодня-завтра отвечу
Пользователь shark777 написал 13.04.2009 в 21:36 #11
Big Thanks.
Пользователь GavrSS написал 08.05.2009 в 13:06 #12
Как у каждой новой технологии - у Synchronization Services есть свои "ошибки молодости пока сообщество на них не обратит внимание".
Вот одна из них:
Создаваемый триггер на удаление выглядит так:
--------------------
UPDATE [dbo].[TableName_Tombstone]
SET [DeletionDate] = GETUTCDATE()
FROM deleted
WHERE deleted.[ColumnID] = [dbo].[TableName_Tombstone].[ColumnID]

IF @@ROWCOUNT = 0
BEGIN
INSERT INTO [dbo].[TableName_Tombstone]
([ColumnID], DeletionDate)
SELECT [ColumnID], GETUTCDATE()
FROM deleted
END
--------------------
Триггер срабатывает хорошо если над главной таблицей производят действия:
1. Удаляется одна запись
2. Удаляются (несколько) только те записи, которые еще не удалялись (которых нет в _Tombstone)
3. Удаляются (несколько) только те записи, которые уже удалялись (которые уже есть в _Tombstone, но и записи с такими же ключами есть в основной таблице)
--------------------------
Однако триггер отработает не правильно с точки зрения своего предназначения в том случае, когда за один раз из таблицы удаляется хотя бы одна запись, которая уже удалялась и хотя бы одна, которая не удалялась. В данном случае условие IF @@ROWCOUNT = 0 не сработает и в _Tombstone не попадет еще ниразу не удалеяемая ранее запись.
Следовательно нужно делать триггер примерно таким:
-------------------------
UPDATE [dbo].[TableName_Tombstone]
SET [DeletionDate] = GETUTCDATE()
FROM deleted
WHERE deleted.[ColumnID] = [dbo].[TableName_Tombstone].[ColumnID]

INSERT INTO [dbo].[TableName_Tombstone]
([ColumnID], DeletionDate)
SELECT D.ColumnID, GETUTCDATE()
FROM deleted D
LEFT JOIN [dbo].[TableName_Tombstone] DATA ON DATA.ColumnID = D.ColumnID
WHERE DATA.ColumnID IS NULL
-------------------------
P.S. хотел подробно расписать, но чувствую что можно запутаться в таких объяснениях :)
Пользователь uzvergs написал 20.07.2009 в 17:50 #13
И у меня "TargetInvocationException" :-( :-( :-(

at Microsoft.Tools.ServiceModel.CFClientBase`1.processReply(Message reply)
at Microsoft.Tools.ServiceModel.CFClientBase`1.getResult[TRESPONSE](Message reply, CFInvokeInfo info)
at Microsoft.Tools.ServiceModel.CFClientBase`1.Invoke[TREQUEST,TRESPONSE](CFInvokeInfo info, GetSchemaRequest request)
at NorthwindServiceClient.GetSchema(GetSchemaRequest request)
at NorthwindServiceClient.GetSchema(String[] tableNames, SyncSession syncSession)
at System.Reflection.RuntimeMethodInfo.InternalInvoke(RuntimeMethodInfo rtmi, Object obj, BindingFlags invokeAttr, Binder binder, Object parameters, CultureInfo culture, Boolean isBinderDefault, Assembly caller, Boolean verifyAccess, StackCrawlMark& stackMark)
at System.Reflection.RuntimeMethodInfo.InternalInvoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean verifyAccess, StackCrawlMark& stackMark)
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters)
at Microsoft.Synchronization.Data.ServerSyncProviderProxy.GetSchema(Collection`1 tableNames, SyncSession syncSession)
at Microsoft.Synchronization.SyncAgent.InitClientSchema()
at Microsoft.Synchronization.SyncAgent.Synchronize()
at YouDev.WCFSyncCE_Mobile.Form1.btnSync_Click(Object sender, EventArgs e)
at System.Windows.Forms.Control.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnClick(EventArgs e)
at System.Windows.Forms.ButtonBase.WnProc(WM wm, Int32 wParam, Int32 lParam)
at System.Windows.Forms.Control._InternalWnProc(WM wm, Int32 wParam, Int32 lParam)
at Microsoft.AGL.Forms.EVL.EnterMainLoop(IntPtr hwnMain)
at System.Windows.Forms.Application.Run(Form fm)
at YouDev.WCFSyncCE_Mobile.Program.Main()

Где копать, очень срочно нужно решить?

PS. Need help!!!!
Пользователь GavrSS написал 20.07.2009 в 19:18 #14
У меня такая ошибка выдавалась если:
1. Не запущен сервис синхронизации
2. Клиент обращается к сервису используя неправильный путь (например в отладке Вы использовали СЕТЕВОЕ ИМЯ sql сервера, а на КПК так делать нельзя - только IP адрес) Вообще советую сразу разрабатывать с указыванием IP адреса.
3. Под отладкой постоянно забывается включение эмулятора в режим Cradle, и дальнейшее нажатие Отменить, Отменить.... в мастере ActiveSync, чтоб эмулятор в конце концов был подключен как Гость
4. Ну и собственно нет связи между КПК и сетью, где запущен сервис синхронизации
Пользователь ukrandruha12 написал 21.10.2009 в 14:04 #15
Спасибо за хороший доклад!!! Есть небольшая проблема, если в взрослой базе установить default value newid() то присоздании локальной этот параметр не создается :( можете помочь?
Пользователь Sasha написал 22.12.2009 в 11:27 #16
Добрый день.
Меня интересует вопрос синхронизации данных с КПК мобильного пользователя. Как это делается? Т.е. существует база на дбф с которой должна быть синхронизация через GPRS. Как это лучше сделать?
На кпк стоит SQL CE3.5 приложение написано на C#.
Пользователь davchik написал 05.02.2010 в 14:20 #17
Добрый день. Почему то, у меня в начале при добавлении баз в Congigure Data Synchronization кнопка "Add+" не активна ? Не подскажите почему ?
Пользователь davchik написал 05.02.2010 в 16:48 #18
Извените, проблема решена, без примари кей, таблица не попадала в Configure tables for user offline.
Пользователь davchik написал 05.02.2010 в 17:55 #19
Выдаёт ошибку
System.ServiceModel.AddressAccessDeniedException: Протоколу HTTP не удалось зарегистрировать URL-адрес http://+:8080/msstestCacheSyncService/. Текущий процесс не имеет прав доступа к этому пространству имен (подробнее см. на веб-странице http://go.microsoft.com/fwlink/?LinkId=70353). --->

System.Net.HttpListenerException: Отказано в доступе
в System.Net.HttpListener.AddAll()
в System.Net.HttpListener.Start()
в System.ServiceModel.Channels.SharedHttpTransportManager.OnOpen()
--- Конец трассировки внутреннего стека исключений ---
в System.ServiceModel.Channels.SharedHttpTransportManager.OnOpen()
в System.ServiceModel.Channels.TransportManager.Open(TransportChannelListener channelListener)
в System.ServiceModel.Channels.TransportManagerContainer.Open(SelectTransportManagersCallback selectTransportManagerCallback)
в System.ServiceModel.Channels.TransportChannelListener.OnOpen(TimeSpan timeout)
в System.ServiceModel.Channels.HttpChannelListener.OnOpen(TimeSpan timeout)
в System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
в System.ServiceModel.Dispatcher.ChannelDispatcher.OnOpen(TimeSpan timeout)
в System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
в System.ServiceModel.ServiceHostBase.OnOpen(TimeSpan timeout)
в System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
в System.ServiceModel.Channels.CommunicationObject.Open()
в Microsoft.Tools.SvcHost.ServiceHostHelper.OpenService(ServiceInfo info)Отказано в доступе
Пользователь GavrSS написал 05.02.2010 в 18:09 #20
Странный какой-то адрес
http://+:8080/msstestCacheSyncService/

в начало    |  1  | 2 | в конец

Добавить комментарий

Подписаться на комментарии

Чтобы оставить комментарий вам нужно авторизоваться или зарегистрироваться.  

Теги доклада

Файлы для загрузки

Авторы: Dmitry Kaluzhny
Просмотров: SilverLight: 637
Windows Media Player: 101
Уровень: 300
Публикация: 10.02.2009


    Нужно ли добавить на TechDays.ru записи живых выступлений?

Разместить в сервисах

Забобрить эту страницу! Добавить в МоёМесто.ru