0

サーバー データベースをローカル データベースから更新したい

Dim mycon As New SqlConnection(myserverConString)
Dim myAdapter As New SqlDataAdapter("SELECT * FROM MYTABLE", mycon)
Dim mybuilder As New SqlCommandBuilder(myAdapter)
myAdapter.UpdateCommand = mybuilder.GetUpdateCommand(True)
dim dt as datatable 
'code to fill dt from my local db
'using select statement
For Each DR As DataRow In dt.Rows
   DR.SetModified()
Next
dt.AcceptChanges()
myAdapter.Update(dt)

問題は、使用されているデータテーブルに実際には変更が含まれておらず、コマンドビルダーの updatecommand が間違った「場所」を使用していることです。

UPDATE [MYTABLE] SET [COLUMN0] = @COLUMN0, [COLUMN1]=@COLUMN1 WHERE 
([COLUMN0]=@Original_COLUMN0) AND ([COLUMN1]=@Original_COLUMN1))

COLUNM0 は主キーです

COLUMN1 は、ローカル DB の更新された値です。

そして、同じスキーマであるサーバー DB で更新したいと考えています。

COLUMN1 は変更された値であるため、「WHERE 句」では使用できません

dt には元の値がありません。

私のコードではエラーは発生しませんが、

しかし、それはまた何も更新しません。

4

2 に答える 2

0

答えが見つかりました。更新ステートメントの前に1行のコードを追加しただけです

dt=dt.getchanges()
myAdapter.update(dt)
于 2013-02-13T14:34:13.060 に答える
0

COLUMN1ローカル DB から更新している場合、WHERE句の値を確認するのはなぜですか? すべての行をローカルCOLUMN1値に更新するだけです。

使うだけ

UPDATE [MYTABLE] 
SET [COLUMN1] = @COLUMN1 
WHERE [COLUMN0] = @Original_COLUMN0

編集: SqlCommandBuilder が変更を検出しやすくするために、行にタイムスタンプを追加することをお勧めします。

からSQLCommandBuilder はその評判よりも優れています

SQLCommandBuilder は、オプティミスティック更新の競合を検出するために、さまざまな ConflictOptions をサポートしています。

OverwriteChanges (= コントロールなし) CompareAllSearchableValues (検索可能なすべての列の値を比較する) CompareRowVersion (列の値をデータ型 RowVersion (~Timestamp) と比較する) 私は CompareRowVersion を使用することを好みます。

また、 DB Concurrency Control with .NET – Detailsを読んで、これを行う方法を確認してください。

于 2013-02-05T11:28:10.187 に答える