紧急求助:使用VB.NET2008 SP1+SQL SERVER2008 R2开发,在更新DATASET时使用以下方法:
Public Overloads Function UpdateDataSet(ByVal conn As DbConnection, ByVal ds As DataSet, ByVal tbName As String) As Integer
Dim dbCommand As DbCommand = Nothing
Dim iResult As Integer = 0
Try
Dim DbDataAdapter As DbDataAdapter = dbfactory.CreateDataAdapter()
dbCommand = conn.CreateCommand
dbCommand.CommandText = "SELECT * FROM " & tbName
dbCommand.CommandType = CommandType.Text
DbDataAdapter.SelectCommand = dbCommand
Dim cmdBuilder As DbCommandBuilder = dbfactory.CreateCommandBuilder()
cmdBuilder.DataAdapter = DbDataAdapter
If conn.State = ConnectionState.Closed Then
conn.Open()
End If
'处理并发情况(分布式情况)
SyncLock GetType(DBHelper)
iResult = DbDataAdapter.Update(ds, tbName)
End SyncLock
Return iResult
Catch ex As Exception
log.Error(ex)
Throw ex
End Try
End Function
程式执行到 iResult = DbDataAdapter.Update(ds, tbName)报错,提示:违反并发性: UpdateCommand 影响了预期 1 条记录中的 0 条。
在整表更新DATASET时,DATASET里面只有一个TABLE,且TABLE名和数据库中表名完全一致,数据列名和列数和数据库中也一致,这个问题要怎么处理,请各位指教,谢谢。
------解决方案--------------------
1 检查是否设有主键。
2 检查更新的字段的原始值是否为空值(原始空值更新时可能会引发此异常)。
3、多人并行操作也可能引发这样的异常。
------解决方案--------------------
DbDataAdapter用到的ds和不是从DB中读到的吧
ds和DbDataAdapter尽量保持一致
------解决方案--------------------
要注意的是从服务器资源管理器中拖进的表,表中的信息要全,例如必须要有主键,否则TableAdapter中的updatecommd等就不好用,在数据集设计器页面中,XXXTableAdapter属性中,Update Command的Text中为空。例如:XXXTableAdapter..update将不可用。
可以用编程方法使用该Table Adapter:
Public Class Form1
Dim myAdapter As New DataSet1TableAdapters.table2TableAdapter
Dim myDataSet As New DataSet1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
myAdapter.Fill(myDataSet.table2)
DataGridView1.DataSource = myDataSet.table2
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Try
Me.Validate()
myAdapter.Update(myDataSet.table2)
MsgBox("Update Successful!")
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub
End Class
也可从数据源中拖到Form设计页面中的控件的方法,来使用TableAdapter。
==========================================
数据库表中的字段默认为0时,用自动生成的 Me.TableAdapterManager.UpdateAll(Me.天诺油库DataSet1) ,更新
时没有填的字段,默认为0时没有为0,在程序设计时要如下图将DefaultValue 设为0 :