2009-03-09 8 views
4

Ich habe zwei Access 2003-Datenbanken (fooDb und barDb). Es gibt vier Tabellen in fooDb, die mit Tabellen in barDb verknüpft sind.Aktualisieren Sie verknüpfte Tabellen in MS Access-Datenbank mit C# programmatisch

Zwei Fragen:

  • Wie ich den Tabelleninhalt aktualisiere (verknüpften Tabellen in fooDb sollten mit dem Tabelleninhalt in barDb synchronisiert werden)
  • Wie kann ich neu verknüpfen die Tabelle zu einem anderen barDb mit ADO.NET

Ich googelte, aber keine hilfreiche Ergebnisse erhalten. Was ich herausgefunden habe, ist, wie man dies in VB (6) und DAO erreicht, aber ich brauche eine Lösung für C#.

Antwort

2

Wenn Sie in C# codieren, ist Access nicht beteiligt, nur Jet. Sie können also die gewünschte Methode verwenden, um auf die Daten zuzugreifen, und dann die Aktualisierungen codieren.

Ich habe diese Art der Sache in Access oft codiert, und mein Ansatz für jede Tabelle ist:

  1. eine Abfrage, die von fooDB löscht, die nicht mehr in barDB existieren.

  2. Führen Sie eine Abfrage aus, die in fooDB-Datensätze in barDB einfügt, die in fooDB noch nicht vorhanden sind.

  3. Ich verwende immer Code, der on-the-fly SQL schreibt, um die Tabelle fooDB mit den Daten von barDB zu aktualisieren.

Die dritte ist die harte. I-Schleife durch die Sammlung Felder in DBA und schreiben SQL on the fly, dass etwas so sein würde:

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

Für numerische Felder, die Sie Ihre verfügbaren SQL-Dialekt der Funktion zu verwenden, für die Umwandlung von Null auf Null haben würde. Wenn ich Jet SQL benutze, würde ich natürlich Nz() benutzen, aber das funktioniert nicht über ODBC. Nicht sicher, ob es mit OLEDB funktioniert.

In jedem Fall ist der Punkt, eine Reihe von spaltenweise SQL-Updates statt Zeile für Zeile zu versuchen, die viel weniger effizient sein wird.

5

Hier ist meine Lösung zum Verknüpfen von DAO-Tabellen mit C#.

Meine Anwendung verwendet eine zentrale MS Access-Datenbank und 8 tatsächliche Datenbanken, die verknüpft sind. Die zentrale Datenbank wird lokal in meiner C# -App gespeichert, aber die Anwendung ermöglicht, dass die 8 Daten-Datenbanken woanders liegen. Beim Start verbindet meine C# -App DAO-Tabellen in der zentralen Datenbank basierend auf app.config-Einstellungen neu.

Abgesehen davon ist diese Datenbankstruktur das Ergebnis meiner App, die ursprünglich eine MS Access App war, die ich nach VB6 portierte. Ich konvertiere gerade meine App in C#. Ich könnte MS Access in VB6 oder C# verschoben haben, aber es ist eine sehr einfach zu bedienende Desktop-DB-Lösung.

In der zentralen Datenbank habe ich eine Tabelle mit dem Namen "Linkedtables" mit drei Spalten TableName, LinkedTableName und DatabaseName erstellt.

Auf App Start, nenne ich diese Routine

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

Default.DRC_Data - Aktuelle Ordner des zentralen Zugang DB Default.DRC_LinkedTables - Aktuelle Ordner von 8 Daten Datenbanken

Hier Code führt die eigentlichen erneutes Verknüpfen der DAO Tabellen in 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(); 
     } 


    } 

Zusatzcode geschriebenen Daten aus einer Access-Datenbank zu holen und senden sie es als DATAT in der Lage

 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

Hallo garycindel, ich sah nur Ihre Post jetzt, aber es war wirklich hilfreich und in der Tat sollte es die richtige Antwort sein. Leider habe ich diese Frage als Unreg gepostet und kann nun die "richtige Antwort" -Marke nicht mehr ändern, aber ich gab dir eine Auffrischung dafür :) Danke für diese Antwort! – Christian

+0

@Christian --- Ich weiß, dass dieser Thread jenseits alt ist, aber was ist, wenn Sie eine Tabelle tatsächlich verknüpfen wollten, um nicht erneut zu verknüpfen? – user2676140

+0

@ user2676140 Ich sehe nur Ihren Kommentar jetzt, aber wenn Sie eine verknüpfte Tabelle in C# erstellen möchten, müssen Sie grundsätzlich in ADOX einbinden. Hier ist der VB6-Code, der zeigt, wie man die ADOX-Klassen benutzt: https://support.microsoft.com/de-de/help/230588/how-to-link-and-refresh-linked-jet-tables-using-adox Sie können diesen Code leicht in C# übertragen – Christian