我在Windows窗体中添加了一DataGrid,和数据库绑定了,能显示数据库信息。现想实现DataGrid的数据实时更新,想通过在DataGrid框中修改数据,而后按保存键保存到数据库,并能在DataGrid中显示更新。试了一天了好多方法都没用。适配器和数据集都是拉的控键。请教各位前辈了,很急的!
Private Sub btnUpdate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnUpdate.Click
Try
尝试更新数据源。
Me.UpdateDataSet()
Catch eUpdate As System.Exception
在此处添加错误处理代码。
显示错误信息(如果有)。
System.Windows.Forms.MessageBox.Show(eUpdate.Message)
End Try
End Sub
Private Sub btnLoad_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLoad.Click
Try
尝试加载数据集。
Me.LoadDataSet()
Catch eLoad As System.Exception
在此处添加错误处理代码。
显示错误信息(如果有)。
System.Windows.Forms.MessageBox.Show(eLoad.Message)
End Try
End Sub
Private Sub btnCancelAll_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCancelAll.Click
Me.Ds保险账号1.RejectChanges()
End Sub
Public Sub UpdateDataSet()
创建一个新数据集来保存对主数据集所做的更改。
Dim objDataSetChanges As 保险账号管理.ds保险账号 = New 保险账号管理.ds保险账号
停止当前的任何编辑。
For i As Integer = 1 To grd保险账号.Rows.Count
If IsDBNull(grd保险账号.Rows(i - 1).Item(6)) = True Then
grd保险账号.Rows(i - 1).Item(6) = False
End If
Next
Me.BindingContext(Ds保险账号1, "保险账号").EndCurrentEdit()
获取对主数据集所做的更改。
objDataSetChanges = CType(Ds保险账号1.GetChanges, 保险账号管理.ds保险账号)
检查是否做了任何更改。
If (Not (objDataSetChanges) Is Nothing) Then
Try
需要做一些更改,所以尝试通过调用 update 方法
和传递数据集以及任何参数来更新数据源。
Me.UpdateDataSource(objDataSetChanges)
Ds保险账号1.Merge(objDataSetChanges)
Ds保险账号1.AcceptChanges()
Catch eUpdate As System.Exception
在此处添加错误处理代码。
Throw eUpdate
End Try
添加代码以检查返回的数据集中是否有任何可能已被
推入到行对象错误中的错误。
End If
End Sub
Public Sub LoadDataSet()
创建一个新数据集以保存从 FillDataSet 调用返回的记录。
使用了一个临时数据集,这是因为填充现有的数据集
需要重新绑定数据绑定。
Dim objDataSetTemp As 保险账号管理.ds保险账号
objDataSetTemp = New 保险账号管理.ds保险账号
Try
尝试填充临时数据集。
Me.FillDataSet(objDataSetTemp)
Catch eFillDataSet As System.Exception
在此处添加错误处理代码。
Throw eFillDataSet
End Try
Try
grd保险账号.DataSource = Nothing
清空数据集中的旧记录。
Ds保险账号1.Clear()
将记录合并到主数据集中。
Ds保险账号1.Merge(objDataSetTemp)
grd保险账号.SetDataBinding(Ds保险账号1, "保险账号")
Catch eLoadMerge As System.Exception
在此处添加错误处理代码。
Throw eLoadMerge
End Try
grd保险账号.Cols(4).Width = 200
grd保险账号.Cols(4).TextAlignFixed = C1.Win.C1FlexGrid.TextAlignEnum.CenterCenter
Dim c As C1.Win.C1FlexGrid.Column = grd保险账号.Cols(2)
c.Name = "保险类别"
c.DataType = GetType(List保险类别)
End Sub
Public Sub UpdateDataSource(ByVal ChangedRows As 保险账号管理.ds保险账号)
Try
在有挂起的更改时,只需要更新数据源即可。
If (Not (ChangedRows) Is Nothing) Then
打开连接。
Me.SqlConnection1.Open()
尝试更新数据源。
SqlDataAdapter1.Update(ChangedRows)
End If
Catch updateException As System.Exception
在此处添加错误处理代码。
Throw updateException
Finally
无论是否引发了异常都关闭连接。
Me.SqlConnection1.Close()
End Try
End Sub
Public Sub FillDataSet(ByVal dataSet As 保险账号管理.ds保险账号)
在填充数据集前关闭约束检查。
这允许适配器填充数据集而不用考虑
表之间的依赖项。
dataSet.EnforceConstraints = False
Try
打开连接。
Me.SqlConnection1.Open()
尝试通过 OleDbDataAdapter1 填充数据集。
Me.SqlDataAdapter1.Fill(dataSet)
Catch fillException As System.Exception
在此处添加错误处理代码。
Throw fillException
Finally
重新打开约束检查。
dataSet.EnforceConstraints = True
无论是否引发了异常都关闭连接。
Me.SqlConnection1.Close()
End Try
End Sub
点击按钮更新
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
Try
SqlConnection1.Open()
Dim mycom As New SqlCommand(SqlUpdateCommand1.CommandText,_
SqlConnection1)
mycom.ExecuteNonQuery()
SqlConnection1.Close()
DataSet11.Clear()
SqlDataAdapter1.Fill(DataSet11)
DataGrid1.datasource=dataset11
Catch ex As Exception
MsgBox(ex.ToString)
End Try
End Sub
点击保存
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
Try
SqlConnection1.Open()
Dim mycom As New SqlCommand(SqlUpdateCommand1.CommandText,_
SqlConnection1)
mycom.ExecuteNonQuery()
SqlConnection1.Close()
dim CmdBuild as new SqlCommandBuilder(SqlDataAdapter1)
SqlDataAdapter1.Update(DataSet11)
MsgBox("OK!")
Catch ex As Exception
MsgBox(ex.ToString)
End Try
End Sub
改为:
Private Sub Main_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
Try
If Not IsPostBack Then
SqlConnection1.Open()
Me.SqlDataAdapter1.Fill(DataSet11)
SqlConnection1.Close()
End If
Catch ex As Exception
ex.Message
End Try
End Sub
更新后再重新绑定就可以了
不要重新绑定,这样数据量很大时很费时间。应该参见vs.net自动生成的代码,是isertcommand和updatecommand的sql语句都是更新后,再选择这个更新成功的行出来,然后设置好dataadapter的tablemapping属性。关健语句如下:
Me.SqlInsertCommand1.CommandText = "INSERT INTO A02(pid, status, C0203, C0205, C0206, C0201, C0204) VALUES (@pid, @status, @C0203, @C0205, @C0206, @C0201, @C0204); SELECT id, pid, status, C0203, C0205, C0206, C0201, C0204 FROM A02 WHERE (id = @@IDENTITY)"
Me.SqlDataAdapter1.TableMappings.AddRange(New System.Data.Common.DataTableMapping() {New System.Data.Common.DataTableMapping("Table", "A02", New System.Data.Common.DataColumnMapping() {New System.Data.Common.DataColumnMapping("id", "id")})})这里本来是对所有的字段都做了映射的,我只需要一列ID就把其它的删除了。
最后要注意的是da.update时,不要只是更新已改变的数据。
da.update(datatable.getchanged)
而是更新整个表
da.update(datatable)
我在这个问题上花了很多时间才找出这个原因。