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)

问题是使用的数据表实际上不包含任何更改,并且命令生成器更新命令使用错误的“位置”我发现使用的更新命令是

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

COLUM0 是主键

COLUMN1 是本地数据库中的更新值,

我想在相同模式的服务器数据库中更新它。

COLUMN1 不能在“WHERE 子句”中使用,因为它是更改后的值

并且 dt 没有原始值。

我的代码没有给出任何错误,

但它也没有更新任何东西。

4

2 回答 2

0

如果您从本地数据库更新,为什么要检查子句COLUMN1中的值?WHERE只需将所有行更新为本地COLUMN1值。

只需使用

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

编辑:您最好在行中添加时间戳,以使 SqlCommandBuilder 更容易检测更改。

来自The SQLCommandBuilder is way Better than its Reputation

SQLCommandBuilder 支持不同的 ConflictOptions 来检测乐观更新冲突:

OverwriteChanges(= 无控制) CompareAllSearchableValues(比较所有可搜索列的值) CompareRowVersion(比较列与数据类型 RowVersion (~Timestamp) 的值我更喜欢使用 CompareRowVersion。请参阅 DB Concurrency Control with .NET-Details。

还可以阅读DB Concurrency Control with .NET –了解如何执行此操作的详细信息。

于 2013-02-05T11:28:10.187 回答
0

我找到了答案,只是在update语句前加了一行代码

dt=dt.getchanges()
myAdapter.update(dt)
于 2013-02-13T14:34:13.060 回答