私は型付きデータセットに多対多の関係テーブルを持っています。 私は新しい(前と同じかもしれない)を追加する前に、私は古い関係を削除しています。この方法は、フェイルセーフであるか、私は本当に(LINQを持つなど)が削除され、削除とだけは本当に新しく追加された1つを追加するために確保する必要がある場合場合DataTable:新しいセーフを挿入する前に古いDataRowsを削除しますか?
は今、私は疑問に思います。
SQL Serverでは、リレーションテーブルに対して定義された一意の制約です。この2つの外部キーは複合主キーです。
は、データアダプターは、RowStateが<>予測可能な変更なしかではないでDataRowを更新ためですか? つまり、DataAdapter.Update(DataTable)
は、キーがすでに存在するときに例外が発生する可能性がありますか?
これは、データモデルである:
これは、コードの一部(LbSymptomCodes
がASP.Netリストボックスである)である:
Dim daTrelRmaSymptomCode As New ERPModel.dsRMATableAdapters.trelRMA_SymptomCodeTableAdapter
For Each oldTrelRmaSymptomCodeRow As ERPModel.dsRMA.trelRMA_SymptomCodeRow In thisRMA.GettrelRMA_SymptomCodeRows
oldTrelRmaSymptomCodeRow.Delete()
Next
For Each item As ListItem In LbSymptomCodes.Items
If item.Selected Then
Dim newTrelRmaSymptomCodeRow As ERPModel.dsRMA.trelRMA_SymptomCodeRow = Services.dsRMA.trelRMA_SymptomCode.NewtrelRMA_SymptomCodeRow
newTrelRmaSymptomCodeRow.fiRMA = Services.IdRma
newTrelRmaSymptomCodeRow.fiSymptomCode = CInt(item.Value)
Services.dsRMA.trelRMA_SymptomCode.AddtrelRMA_SymptomCodeRow(newTrelRmaSymptomCodeRow)
End If
Next
daTrelRmaSymptomCode.Update(Services.dsRMA.trelRMA_SymptomCode)
は、事前にありがとうございます。
ありがとうございました。しかし、それは1つではなく3つのDBコール(および3つのトランザクション)をもたらします。追加された行の更新が既に削除された行と変更された行で受け入れられた変更に対して失敗したとき、私はRejectChangesを実行できませんでした。 –
@TimSchmelter:エラーが発生した場合、ロールバックするtry/catchブロック内の単一のトランザクションですべての更新をラップできませんでしたか? – codingbadger
入力されたデータセットでは、このロジックが自動生成されたTableAdaptersにカプセル化されているため、可能ですが難しいです。これらのアダプターを、自動生成されたものとは別のファイルで部分クラスで拡張し、DataAdapter自体を公開してトランザクションを提供する必要があります。しかし、私はこの余分な努力を避けたいです;) –