2009-03-09 12 views
4

J'ai deux bases de données Access 2003 (fooDb et barDb). Il y a quatre tables dans fooDb qui sont liées aux tables dans barDb.Mise à jour des tables liées dans MS Access Database avec C# par programme

Deux questions:

  • Comment puis-je mettre à jour le contenu de la table (tables liées à fooDb doivent être synchronisées avec le contenu de la table dans barDb)
  • Comment puis-je rétablir le lien entre la table à un autre barDb en utilisant ADO.NET

J'ai googlé mais je n'ai pas obtenu de résultats utiles. Ce que j'ai découvert est comment accomplir ceci dans VB (6) et DAO, mais j'ai besoin d'une solution pour C#.

Répondre

2

Si vous codez en C#, l'accès n'est pas impliqué, seulement Jet. Ainsi, vous pouvez utiliser la méthode que vous voulez pour accéder aux données, puis coder les mises à jour.

J'ai codé ce genre de chose dans Access à plusieurs reprises, et mon approche pour chaque table est:

  1. exécuter une requête qui supprime de fooDB qui n'existent plus en barDB.

  2. exécutez une requête qui insère dans les enregistrements fooDB qui sont dans barDB qui n'existent pas encore dans fooDB.

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

Le 3ème est le disque dur. Je boucle à travers les champs collection DBA et écrire SQL à la volée qui serait quelque chose comme 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 que vous auriez à utiliser votre fonction de disponible dialecte SQL pour convertir Null à zéro. En cours d'exécution Jet SQL, j'utiliserais Nz(), bien sûr, mais cela ne fonctionne pas via ODBC. Je ne sais pas si cela fonctionnera avec OLEDB, cependant. Dans tous les cas, il s'agit d'émettre un tas de mises à jour SQL colonne par colonne au lieu d'essayer de le faire ligne par ligne, ce qui sera beaucoup moins efficace.

5

Voici ma solution pour relier les tables DAO en utilisant C#. Mon application utilise une base de données centrale MS Access et 8 bases de données réelles qui sont 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# permet de relier les tables DAO de la base de données centrale en fonction des paramètres app.config. À noter que cette structure de base de données est le résultat 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 en C# mais c'est une solution de base de données de bureau très facile à utiliser.

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

Démarrage App, j'appelle cette routine

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

Default.DRC_Data - Dossier actuel de DB d'accès central Default.DRC_LinkedTables - Dossier actuel de 8 bases de données de données

est ici le véritable code ne des tableaux re-lier 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 additionnel écrit pour extraire des données à partir d'une base de données d'accès et de le retourner comme DataT

 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); 
    } 
+3

Salut garykindel, j'ai seulement vu votre message maintenant mais c'était vraiment utile et en fait il devrait être la bonne réponse. Malheureusement j'ai posté cette question comme unreg et maintenant je ne peux plus changer la "bonne réponse", mais je vous ai donné un upvote pour compenser :) Merci pour cette réponse! – Christian

+0

@Christian --- Je sais que ce fil est au-delà de l'ancien, mais que se passe-t-il si vous voulez réellement lier une table à l'accès et non le relier? – user2676140

+0

@ user2676140 Je ne vois que votre commentaire maintenant, mais si vous voulez créer une table liée dans C#, vous devez essentiellement interopérer dans ADOX. Voici le code VB6 montrant comment utiliser les classes ADOX: https://support.microsoft.com/de-de/help/230588/how-to-link-and-refresh-linked-jet-tables-using-adox Vous pouvez facilement transférer ce code dans C# – Christian