Tableadapter.Fill不使用手动查询源

时间:2015-02-17 02:38:42

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

我有一个Windows表单应用,DataGridView填充了TableAdapter。我正在使用Fill方法更新循环Async子网中的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没有更新的任何想法吗?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

这很可能是因为.Fill命令使用ByRef获取数据表。我想发生的事情是你正在使用getDataWithMySQL()返回一个DataTable,但是你正在使用该DataTable并使用适配器的.Fill方法和你返回的DataTable重新填充它。 getDataWithMySQL()方法进入lala land再也不会被看到了。

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

 
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