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 :

Problème pour Comparer 2 Datatables et mise à jour


Sujet :

C#

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2007
    Messages : 244
    Points : 122
    Points
    122
    Par défaut Problème pour Comparer 2 Datatables et mise à jour
    Salut à toutes et à tous,

    Soit une base de données Access sur un poste en réseau.
    Soit une base de données PostgreSQL sur un serveur.

    La base de données Access contient des tables devant entraîner des mises à jours de tables sur PostgreSQL.
    (En fait, l'ancienne base était en access et la nouvelle en PostgreSQL, mais comme on ne peut pas tout développer en même temps et qu'on a des contraintes diverses, on doit pouvoir développer la nouvelle application pendant que l'ancienne tourne encore, et donc certaines parties de la nouvelle nécéssitent des parties de l'ancienne. J'ai donc créé mes nouvelles tables sous PostgreSQL et je dois les mettre à jour pour qu'elles refletent les tables access au fur et à mesure des modifs dans celles-ci.)

    Je voulais donc développer un formulaire avec un bouton unique de mise à jour, mais je coince une fois mes tables importées.

    J'ai extrait les données de la table Access et de la table PostgreSQL via 2 reuqêtes SQL par des DataAdapter.

    Comme mes tables et mes champs en PostgreSQL n'ont pas le même nom, j'ai tout converti dans le SELECT d'importation de la table d'Access.
    (En PostgreSQL je met tout en minuscule et sans espace pour éviter l'utilisation des guillemets pour les noms de tables et de champs dans les requêtes SQL et surtout pour éviter pas mal de pbl dûs à ces guillement dans les requêtes SQL à partir de ASP.NET)

    Je me retrouve maintenant avec un Dataset contenant 2 tables de structures identiques. L'une contenant les données Access, l'autre les données PostgreSQL.

    Comment repérer les différences entre les 2 tables (comparer les données des 2 tables) et mettre à jour la base de données PostgreSQL en fonction des données Access ?

    J'ai un gros problème avec la fonction .update puisque mes INSERT, UPDATE et DELETE ne se créent pas dans un CommandBuilder (quand je regarde mon INSERT, UPDATE ou DELETE dans le DataAdapter, j'ai invariablement "")

    Bref, comme vous voyez, je ne suis pas top en C# et j'ai un sérieux besoin d'aide.

    Je vous mets toutefois le début de code que j'ai et vous rappelle le but de ma recherche : mettre à jour une table sur un serveur PostgreSQL à partir d'une table Access
    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
    51
    52
    53
    54
    55
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using Npgsql;
    using System.Data.OleDb;
     
    namespace MAJBDD
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
     
            private void button1_Click(object sender, EventArgs e)
            {
     
                NpgsqlConnection connexionPostgreSQL = new NpgsqlConnection();
                connexionPostgreSQL.ConnectionString = "Server=IPServeur;Port=PostServeur;User Id=utilisateur;Password=pass;Database=db";
                OleDbConnection connexionAccess = new OleDbConnection();
                connexionAccess.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;" + @"Data source= cheminMdb";
     
                NpgsqlCommand PostGreSQLCommand = new NpgsqlCommand("SELECT * FROM employes", connexionPostgreSQL);
                OleDbCommand AccessSQLCommand = new OleDbCommand("SELECT [Tbl Employes].ID AS id, [Tbl Employes].Nom AS nom, [Tbl Employes].Prenom AS prenom, [Tbl Employes].Adresse AS adresse, [Tbl Employes].Ville AS ville, [Tbl Employes].Province AS province, [Tbl Employes].[Code Postal] AS code_postal, [Tbl Employes].Telephone AS telephone, [Tbl Employes].Courriel AS courriel, [Tbl Employes].Naissance AS naissance, [Tbl Employes].Nas AS nas, [Tbl Employes].Statut AS statut, [Tbl Employes].Division AS division, [Tbl Employes].[Date Embauche] AS date_embauche, [Tbl Employes].Taux AS taux, [Tbl Employes].[Historique Taux] AS historique_taux, [Tbl Employes].Password AS mot_de_passe, [Tbl Employes].Code AS code, IIf([Tbl Employes]![Actif]=Yes,1,0) AS actif, IIf([Tbl Employes]![Supprimer]=Yes,1,0) AS supprimer, Format([Tbl Employes]![Date],'yyyy/mm/dd hh:nn') AS date_derniere_maj, [Tbl Employes].[Taux Facturable] AS taux_facturable, IIf([Tbl Employes]![ChargeProjet]=Yes,1,0) AS charge_projet, IIf([Tbl Employes]![ChefEquipe]=Yes,1,0) AS chef_equipe, IIf([Tbl Employes]![ParHeure]=Yes,1,0) AS par_heure, IIf([Tbl Employes]![Terrain]=Yes,1,0) AS terrain" +
                        " FROM [Tbl Employes]", connexionAccess);
                OleDbDataAdapter DataAdapter_Access_employes = new OleDbDataAdapter(AccessSQLCommand);
                NpgsqlDataAdapter DataAdapter_PostgreSQL_employes = new NpgsqlDataAdapter(PostGreSQLCommand);
                NpgsqlCommandBuilder CommandBuilderPgSQLEmployes = new NpgsqlCommandBuilder(DataAdapter_PostgreSQL_employes);
                DataSet DataSet_Employes = new DataSet();
     
                try
                {
                    DataAdapter_Access_employes.AcceptChangesDuringFill = false;
                    DataAdapter_Access_employes.Fill(DataSet_Employes,"employes");
                    DataAdapter_PostgreSQL_employes.Fill(DataSet_Employes, "PgEmployes");
     
                    DataGridView_AccessEmployes.DataSource = DataSet_Employes.Tables["employes"];
                    dataGridView_PostgreSQL.DataSource = DataSet_Employes.Tables["PgEmployes"];
     
                    DataAdapter_PostgreSQL_employes.Update(DataSet_Employes, "PgEmployes");
                    DataSet_Employes.AcceptChanges();
                 }
     
                catch (Exception ex)
                {
                    MessageBox.Show(this,ex.Message, "Connexion error",MessageBoxButtons.OK,MessageBoxIcon.Error);
                }
            }
        }
    }
    Merci de vos z'avis z'avisés,
    Jean-Marc
    Il n'y a pas de problèmes. Il n'y a que des solutions.
    Malheureusement, elles sont parfois un peu dur à trouver ...


    Aucune touche n'a été maltraitée pour réaliser ce texte.

  2. #2
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Comment repérer les différences entre les 2 tables 
    (comparer les données des 2 tables) 
    et mettre à jour la base de données PostgreSQL en fonction des données Access ?
    Repérer les différences:
    C'est totalement dépendant des données.
    On peut se baser pour comparer 2 enregistrements sur la clé primaire : c'est la solution la plus simple.
    Si non, il faudra définir une fonction permettant de "mesurer" la différence entre 2 enregistrements afin d'identifier, pour chaque enregistrement de la base 1, le plus semblable de la base2 (celui qui est identique ou le moins différent) avec comme condition que la mesure de la différence soit suffisament petite.

    mettre à jour la base de données PostgreSQL
    Un vidage complet de la base PostgreSQL et un ajout de tous les enr Access, tout simplement.
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2007
    Messages : 244
    Points : 122
    Points
    122
    Par défaut
    Merci de tes réponses Graffito.

    Je suis bien d'accod avec tes réponses et j'y avais aussi pensé.
    C'est la mises en oeuvre qui me pose problème.
    Quelle est la succession de commandes à mettre en oeuvre ?
    Mon problème n'est pas dans la gestion de bases de données, auquel je suis plus habitué, mais à l'utilisation de c# qui m'est bien plus étrangère.

    Jean-Marc
    Il n'y a pas de problèmes. Il n'y a que des solutions.
    Malheureusement, elles sont parfois un peu dur à trouver ...


    Aucune touche n'a été maltraitée pour réaliser ce texte.

  4. #4
    Membre habitué Avatar de BigNic
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 195
    Points : 154
    Points
    154
    Par défaut
    A ta place ce que je ferais c'est:
    1) utiliser un wrapper de base de donnée(NHibernate pourquoi pas)
    2) Implémenté IEqualable sur mes classes de mapping (assez simple si ta clé primaire est suffisante pour faire la comparaison. C'est même déjà fait dans NHibernate)
    une fois ceci fais il n'y a plus qu'a mettre en place la structure de ton programme. Decider quand vérifier le changement de données sur les tables, tous les X secondes, etc...

    Puis faire une boucle qui vérifie tables par tables ce qui a changé et met à jour dans ta nouvelle base. Là soit tu fait bête et con avec un methode par table, soit tu peus essayer de faire un truc généric, ça dépend de ton niveau de C#. A ta place et vue ce que tu dis de ton niveau, je ferais bête et con pour la première table, et après j'essayerai de généraliser. Même si tu vas certainement perdre du temps pour la généricité, c'est autant de temps gagné si tu as un nombre de tables important.

  5. #5
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2007
    Messages : 244
    Points : 122
    Points
    122
    Par défaut
    Merci de ta réponse, BigNic.

    J'ai fini par opter pour une autre solution, bien plus simple pour moi :
    J'ai migré les tables d'Access sur PostgreSQL sans rien y changer (pour les relations, les modules, forms, ...). La BDD Access travaille donc avec les tables liées.
    Comme des modifs dans la structure des tables sont indispensables pour les nouveaux développements, j'ai créé de nouvelles tables et j'y ai importé les données des tables Access qui sont désormais dans PostgreSQL.
    J'ai créé des fonctions de conversion et des trigger sur chaque table Access dans PostgreSQL, ce qui fait que chaque modification dans Access entraîne la mise à jour des nouvelles tables.
    Durant la période transitoire les tables seront donc doublées : une table Access et une nouvelle table avec la nouvelle structure mais les données de ces 2 tables sont en permanence identiques. Des tables miroirs au niveau des données, si on veut.
    Une fois l'application finale terminée, les tables de Access disparaîtront, et l'application Access aussi.

    Toutefois je garde tes infos et je vais jeter un coup d'œil à tout ça parce que certains choses m'intéressent.

    Encore merci,
    Jean-Marc
    Il n'y a pas de problèmes. Il n'y a que des solutions.
    Malheureusement, elles sont parfois un peu dur à trouver ...


    Aucune touche n'a été maltraitée pour réaliser ce texte.

Discussions similaires

  1. Problème pour comparer 2 horaires
    Par jerome71300 dans le forum C#
    Réponses: 5
    Dernier message: 10/11/2007, 13h00
  2. Problème pour lire une datatable
    Par kikitx dans le forum Windows Forms
    Réponses: 2
    Dernier message: 22/08/2007, 21h19
  3. Réponses: 3
    Dernier message: 10/05/2007, 08h43
  4. Réponses: 2
    Dernier message: 24/11/2006, 14h20
  5. Réponses: 1
    Dernier message: 25/11/2005, 12h43

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