我想从本地数据库更新我的服务器数据库
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是本地数据库中的更新值,
我想在服务器数据库中更新它是同一个模式。
COLUMN1不能在“WHERE子句”中使用,因为它是更改后的值
并且dt没有原始值。
我的代码没有出错,
但它也不会更新任何内容。
答案 0 :(得分: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。请参阅使用.NET详细信息进行数据库并发控制。
还要阅读DB Concurrency Control with .NET – Details以了解如何执行此操作。
答案 1 :(得分:0)
我找到了答案, 刚刚在更新语句之前添加了一行代码
dt=dt.getchanges()
myAdapter.update(dt)