由于ADO.Net使用“断开连接”模型,其中单个程序可用的数据只是数据库中的内容的副本,处理需要更新数据库中同一个表的多个程序的正常方法是什么?我看到的问题是程序无法更新,除非他的数据副本是最新的。我们是否应该在更新之前阅读并希望在其他人更改数据之前进行更新?
答案 0 :(得分:1)
首选设计模式是使用ExecuteNonQuery方法来实现SQL UPDATE;并尽可能使用参数化SQL。
Dim cnn As SqlConnection
Dim cmd As SqlCommand
Dim sql As String
sql = "UPDATE Table_A SET SomeField=SomeValue,SomeOtherField=SomeOtherValue WHERE SomeKeyField=SomeKeyValue"
cnn = New SqlConnection(connectionString)
cnn.Open()
cmd = New SqlCommand(Sql, cnn)
cmd.ExecuteNonQuery()
cmd.Dispose()
cnn.Close()
通过这种方式,通常不需要先读取记录。通过WHERE子句标识预期的一行或多行。
有关SQL参数的示例,请参阅此处: http://dotnetfacts.blogspot.com/2009/01/adonet-command-parameters.html
顺便说一句,如果你是ADO.NET的新手,但是知道ADO,这篇MS文章可能会有所帮助: http://msdn.microsoft.com/en-us/library/ms973217.aspx答案 1 :(得分:1)
我猜最常见的方法是通过乐观并发控制。这种类型的货币控制在不太可能争用相同数据的系统中运行良好。
Optimistic Concurrency in ADO.NET (MSDN)
我通常使用SQL Server中的timestamp列实现Optimistic Concurrency Control。每次更新行时,都会使用新值更新时间戳列。如果要更新行,首先要检查其时间戳,以查看它是否与本地副本匹配。如果它已更改,您通常会告诉用户已发生并发冲突并提供某种类型的解决方案,例如允许用户决定保留哪个版本(本地版本或数据库版本)。