使用 sqldataadapter.fill 刷新数据 - 看不到新数据
Posted
技术标签:
【中文标题】使用 sqldataadapter.fill 刷新数据 - 看不到新数据【英文标题】:refresh data with sqldataadapter.fill - not seeing new data 【发布时间】:2014-05-29 16:55:02 【问题描述】:我有一个在后台运行的计时器,用于保持数据网格视图对象的数据更新。我的计时器正在调用 sqldatadapter.fill 来填充本地范围的数据集。
如果我转到 sql server 并从表中删除一行,我填充数据集的调用不会反映数据库中的这种更改。
如果我在数据库中更新非主键字段的值并且我的计时器运行,则更改将被拾取并显示在我的 datagridview 中。
我需要如何设置我的 sqldataadapter 以便在其他后端进程添加或删除行时它会发现?
这是在 form_load 中
If ds Is Nothing Then
ds = New DataSet()
End If
Try
sqldataadapter = New SqlClient.SqlDataAdapter(SELECTQUERY, parentconnectionstring)
sqldataadapter.MissingSchemaAction = MissingSchemaAction.AddWithKey
sqlcommandbuilder = New SqlClient.SqlCommandBuilder(sqldataadapter)
sqldataadapter.Fill(ds)
mydata = ds.Tables(0).DefaultView
Catch ex As Exception
ExceptionHandler(ex)
End Try
If mydata.Table.Rows.Count > 0 Then
bindingsource.DataSource = mydata
dgvSystemWeightConfig.DataSource = bindingsource
UpdateLastUpdateTime()
End If
这是我的刷新程序
Public Sub refreshdata()
disableupdatetimer()
Try
If dgvSystemWeightConfig.IsCurrentCellInEditMode Then
Debug.WriteLine("tried to refresh system weight data but user had a cell in edit mode")
Else
Debug.WriteLine("system weight - refreshing data")
sqldataadapter.Fill(ds, mydata.Table.TableName)
dgvSystemWeightConfig.Focus()
UpdateLastUpdateTime()
End If
Catch ex As Exception
ExceptionHandler(ex)
Finally
enableUpdateTimer()
End Try
End Sub
【问题讨论】:
如果您投了反对票,您介意发表评论,让我知道您认为缺少什么或不正确吗?我总是尝试提供尽可能多的问题上下文和源代码,以帮助其他人了解我正在经历的事情,您的 cmets 将帮助我在这个过程中做得更好。 【参考方案1】:不要假设 SqlDataAdapter 没有正确的记录。显然 DataTable 实现了 INotifyPropertyChanged 但没有实现 INotifyCollectionChanged。绑定到 ObservableCollection。
调试并了解 ds。 我敢打赌来源是正确的,并且 UI 控件只是没有接受更改。
要让 UI 获取插入和删除,您需要有一个实现 INotifyCollectionChanged 的源。
ObservableCollection 实现 INotifyCollectionChanged。
DataTable 做了很多你需要替换的东西。 需要一个类或结构来保存行,并且需要定义列。 AutoGenerateColumns 仅适用于 DataTable。
【讨论】:
Visual Studio 数据集可视化工具也在显示旧数据。如果我创建一个新数据集并填充该对象,那么我会得到正确的数据。所以这与我在内存中徘徊的数据集有关。我的对象没有类,所以我不能使用 observablecollection。 你确定吗?在 refreshdata 中放入 ds.Tables(0).Rows.Count 并验证。如果您添加或删除一行,旧的 ds 会在内存中挂起,但如果行更改,则 ds 不会在内存中挂起。以上是关于使用 sqldataadapter.fill 刷新数据 - 看不到新数据的主要内容,如果未能解决你的问题,请参考以下文章
当我使用参数时,SqlDataAdapter.Fill 永远不会结束