如何从未更改的数据表更新数据库

时间:2013-02-05 11:20:39

标签: sql-server vb.net

我想从本地数据库更新我的服务器数据库

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没有原始值。

我的代码没有出错,

但它也不会更新任何内容。

2 个答案:

答案 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)