【问题标题】:Tableadapter.Fill not working with manual query sourceTableadapter.Fill 不适用于手动查询源
【发布时间】:2015-02-17 02:38:42
【问题描述】:

我有一个 Windows 窗体应用程序,其 DataGridViewTableAdapter 填充。我正在使用Fill 方法在循环的Async sub 中更新UI 的数据,就像这样。

Private Async Sub updateUI()
    Dim sw As New Stopwatch
    While True
        Await Task.Delay(3000)
        sw.Restart()
        myTableAdapter.Fill(getDataWithMySQL())
        'myTableAdapter.Fill(myDataSet.myTable)
        logger.Debug(sw.ElapsedMilliseconds)
    End While
End Sub

getDataWithMySQL函数如下:

Private Function getDataWithMySQL() As myDataSet.myDataTable
    Dim connStr As String = My.Settings.myConnectionString
    Dim sql As String = "SELECT ... LEFT JOIN ..."
    Dim dt As New myDataSet.myDataTable
    Using conn As New MySqlConnection(connStr)
        Using cmd As New MySqlCommand()
            With cmd
                .CommandText = sql
                .Connection = conn
            End With
            Try
                conn.Open()
                Dim sqladapter As New MySqlDataAdapter(cmd)
                sqladapter.Fill(dt)

            Catch ex As MySqlException
                MsgBox(ex.Message)
            End Try
        End Using
    End Using
    Return dt
End Function

myTableAdapter.Fill(myDataSet.myTable) 工作正常,但表现不佳,而 myTableAdapter.Fill(getDataWithMySQL()) 表现更好,正如我尚未回答的问题 here 中所报告的那样。

由于某种原因,myTableAdapter.Fill(getDataWithMySQL()) 不再起作用。它不会引发错误并且dt 填充了正确的数据,但DataGridView 没有更新。它以前工作过,我认为我没有改变任何会影响这一点的东西。任何想法为什么DataGridView 没有更新?

【问题讨论】:

  • DataGridView.DataSource 属性设置为什么?确保将其设置为您的 DataTable。
  • @Supersnake 设置为数据表绑定源。
  • 您是否将 TableAdapter 的 ClearBeforeFill 属性设置为 true?
  • 也可以尝试调用dataGridViewInstance.Refresh()...
  • @NeillVerreynne 我尝试了你的两个建议,但不幸的是都没有奏效......为什么我要把ClearBeforeFill改为True

标签: c# .net vb.net datagridview tableadapter


【解决方案1】:

我相信您的问题源于您在方法调用中创建一个新的数据表并返回该数据表。您已经获得了所需的 DataSet.DataTable 的引用,只需使用该 DataTable 调用 Fill。

您的问题是您正在填充的数据表与您的网格正在使用的数据集没有关联。

【讨论】:

  • 谢谢,但是用DataSet.DataTable 填充的问题是性能太差了。以这种方式执行Fill 需要相当长的时间。虽然您所说的新 DataTable 不与 Grid 关联是有道理的,但该函数返回的 DataTable 是同一类型,所以它不应该有任何区别。此外,正如我所提到的,这已经工作了一段时间,这就是我能够在我链接到的另一个问题中对每种方法的性能进行基准测试的方式。
  • 如果它工作了一段时间,那么发生了什么变化?你能通过源代码控制查看吗?类型与实例是否关联DataGrid无关。
  • 不幸的是,我不确定发生了什么变化,我已经尝试了所有我能想到的方法,包括编写一个只使用该代码的新应用程序,看看我是否可以让它工作,但没有任何乐趣。源代码控制也不好,因为我一直是个坏孩子,忽略了在这个项目中实现它。虽然吸取了教训!
  • 好的。那我就没有别的事可做了。我已经在 DataSet 表上使用 Fill 运算符尝试了代码,它工作正常。查询越复杂越慢,但我没有看到任何太糟糕的情况。
  • 其中一个问题是查询有许多连接(5 个表),这可能会减慢它的速度。不过,没有一张桌子很大,最大的有 500 行,其余的有 10-100 行,所以应该不会那么糟糕。但是,当您每 5 秒更新一次 UI 时,>600 毫秒与
【解决方案2】:

这很可能是因为.Fill 命令在使用ByRef 时需要一个数据表。我认为发生的事情是您正在使用 getDataWithMySQL() 返回一个 DataTable,但随后您正在使用该 DataTable 并使用适配器的 .Fill 方法重新填充它,并且您使用 getDataWithMySQL() 方法返回的 DataTable 进入 lala 土地再也见不到了。

在这里做一些假设,但尝试一下:

Private Async Sub updateUI()
    Dim sw As New Stopwatch
    While True
        Await Task.Delay(3000)
        sw.Restart()
        Dim dt as myDataSet.myDataTable = getDataWithMySQL("SELECT ... LEFT JOIN ...")
        UpdateDGV(dt)
        'myTableAdapter.Fill(myDataSet.myTable)
        logger.Debug(sw.ElapsedMilliseconds)
    End While
End Sub

' You need to change `DataGridView` here to be the actual datagridview control on the form
Private Sub UpdateDGV(newSource as myDataSet.myDataTable)
    DataGridView.SuspendLayout()
    DataGridView.DataSource = Nothing
    DataGridView.DataSource = newSource 
    DataDridView.ResumeLayout()
End Sub

' Make the function easier to reuse by passing in the SQL command
Private Function getDataWithMySQL(sqlCmd as string) As myDataSet.myDataTable
    Dim connStr As String = My.Settings.myConnectionString
    Dim dt As New myDataSet.myDataTable
    Using conn As New MySqlConnection(connStr)
        Using cmd As New MySqlCommand()
            With cmd
                .CommandText = sqlCmd
                .Connection = conn
            End With
            Try
                conn.Open()
                Dim sqladapter As New MySqlDataAdapter(cmd)
                sqladapter.Fill(dt)

            Catch ex As MySqlException
                MsgBox(ex.Message)
            End Try
        End Using
    End Using
    Return dt
End Function

【讨论】:

  • 感谢您的回答。虽然它确实有效,但这种方法存在一些问题。首先,性能相当于使用myTableAdapter.Fill(myDataSet.myTable),其次DataGridView 失去了它的位置,这是一个交易破坏者。使用myTableAdapter.Fill(myDataSet.myTable) 方法时,可以通过在TableAdapter 中将ClearBeforeFill 设置为False 来避免后者。所以不幸的是,这个答案违背了手动完成的目的。
  • 至少我试过了……重要的是思想,对吧?
  • 哈哈是的deffo!感谢队友的帮助!
猜你喜欢
  • 1970-01-01
  • 2012-10-24
  • 1970-01-01
  • 1970-01-01
  • 2019-05-06
  • 2017-03-19
  • 2011-12-29
  • 1970-01-01
相关资源
最近更新 更多