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);
}
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
@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
@ 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