両方のデータベースを更新可能にする必要がある場合、2つのデータベースの同期は非常に複雑です。一方が他方の奴隷であれば、それほど難しくはありません。私は、Accessを使ってこの種の同期を一度だけプログラムしました。ウェブサーバ上のMDBを使って一度だけローカルデータMDBと同期させる必要がありました(データをウェブサイトで編集するようにしました。一方的な同期ではあるが、Web以外の側で編集内容をマージする必要がある)、ウェブサイト上のMySQLとマスター(MySQL)/スレーブ(アクセス)関係の間の同期を一度プログラミングする必要がある。
ウェブサイトでは、各テーブルのデータのダンプをテキストファイルにプログラムします。レコードが作成され更新された時期を知るために、MySQLテーブルにタイムスタンプフィールドを持たせると便利です。これにより、最後のデータダンプ以降にダンプするレコードを選択することができます(これにより、Access側のデータの同期化がはるかに簡単になります)。
テキストファイルを適切にインデックスを作成し、フロントエンドのAccessアプリケーションにリンクしたステージングテーブルにインポートする方法をプログラミングしました。データダンプをステージングテーブルにインポートしたら、次の3つのタスクがあります。
新しいレコードを見つけてAccessデータストアに追加します。これは、外部結合で簡単に実行できます。
を削除します。これについては後で詳しく説明しますが、それはよく、複雑です。
更新されたレコードを処理します。このために、私は列ごとのSQLステートメントを書くDAOコードを書いた。このような
何か:今
UPDATE LocalTable
SET LocalTable.Field1 = DownloadTable.Field2, LocalTable.Updated = DownloadTable.Updated
WHERE LocalTable.Field1 <> DownloadTable.Field2
は、明らかに、WHERE句は少し複雑よりも(あなたがNULLで対処しなければならない、とあなたが適切にフォーマットされた基準を使用する必要がなければなりませんすなわち、データ型、 ""と##、それぞれテキストと日付の場合、数値データの区切り文字はありません)、それを行うためのコードを書くのは簡単です。私が言ったように、複雑な部分は、各SQL文のWHERE句を書いているが、それは把握するのは簡単ですが、今
Dim db As DAO.Database
Dim rsFields As DAO.Recordset
Dim fld As DAO.Field
Dim strSQL As String
Set rsFields = db.OpenRecordset("SELECT TOP 1 Field1, Field2, Field3 FROM LocalTable;")
For Each fld in rsFields
[write your SQL statement and execute it]
Next fld
Set fld = Nothing
rsFields.Close
Set rsFields = Nothing
Set db = Nothing
:
スケルトンコードは次のようになります。また、rsFieldsレコードセット(更新したいフィールドを歩き回るためだけに使用されます)では、更新可能なフィールドのみを含めるので、CREATEDフィールドとPKフィールド(およびあなたが更新したくない他のフィールド)。
ここで、DELETESの場合。
リモートテーブルにないローカルテーブルのレコードを削除することをお勧めします。それが実際にスレーブデータベースであれば正常に動作しますが、もともとスレーブであったものが独自の編集を終了することがよくあります。その場合、ではなく、マスターMySQLデータベースからレコードを削除し、削除されたレコードを示すDELETEフラグを設定する必要があります。レコードの日付スタンプを使用している場合は、LastUpdatedタイムスタンプで削除されたすべてのレコードを削除することができます。< =最後にデータをダンプしたり、AccessアプリケーションがAccessデータストアから正常に削除されたレコードのリストを使用してサーバーにテキストファイルを送信させることもできます。 Accessデータストアに編集内容がある場合は、MySQLの「マスター」データベースから削除されたレコードを編集するロジックが必要になります。要約すると
:あなたは真のマスター/スレーブの関係を持っている場合は
は、それは些細なのです。真剣にそれをやりたければ、すべてのMySQLデータテーブル全体をテキストファイルにダンプし、Accessデータストア内のすべてのレコードを削除し、テキストファイルをインポートするだけです。
あなたは純粋なマスター/スレーブの関係から出発する必要があるので、私はそれをしない傾向があります。ホースを締めて、すべてを最初から書き直す必要があります。
上記の概要は、マスター/スレーブの場合は非常にきれいに動作しますが、「スレーブ」データベースにプライベートなフィールドがいくつかある場合やスレーブには存在し、マスター(私が働いていた状況です)。