Mettre à jour les tables liées dans la firebase database MS Access avec C # par programme

J’ai deux bases de données Access 2003 ( fooDb et barDb ). Dans fooDb il existe quatre tables liées à 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 à une autre barDb 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 #.

Si vous codez en C #, Access n’est pas impliqué, mais uniquement par 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. lancer une requête qui supprime de fooDB et n’existe plus dans barDB.

  2. Exécuter une requête qui insère dans les enregistrements fooDB qui se trouvent dans barDB mais 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 3ème est le dur. Je parcours la collection de champs dans DBA et écris du code SQL à la volée qui ressemblerait à 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. Je ne sais pas si cela fonctionnera avec OLEDB, cependant.

En tout état de cause, 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.

Voici ma solution pour relier les tables DAO en utilisant C #.

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

En outre, cette structure de firebase database est le résultat du fait que mon application était à l’origine une application MS Access que j’ai transféré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 firebase database de bureau très facile à utiliser.

Dans la firebase database 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 d’access central à la firebase database DB Default.DRC_LinkedTables – Dossier en cours de 8 bases de données

Voici le code fait la reliure réelle des tables DAO en C #

  public static void RelinkDAOTables(ssortingng MDBfile, ssortingng filepath, ssortingng 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"].ToSsortingng()]; table.Connect = ssortingng.Format(";DATABASE={0}{1} ;TABLE={2}", filepath, row["database"], row["LinkedName"]); table.RefreshLink(); } } 

Code supplémentaire écrit pour extraire des données d’une firebase database d’access et les renvoyer sous forme de DataTable

  public static DataTable TableFromOleDB(ssortingng Connectssortingng, ssortingng Sql) { try { OleDbConnection conn = new OleDbConnection(Connectssortingng); 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(ssortingng MDBfile, ssortingng Sql) { return TableFromOleDB(ssortingng.Format(sConnectionSsortingng, MDBfile), Sql); }