2013-08-23 3 views
0

У меня есть одна таблица на моем MS SQL db. (2008 R2) имя таблицы: СООБЩЕНИЯ поля: message_id, сообщение, is_syncedСинхронизация таблицы SQL через службу WCF

На моем мобильном смартфоне мне нужно разработать приложение, которое будет синхронизировать свои записи таблицы и таблицу обновления, когда приложение синхронизируется с каждой записью. Мне нужно поддерживать MIN номеров вызовов WCF, поэтому я не должен генерировать вызов для каждой записи.

Если в таблице будет n записей, я не буду вызывать WCF n раз, я хочу позвонить один раз, чтобы получить все записи, синхронизировать и возвращать с использованием WCF все синхронизированные результаты. Это правильный путь? Можете ли вы предложить лучшую реализацию?

+0

*** SQL *** это просто * Structured Query Language * - язык запросов, используемый ** многих систем баз данных **, но не сам продукт базы данных. Нам действительно нужно знать, какая ** конкретная система баз данных ** (и какая версия) вы используете (пожалуйста, обновите теги соответственно) .... –

+0

Непонятно, что вы здесь задаете. «Это правильный путь» - хорошо, неясно, что вы пытаетесь сделать или почему вы это делаете. –

ответ

1

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

http://www.codeproject.com/Articles/491844/A-Beginners-Guide-to-Duplex-WCF

http://msdn.microsoft.com/en-us/library/ms731064.aspx

Однако, чтобы ответить на ваш текущий вопрос учитывая текущее выполнение можно опрашивать сервис для списка всех сообщений при запуске или по таймеру

на вашем сервере вы может иметь что-то вроде этого в простой коллекции:

[ServiceContract(Namespace = "Contracts.IDatabaseResponder")] 
public interface IDatabaseResponder 
{ 
    //You could use an object rather than a string but then you have to mark the object 
    [OperationContract] 
    List<String> GetMessages(); 
    [OperationContract] 
    void SyncMessagesBack(List<String> messages); 

} 



[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Multiple)] 
public class DatabaseResponder : IDatabaseResponder 
{ 
    List<String> _DatabaseMessageList; 

    public List<String> GetMessages() 
    { 
     //Code here to go to SQL and grab all of the needed Messages 
     //.. 


     return _DatabaseMessageList; 
    } 

    public void SyncMessagesBack(List<String> messages) 
    { 
     //Code here to go to SQL and update messages you want to update 
     //.. 


    } 

} 

Затем на стороне клиента что-то, как это будет работать:

//Can use plain old list or ObservableCollection 
    private IList<String> _DatabaseMessagesItems = new ObservableCollection<String>(); 
    private DatabaseResponderClient _Proxy; 
    DispatcherTimer dispatcherTimer; 
    List<String> LocalListOfMessages; 

    public Constructor() 
    { 

      _Proxy = new DatabaseResponderClient(); 
      _Proxy.InnerChannel.Faulted += new EventHandler(InnerChannel_Faulted); 


     try 
     { 
       _DatabaseMessagesItems = _Proxy.GetMessages(); 
     } 
     catch (Exception ex) 
     { 
       MessageBox.Show(ex.Message); 

       throw; 
     } 

     dispatcherTimer = new DispatcherTimer(); 
     dispatcherTimer.Tick += new EventHandler(dispatcherTimerTick); 
     dispatcherTimer.Interval = new TimeSpan(0, 0, 60); 
     dispatcherTimer.Start(); 

     dispatcherTimerTick(); 
    } 


    private void dispatcherTimerTick(object sender, EventArgs e) 
    { 

     try 
     { 
      //Push back to the service any new or changed list of messages you need to push 
      _Proxy.SyncMessagesBack(LocalListOfMessages); 
     } 
     catch (Exception ex) 
     { 
      //Handel error 
     } 
    } 

    //Code to keep track of new messages add them etc 
    //... 
+0

стол на sql2008 db является динамическим, он получает новые записи каждые несколько секунд. на странице aspx сайта asp.net мне нужно напечатать «точно» результаты, которые еще не были синхронизированы. в то время как на мобильном телефоне мне нужно синхронизировать столько результатов и всегда сообщать в таблицу sql2008, записи которой уже синхронизированы. поэтому время - это все в этом случае - я не могу разрешить ситуацию, когда запись, которая уже синхронизирована на мобильном телефоне, будет напечатана как не синхронизированная на веб-сайте. Я никогда не использовал Duplex - это то, что можно использовать дуплекс в моем случае? – Kristina88

+0

Да, дуплекс должен работать. Двойная привязка HTTP - это то, что вам нужно. Взгляните на примеры в Интернете с этим типом реализации службы WCF. –

+0

моя клиентская сторона - приложение для смартфонов будет для Android. http://stackoverflow.com/questions/17607237/android-ios-client-consumes-wcf-duplex-service. я вижу, что нет поддержки для дуплексного wcf там – Kristina88