IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Synchronisation BDD Client/Serveur


Sujet :

C#

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 97
    Points : 85
    Points
    85
    Par défaut Synchronisation BDD Client/Serveur
    Bonjour, je souhaite réaliser une synchronisation de 5 tables entre un base de données Client et un serveur (distant) en utilisant SQL Server 2008 R2 .

    voici un extrait de mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
     
    //partie serveur distant
    serverConn= new SqlConnection(@"Data Source=.\SQLEXPRESS;Initial Catalog=MaBDDServeur;Integrated Security=True");
     
     string scope = "sync_tables";
     DbSyncScopeDescription scopeDesc = new DbSyncScopeDescription(scope);
     
     DbSyncTableDescription Table1 = SqlSyncDescriptionBuilder.GetDescriptionForTable("MaTable1", serverConn);
     
    //pareil avec table2 ... jusqu'a 5.
     
     scopeDesc.Tables.Add(Table1);
     
    //pareil avec table2 ... jusqu'a 5.
     
     SqlSyncScopeProvisioning serverConfig = new SqlSyncScopeProvisioning(scopeDesc);
     
    //les tables existes, pas besoin de les créer.
    serverConfig.SetCreateTableDefault(DbSyncCreationOption.skip);
     
    serverConfig.Apply(serverConn);
     
     
     
    //partie client
     
     SqlConnection clientConn = new SqlConnection(@"Data Source=.\SQLEXPRESS;Initial Catalog=MaBDDClient;Integrated Security=True");
     
     scope = "sync_tables"; 
     
     DbSyncScopeDescription clientSqlDesc = SqlSyncDescriptionBuilder.GetDescriptionForScope(scope,serverConn);
     
      SqlSyncScopeProvisioning clientSqlConfig = new SqlSyncScopeProvisioning(clientSqlDesc); 
     
      clientSqlConfig.Apply(clientConn);
     
      SyncOrchestrator sync = new SyncOrchestrator(); 
     
     sync.Direction = SyncDirectionOrder.UploadAndDownload;
     
     sync.LocalProvider = new SqlSyncProvider(scope, clientConn); 
     
     sync.RemoteProvider = new SqlSyncProvider(scope, serverConn); 
     
     sync.Synchronize();
     
     
      SqlSyncScopeDeprovisioning deprovisionScope = new SqlSyncScopeDeprovisioning(serverConn);
    deprovisionScope.DeprovisionScope("sync_tables");
    Mon 1er problème est que je ne comprend pas comment fonctionne la ligne suivante:
    sync.Direction = SyncDirectionOrder.UploadAndDownload;
    Pour l'instant ce qu'il se passe c'est que toute les tables sélectionnées sont copiées dans la base de données client mais comment faire pour mettre a jour ces champs ensuite ? si je refait une synchronisation cela suffit t'il pour les mettres a jour ?


    merci de vos conseils d'avance.

    KevDeta

    p.s: c'est la première fois que je touche à la synchronisation de BDD.

  2. #2
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Bonjour

    Peux tu préciser ? s'agit il se synchro entre serveurs SQL SERVER 2008 ?

    Dans ce cas, le framework de synchro (et le développement associé) est totalement inutile et tu ferais mieux de t'appuyer sur les mécanismes de réplications natifs.

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 97
    Points : 85
    Points
    85
    Par défaut
    Les deux pc (client et serveur) utilisent Sql server 2008 Express R2!

    Je souligne le Express car avec la réplication ou il faut un serveur de distribution, il faut une license payante (7000$) et je ne veux pas utiliser la natif.

    Pourquoi cela vous semble inutile, j'ai pas bien piger la ?

    Je vais essayer d'être clair.

    J'ai un pc client (ou plusieurs) qui ont la même appli et SQL Server R2.
    Un pc serveur qui n'a que SQL Server R2.

    Les base de données sont les mêmes partout ( même tables ).

    Je voudrait lorsque je le veux, synchroniser certaines tables avec ma base de donnée centrale (serveur).
    Exemple si un champ a changer sur le pc client 1 alors lors de la synchro cela affecte ou met a jour sur la BDD serveur.

    merci

  4. #4
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par kevindeta Voir le message
    Les deux pc (client et serveur) utilisent Sql server 2008 Express R2!
    Effectivement, si c'est du Express des deux coté, tu ne dispose pas de la réplication.

    Je souligne le Express car avec la réplication ou il faut un serveur de distribution, il faut une license payante (7000$)
    Du moins sur le distributeur, sachant que SQL EXpress peut participer dans une architecture de réplication, mais en effet ne peut pas être le distributeur.

    Pourquoi cela vous semble inutile, j'ai pas bien piger la ?
    Et bien écrire quelque chose plutôt que d'utiiser du tout fait et éprouvé est rarement une solution optimale.
    Masi encore une fois si tu utilises du full Express, tu n'as pas trop le choix.

    Je vais essayer d'être clair.
    Mais c'était clair, sauf que j'imaginais un serveur avec une version "full" de Sql Server et des clients avec Sql Express (achi assez courante pour des flottes de PC portables non connectés en permanence).

    Donc disons que je n'ai rien dit.

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  5. #5
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 97
    Points : 85
    Points
    85
    Par défaut
    Bon j'ai reussi a comprendre un peu mieux comment cela fonctionner a peu près.

    Mais la en réfléchissant un quart de sconde je me suis posé une question, et les conflits comment on peu les gérer ?

    Je m'explique :

    Pour faire simple imaginer 2 clients quisont connectés sur un seul serveur.
    (tout en SQL R2 comme mes messages avant...)

    Par ordre chronologique :
    -Le Client 1 ajoute un champ dans une table "USER" (il entre un nom par exemple "mario").

    - On synchronise avec le serveur, le champ ("mario") se retrouve dans la table "USER" de la base de données serveur. (Download)

    - On synchronise avec le client 2, le champ ("mario") se retrouve dans la table "USER" de la base de données client 2. (upload)

    - SI LE CLIENT2 modifie ce champ ! et que le client 1 s'en sert come login par exemple !!! va y'avoir du conflit dans l'air lors d'un upload vers le client 1 !

    Cela est-il possible ou je rêve ? mon bouguiboulgua vous semble correcte ou y'a t'il une autre solution (alternative à SyncDirectionOrder.UploadAndDownload) ??


    merci bien

  6. #6
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 97
    Points : 85
    Points
    85
    Par défaut
    Bon je resoud tout seul, pas grave tant que c'est fait.

    Aparement Sync gére les conflits, on peu rajouter sa dans le app.config:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <system.diagnostics>
        <switches>
          <!--  0-off, 1-error, 2-warn, 3-info, 4-verbose. -->
          <add name="SyncTracer" value="3" />
        </switches>
     
        <trace autoflush="true">
          <listeners>
            <add name="TestListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="C:\TraceSync.txt"/>
          </listeners>
        </trace>
      </system.diagnostics>
    Avec ceci on peut tracer les évènements lors de la synchronisation, on peut y voir plus clair dans ce charabiat qu'est les scopes ! grace a sa j'ai vue qu'un champ de ma base ne corresponder pas et sa générer un conflit pour copier ce champs.

    On peu aussi utiliser ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    SyncOperationStatistics stats = sync.Synchronize();
     
                   string msg;
                   msg = "Synchronization succeeded! \n\n" +
            stats.DownloadChangesApplied + " download changes applied \n" +
            stats.DownloadChangesFailed + " download changes failed \n" +
            stats.UploadChangesApplied + " upload changes applied \n" +
            stats.UploadChangesFailed + " upload changes failed ";
     
                   ShowMsg(msg);  //messageBox
                   Utils.WriteSyncLog(msg);  //fonction de creation de Log
    On récupère les diverses valeurs des téléchargements et des uploads pour afficher combien on échouer ou on réussi.

    Ensuite je m'en sert pour créer un fichier Log pour pouvoir tracer toute les synchronisations.

    Voila j'espère que sa pourra servir a quelqu'un , sait-on jamais .

  7. #7
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 76
    Points : 81
    Points
    81
    Par défaut
    Juste une question sur ton code, c'est normal que tu as
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    initializeData="C:\TraceSync.txt"/>
    Au lieu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    initializeData=@"C:\TraceSync.txt"/>

  8. #8
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 97
    Points : 85
    Points
    85
    Par défaut
    Eh bien moi ceci fonctionne parfaitement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    initializeData="C:\TraceSync.txt"/>

  9. #9
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par bacarndiaye Voir le message
    Juste une question sur ton code, c'est normal que tu as
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    initializeData="C:\TraceSync.txt"/>
    Au lieu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    initializeData=@"C:\TraceSync.txt"/>

    Et pourquoi ? On ne voit pas très bien ce que cette syntaxe "chaine litérale", spécifique au C#, ferait dans un fichier XML de configuration.

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  10. #10
    Membre éprouvé Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 822
    Points : 1 108
    Points
    1 108
    Par défaut
    Et oui !
    Pas de chaine Verbatim C# dans un fichier xml...
    En informatique, le problème se situe toujours entre le clavier et l'écran !
    Il y a deux chemins entre le clavier et l'écran : Par l'UC et par l'utilisateur.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. oracle jdeveloper application bdd client serveur
    Par alisonet dans le forum JDeveloper
    Réponses: 1
    Dernier message: 16/01/2008, 16h31
  2. Requetes côté client sur bdd côté serveur
    Par Alextk dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 24/05/2006, 15h57
  3. [client/serveur] Quel est format de requêtes Client/BDD ?
    Par sotuxan dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 05/03/2006, 12h52
  4. synchronisation client serveur
    Par mencaglia dans le forum Entrée/Sortie
    Réponses: 10
    Dernier message: 10/10/2005, 12h10
  5. client/serveur : synchronisation, tempo et ping de présence
    Par balibalo dans le forum Développement
    Réponses: 3
    Dernier message: 21/06/2004, 11h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo