4

2 つの Access 2003 データベース (fooDbおよびbarDb) があります。fooDbのテーブルにリンクされている には 4 つのテーブルがありますbarDb

2 つの質問:

  • テーブルの内容を更新するにはどうすればよいですか ( のリンクされたテーブルはfooDbのテーブルの内容と同期する必要がありますbarDb)
  • barDbテーブルを別の使用方法に再リンクするにはどうすればよいですかADO.NET

私はグーグルで検索しましたが、役立つ結果は得られませんでした。私が見つけたのは、VB(6) と DAO でこれを達成する方法ですが、C# のソリューションが必要です。

4

2 に答える 2

6

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);
    }
于 2010-12-06T16:10:38.897 に答える
2

C# でコーディングしている場合、Access は関与せず、Jet のみが関与します。したがって、任意の方法でデータにアクセスし、更新をコーディングできます。

この種のことを Access で何度もコーディングしてきましたが、各テーブルに対する私のアプローチは次のとおりです。

  1. barDB に存在しなくなった fooDB から削除するクエリを実行します。

  2. fooDB にまだ存在しない barDB にあるレコードを fooDB に挿入するクエリを実行します。

  3. 私は常に、オンザフライで SQL を記述するコードを使用して、barDB からのデータで fooDB テーブルを更新します。

3つ目は難しいです。DBA でフィールド コレクションをループし、次のような SQL をオンザフライで記述します。

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

数値フィールドの場合、利用可能な SQL 方言の関数を使用して Null をゼロに変換する必要があります。もちろん、Jet SQL を実行する場合は Nz() を使用しますが、ODBC 経由では機能しません。ただし、OLEDB で動作するかどうかはわかりません。

いずれにせよ、重要なのは、行ごとに SQL 更新を実行しようとするのではなく、列ごとに一連の SQL 更新を発行することです。これは効率が大幅に低下します。

于 2009-03-10T00:04:58.583 に答える