いつものように、最初にいくつかの背景情報を示します。
データベース A (Access データベース) - 2 つの列だけから必要な情報を含むテーブルを保持します。これら 2 つの列からの情報は、データベース A にアクセスできないユーザーが使用するアプリケーションに必要です。
データベース B (Access データベース) - 2 つの列のみを含むテーブルを保持します (テーブル A から必要なものへのミラー)。データベース B には、アプリケーションのすべてのユーザーがアクセスできます。1 つの問題は、列名の 1 つがデータベース A のテーブルと同じではないことです。
私がしなければならないことは、たとえば週に 1 回、自動的に実行されるユーティリティを介して必要なデータを転送することです (2 つのデータベースは完全に同期している必要はなく、単に閉じるだけです)。転送ユーティリティは、(明らかに) 両方のデータベースにアクセスできるユーザー アカウントから実行されます。
これが私が取ったアプローチです(より良い方法がある場合は、提案してください):
データベース A からデータを取得します。これは、必要なテーブルの 2 つの列だけです。
DataReader オブジェクトと WriterStream オブジェクトを使用して、データを [tablename].txt ファイルに書き出します。これを行ったので、schema.ini ファイルを使用して、データ列がデータベース B にあるものと同じ名前になるように強制できます。
データベース B のテーブルをミラーリングする DataTable を含む DataSet オブジェクトを作成します。
Microsoft.Jet.OLEDB.4.0 プロバイダーを使用して、テキストの拡張プロパティ hdr=yes および fmt=delimited を使用して、.txt ファイルから DataTable に情報を吸い込みます (schema.ini ファイルのセットアップ方法と .txtファイルのセットアップ)。DataAdapter を使用して DataTable を埋めています。
データベース B のテーブルをミラーリングする DataTable を含む別の DataSet オブジェクトを作成します。
データベース B からの情報を吸い込み、データベース A から更新する必要がある、テーブル内にある現在のデータがすべて含まれるようにします。ここでも、DataAdapter を使用してこの DataTable に入力しています (ステップ 5 とは別のものです。どちらも異なるデータ ソースを使用しています)。
データベース A (技術的には .txt ファイル) からのデータを保持する DataTable をマージします。
変更内容でデータベース B のテーブルを更新します。
データベース B との通信を担当する DataAdapter の更新、削除、および挿入コマンドを手動で作成しました。ただし、DataSet-From-Database-B.Merge(Dataset-From-TxtFile[tableName] ) HasChanges フラグを反転しません。これは、DataSet-From-Database-B.Update がコマンドを起動しないことを意味します。
DataSet-From-TxtFile からデータを取得して、私が使用している方法を使用してデータベース B にマージして適用する方法はありますか? ここで重要なステップを見逃していますか?
データベース B のテーブルからすべてのレコードをいつでも削除してから、テキスト ファイルからすべてのレコードを挿入できることはわかっています (DataSet 内の各レコードをループして、row.SetAdded を適用して HasChanges フラグを確実にトリガーする必要がある場合でも)。 、しかし、毎回変更のみを適用したいと思います。
私は c# と 2.0 Framework を使用しています (これは、1 つのテーブルしか扱っていないため、DataSet と DataAdapter の代わりに DataTable と TableAdapter を使用できることを意味します)。
ティア