使用 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 方法慢

SqlDataAdapter.Fill 方法慢

当我使用参数时,SqlDataAdapter.Fill 永远不会结束

SqlDataAdapter.Fill() 溢出异常

SqlDataAdapter.Fill(DataGridView.DataSource) 复制所有行

SqlDataAdapter.Fill 即使是一条记录也太慢了