3

いつものように、最初にいくつかの背景情報を示します。

データベース A (Access データベース) - 2 つの列だけから必要な情報を含むテーブルを保持します。これら 2 つの列からの情報は、データベース A にアクセスできないユーザーが使用するアプリケーションに必要です。

データベース B (Access データベース) - 2 つの列のみを含むテーブルを保持します (テーブル A から必要なものへのミラー)。データベース B には、アプリケーションのすべてのユーザーがアクセスできます。1 つの問題は、列名の 1 つがデータベース A のテーブルと同じではないことです。

私がしなければならないことは、たとえば週に 1 回、自動的に実行されるユーティリティを介して必要なデータを転送することです (2 つのデータベースは完全に同期している必要はなく、単に閉じるだけです)。転送ユーティリティは、(明らかに) 両方のデータベースにアクセスできるユーザー アカウントから実行されます。

これが私が取ったアプローチです(より良い方法がある場合は、提案してください):

  1. データベース A からデータを取得します。これは、必要なテーブルの 2 つの列だけです。

  2. DataReader オブジェクトと WriterStream オブジェクトを使用して、データを [tablename].txt ファイルに書き出します。これを行ったので、schema.ini ファイルを使用して、データ列がデータベース B にあるものと同じ名前になるように強制できます。

  3. データベース B のテーブルをミラーリングする DataTable を含む DataSet オブジェクトを作成します。

  4. Microsoft.Jet.OLEDB.4.0 プロバイダーを使用して、テキストの拡張プロパティ hdr=yes および fmt=delimited を使用して、.txt ファイルから DataTable に情報を吸い込みます (schema.ini ファイルのセットアップ方法と .txtファイルのセットアップ)。DataAdapter を使用して DataTable を埋めています。

  5. データベース B のテーブルをミラーリングする DataTable を含む別の DataSet オブジェクトを作成します。

  6. データベース B からの情報を吸い込み、データベース A から更新する必要がある、テーブル内にある現在のデータがすべて含まれるようにします。ここでも、DataAdapter を使用してこの DataTable に入力しています (ステップ 5 とは別のものです。どちらも異なるデータ ソースを使用しています)。

  7. データベース A (技術的には .txt ファイル) からのデータを保持する DataTable をマージします。

  8. 変更内容でデータベース 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 を使用できることを意味します)。

ティア

4

2 に答える 2

3

SQLServerを使用し、同期の問題全体を回避するために、誰がどの情報を表示できるかを制御する複数のビューを持つ単一のテーブルしかないことを少しの間取っておきます...

ここでは@Mitchelが正しいと思います。両方のデータベースに接続するプログラムを作成し、それぞれAテーブルとBテーブルをロードするだけです。次に、Aの各要素(列のペア)について、それがBにあることを確認します。そうでない場合は、Bに挿入します。次に、Bの各要素について、Aにあることを確認します。そうでない場合は、Bから削除します。 。保存B.最初にファイルに移動する必要はありません。

擬似コード:

DataTable A = load table from A
DataTable B = load table from B

foreach row in A
   col1 = row[col1]
   col2 = row[col2]
   matchRow = B.select( "col1 = " + col1 + " and col2 = " + col2)
   if not matchRow exists
      add new row to B with col1,col2
   end
end

foreach row in B
   col1 = row[col1]
   col2 = row[col2]
   matchRow = A.select( "col1 = " + col1 + " and col2 = " + col2)
   if not matchRow exists
      remove row from B
   end
end

update B
于 2008-10-24T17:06:36.393 に答える
0

単純にデータ リーダーを使用してレコードをループし、必要に応じてデータベース B に手動で挿入してみませんか?

データセットやマージなどを操作するのではなく.

于 2008-10-24T16:11:51.590 に答える