Mettre à jour par programmation les tables liées dans la base de données MS Access avec C #

StackOverflow https://stackoverflow.com/questions/625360

Question

J'ai deux bases de données Access 2003 ( fooDb et barDb ). fooDb contient quatre tables liées aux tables de barDb .

Deux questions:

  • Comment mettre à jour le contenu de la table (les tables liées dans fooDb doivent être synchronisées avec le contenu de la table dans barDb )
  • Comment relier la table à un autre barDb à l'aide de ADO.NET

J'ai cherché sur Google mais je n'ai obtenu aucun résultat utile. Ce que j’ai découvert, c’est comment y parvenir en VB (6) et DAO, mais j’ai besoin d’une solution pour C #.

Était-ce utile?

La solution

Si vous codez en C #, Access n'est pas impliqué, uniquement Jet. Vous pouvez donc utiliser la méthode de votre choix pour accéder aux données, puis coder les mises à jour.

J'ai souvent codé ce genre de chose dans Access, et mon approche pour chaque table est la suivante:

  1. lance une requête qui supprime de fooDB qui n'existe plus dans barDB.

  2. lancez une requête qui insère des enregistrements fooDB dans barDB qui n'existent pas encore dans fooDB.

  3. J'utilise toujours du code qui écrit SQL à la volée pour mettre à jour la table fooDB avec les données de barDB.

Le troisième est le plus difficile. Je parcoure la collection de champs dans DBA et écris du code SQL à la volée qui pourrait ressembler à ceci:

UPDATE table2 INNER JOIN table1 ON table2.ID = table1.ID
SET table2.field1=table1.field1
WHERE (table2.field1 & "") <> (table1.field1 & "")

Pour les champs numériques, vous devez utiliser la fonction de votre dialecte SQL disponible pour convertir Null en zéro. En exécutant Jet SQL, j'utiliserais bien sûr Nz (), mais cela ne fonctionne pas via ODBC. Vous ne savez pas si cela fonctionnera avec OLEDB, cependant.

Dans tous les cas, le but est d’émettre un ensemble de mises à jour SQL colonne par colonne au lieu d’essayer de le faire ligne par ligne, ce qui sera beaucoup moins efficace.

Autres conseils

Voici ma solution pour relier les tables DAO à l'aide de C #.

Mon application utilise une base de données centrale MS Access et 8 bases de données liées. La base de données centrale est stockée localement dans mon application C #, mais l'application permet de placer les 8 bases de données ailleurs. Au démarrage, mon application C # relie les tables DAO de la base de données centrale en fonction des paramètres app.config.

Remarque: cette structure de base de données résulte du fait que mon application était à l'origine une application MS Access que j'ai portée sur VB6. Je suis en train de convertir mon application en C #. J'aurais pu quitter MS Access en VB6 ou C #, mais c'est une solution de bureau DB très facile à utiliser.

Dans la base de données centrale, j'ai créé une table appelée tables liées avec trois colonnes TableName, LinkedTableName et DatabaseName.

Au démarrage de l'application, j'appelle cette routine

            Common.RelinkDAOTables(Properties.Settings.Default.DRC_Data
                              , Properties.Settings.Default.DRC_LinkedTables
                              , "SELECT * FROM LinkedTables");

Default.DRC_Data - Dossier en cours de la base de données à accès central Default.DRC_LinkedTables - Dossier en cours de 8 bases de données

C’est le code qui permet de relier les tables DAO en C #.

        public static void RelinkDAOTables(string MDBfile, string filepath, string sql)
    {
        DataTable linkedTables = TableFromMDB(MDBfile, sql);

        dao.DBEngine DBE = new dao.DBEngine();
        dao.Database DB = DBE.OpenDatabase(MDBfile, false, false, "");
        foreach (DataRow row in linkedTables.Rows)
        {
            dao.TableDef table = DB.TableDefs[row["Name"].ToString()];
            table.Connect = string.Format(";DATABASE={0}{1} ;TABLE={2}", filepath, row["database"], row["LinkedName"]);
            table.RefreshLink();
        }


    }

Code supplémentaire écrit pour extraire des données d'une base de données Access et les renvoyer sous forme de DataTable

        public static DataTable TableFromOleDB(string Connectstring, string Sql)
    {
        try
        {
            OleDbConnection conn = new OleDbConnection(Connectstring);
            conn.Open();
            OleDbCommand cmd = new OleDbCommand(Sql, conn);
            OleDbDataAdapter adapter = new OleDbDataAdapter(cmd);
            DataTable table = new DataTable();
            adapter.Fill(table);

            return table;
        }
        catch (OleDbException)
        {
            return null;
        }
    }
    public static DataTable TableFromMDB(string MDBfile, string Sql)
    {
        return TableFromOleDB(string.Format(sConnectionString, MDBfile), Sql);
    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top