0

可能重复:
在 DataGridView 中显示 SQL 结果的问题

我以前问过这个问题,但从来没有解决过。基本上,我试图用 SQL 查询的结果在我的表单上填充一个 datagridview。我没有从这段代码中得到任何错误,但我只是得到了一个完全空白的 datagridview,即它没有显示任何东西,甚至没有显示列标题。

另请注意,我知道我目前对我的 sql 上的 SQL 注入持开放态度,我只想在对它进行排序之前让它工作。

这是我的全班代码:

Imports System.Data.OleDb
Imports System.Data

Public class TechScreen_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Dim con As OleDbConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0: Data Source = C:\Users\Dave\Documents\jobList.mdb;")
Dim cmd As OleDbCommand = New OleDbCommand("SELECT * FROM jobList WHERE techID = " &  TechScreenID &"", con)
con.Open()
Dim DA As OleDbDataAdapter = New OleDbDataAdapter(cmd)
Dim mydataset As DataSet = New DataSet
DA.Fill(mydataset, "MyTable")
DataGridView1.DatSource = mydataset.Tables("MyTable").DefaultView
con.Close()
con = Nothing

End sub
End class
4

1 回答 1

0

首先,虽然它可能是也可能不是问题的根源,但这条线:

DataGridView1.DatSource = mydataset.Tables("MyTable").DefaultView

包含一个错字。应该是 DataGridView1.DataSource。似乎这会导致编译器错误。

除此之外,尝试简化类似于下面的内容,如果您仍然遇到绑定问题,请在调试器中逐步检查以确保一切按预期工作。此外,检查 dgv 控件上的“自动生成列”属性是否设置为 true。

我不清楚您要做什么,因此以下是我将如何处理此问题的一个非常一般的示例。

  • 首先,将您的连接字符串移动到项目设置文件,并使用 My.Settings.MyConnectionStringName 来引用它。
  • 其次,在 SQL 中使用参数,而不是内联。
  • 将您的数据访问内容包装在“使用”块中。Using 将为您处理块范围内的对象的处置,通常是一种更清洁的方法。
  • 只是我个人的喜好,但我不喜欢数据集带来的所有 bs 开销,一个简单的数据表就可以做到。
  • 我在这里没有尽可能完全地做到这一点,但我建议将数据检索与分配给 UI 控件分开。更重要的是,我可能会进行下一步,并将控件分配与表单加载事件分开。您可能会发现表单中有多个地方需要刷新或重置数据源。

有多种方法可以解决这个问题,我的不一定是“流行的方式。但是,下面的方法刚刚对我有用。

简化您的代码,并进行一些重构:

Imports System.Data
Imports System.Data.OleDb

Public Class TechScreen

    Private Sub TechScreen_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load

        'Not sure where your TechScreenID input parameter is coming from, so this is just for example:
        Dim TechID As Integer = 1

        ' Use a function to return the data to be used as the DataSource for the dgv control:
        DataGridView1.DataSource = Me.JobListTable(TechID)

    End Sub


    Private Function JobListTable(TechID As Integer) As DataTable
        Dim dt As DataTable = Nothing

        Dim SQL As String = "SELECT * FROM joblist WHERE techID = @TechID"

        ' The Using block handles disposal of objects initialized:
        Using con As OleDbConnection = New OleDbConnection(My.Settings.MyConnection)
            Using cmd As OleDbCommand = New OleDbCommand(SQL, con)

                ' Use parameters instead of inline concatenation for cleaner code,
                ' and protection against sql injection attacks:
                cmd.Parameters.AddWithValue("@TechID", TechID)
                con.Open()

                dt = New DataTable()

                Try
                    dt.Load(cmd.ExecuteReader())
                Catch
                    MsgBox("There was an error retrieving data")
                Finally
                    con.Close()
                End Try
            End Using
        End Using

        Return dt

    End Function

End Class
于 2012-10-27T16:24:46.963 回答