Вот мое решение для перекомпоновки таблиц DAO с использованием C #.
Мое приложение использует центральную базу данных MS Access и 8 реальных баз данных, которые связаны между собой.
Центральная база данных хранится локально в моем приложении C #, но приложение позволяет расположить 8 баз данных в другом месте. При запуске мое приложение C # повторно связывает таблицы DAO в центральной базе данных на основе настроек app.config.
Кроме того, эта структура базы данных является результатом того, что мое приложение изначально было приложением MS Access, которое я портировал на VB6. В настоящее время я конвертирую свое приложение в C #. Я мог бы отказаться от MS Access в VB6 или C #, но это очень простое решение для настольных БД.
В центральной базе данных я создал таблицу с именами связанных таблиц с тремя столбцами TableName, LinkedTableName и DatabaseName.
При запуске приложения я называю эту процедуру
Common.RelinkDAOTables(Properties.Settings.Default.DRC_Data
, Properties.Settings.Default.DRC_LinkedTables
, "SELECT * FROM LinkedTables");
Default.DRC_Data - текущая папка БД центрального доступа
Default.DRC_LinkedTables - текущая папка из 8 баз данных
Вот код, который выполняет фактическую перекомпоновку таблиц DAO в 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();
}
}
Дополнительный код, написанный для извлечения данных из базы данных доступа и возврата их в виде 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);
}