C# を使用して DAO テーブルを再リンクするための私のソリューションを次に示します。
私のアプリケーションでは、中央の MS Access データベースと、リンクされている 8 つの実際のデータベースを使用しています。中央のデータベースは C# アプリにローカルに保存されていますが、アプリケーションでは 8 つのデータ データベースを別の場所に配置できます。起動時に、私の C# アプリは app.config 設定に基づいて中央データベースの DAO テーブルを再リンクします。
余談ですが、このデータベース構造は、もともと私のアプリが VB6 に移植した MS Access アプリであった結果です。現在、アプリを C# に変換しています。VB6 または C# で MS Access から移行することもできましたが、非常に使いやすいデスクトップ DB ソリューションです。
中央データベースに、TableName、LinkedTableName、および DatabaseName の 3 つの列を持つ、linkedtables という名前のテーブルを作成しました。
アプリの起動時に、このルーチンを呼び出します
Common.RelinkDAOTables(Properties.Settings.Default.DRC_Data
, Properties.Settings.Default.DRC_LinkedTables
, "SELECT * FROM LinkedTables");
Default.DRC_Data - 中央アクセス DB の現在のフォルダー Default.DRC_LinkedTables - 8 つのデータ データベースの現在のフォルダー
これは、C# で DAO テーブルを実際に再リンクするコードです。
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();
}
}
Access データベースからデータをフェッチし、それを 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);
}