2016-08-17 8 views
1

アクセスDBに更新されません。自動番号主キーでパスワードで保護されています私のコードは、データセットをマージするようだが、それは、私は2つのテーブルをマージする2つの別々のMS Accessデータベース</p> <p>両方のテーブルが同一であり、両方のテーブルからマージされたレコードを一つのテーブルを更新しようとしています

次のコードは、データセットメモリをマージします。少なくともmsgboxメッセージでは、レコード数が正しくなります。

しかし、それは、アクセスデータベースのテーブルに更新されません。..

私はネット長いとハードを検索し、緩んで終わりで本当に思いき..

daDBTarget = New OleDbDataAdapter 
daDBTarget.SelectCommand = New OleDbCommand("SELECT * FROM DBUSERTASK", Conn1) 
daDBTarget.Fill(dsDBTarget, "tbl1") 

daDBSource = New OleDbDataAdapter 
daDBSource.SelectCommand = New OleDbCommand("SELECT * FROM DBUSERTASK", conn2) 
daDBSource.Fill(dsDBSource, "tbl2") 

MsgBox("Dataset 1 dstTaskComp is full with " & dsDBTarget.Tables(0).Rows.Count & vbCr & vbCr & "Dataset 2 dstTaskComp is full with " & dsDBSource.Tables(0).Rows.Count) 
        dsDBTarget.Tables("tbl1").Merge(dsDBSource.Tables("tbl2"), True) 

MsgBox("Dataset 1 dstTaskComp is now merged and full with " & dsDBTarget.Tables(0).Rows.Count) 

dsDBTarget.AcceptChanges() 

Dim cb As New OleDbCommandBuilder(daDBTarget) 

daDBTarget.Fill(dsDBTarget) 
cb.GetUpdateCommand() 
daDBTarget.Update(dsDBTarget) 

答えて

0

カップルがあります。私が知らない詳細のたとえば、ソース/マスターが宛先で削除されていない行を削除した場合、それらをマージの一部として削除する必要がありますか? Sourceには存在しないので、手動で処理しない限り、処理中に何も起こりません。それが言及されなかったので、私はその面を無視した。

知るべき重要な要素は、各行にRowStateがあるかどうかを示すことです。DataAdapterは各行と何をするかを示します。間違っているか不足しているいくつかの重要なステップの要素があります。

  • DataAdapterがテーブルを埋めたとき、それは変更なしに、すべての行の状態を設定します。ソース行がDestへの挿入/更新の対象となるためには、追加されたのはRowStateになります。 AcceptChangesはすべての状態フラグをクリアします。
  • コピーを単純に(新しいIDで)追加しないようにするには、PKを比較して新しい行を処理する方法を理解できるように、スキーマもロードする必要があります。
  • PreserveChanges = Trueを使用すると、OleDBにがソースに対して列レベルの変更を無視するよう指示されます。

DBプロバイダオブジェクトは、関連していませんが、処理が完了した時点で破棄することが重要です。これにより同じDBの2つのテーブルがマージされるので、同じ接続を使用できますが、それ以外の場合はそのプロセスを示しています。 DataSetsは必須ではないので、私もスキップしました。

Dim SQLa = "SELECT * FROM MergeA" 
Dim SQLb = "SELECT * FROM MergeB" 
Dim dtSrc As New DataTable 
Dim dtDest As New DataTable 

Using dbcon As New OleDbConnection(ACEConnStr) 
    Using da As New OleDbDataAdapter(SQLa, dbcon) 

     dbcon.Open() 
     ' Do Not set the RowState to UnChanged, please 
     da.AcceptChangesDuringFill = False 
     da.Fill(dtSrc) 
    End Using 

    Using da As New OleDbDataAdapter(SQLb, dbcon) 
     Dim cb = New OleDbCommandBuilder(da) 

     ' same connection, already open 

     ' load the schema to get the PK etc 
     da.FillSchema(dtDest, SchemaType.Source) 
     da.Fill(dtDest) 

     ' merge the tables 
     dtDest.Merge(dtSrc, False, MissingSchemaAction.Add) 
     Dim rows = da.Update(dtDest) 

    End Using ' close and dispose 
End Using 

結果:

enter image description here

  • X線ソースであったがないDEST、それを添加しました。
  • すべてのRED項目はソースのみで行われていたため、通常は列データが目的地で更新されました。
  • (図示せず)を加えたソースで3つの新しい行

おそらくもっと重要なのは、ありその項目2 - Uniformが先に存在するが、ソースで削除されていたされています。 DataAdapterはそこにあり、コードはRowStateDeletedに変更していないため削除しません。マージには、使用されるオプションに応じて行と列のデータが累積されますが、削除された行を削除する方が同期操作のようになります。 It is pretty simple to incorporate though

+0

私は頭が良くて、思考がすべて消えてしまった今、私の人生は戻ってきていますが、人生は再び正常になっています。 – John

+0

データの多くは同じものになる可能性があるため、デバッグしたりデバッグしたりするのは混乱する可能性があります。また、どの方向に進むかによっても異なります。 – Plutonix

関連する問題