为什么在查询 Access 数据库时会出现此异常?

Why do I get this exception when querying an Access database?

我需要一点帮助,请帮帮我。我想用来自我的数据库的数据填充我的组合框。我正在使用 MS 访问。我想要做的是用我的数据库中的名称或单个列填充我的组合框。我很难做到这一点。

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

    With cmd
        .Connection.Open()
        .CommandText = "SELECT FullName FROM Judges"
        rdr = cmd.ExecuteReader

        While rdr.Read()
            cmbJudges.Items.Add(rdr("FullName"))
        End While
        .ExecuteNonQuery()
        .Connection.Close()
        rdr.Close()

    End With

End Sub

但是我遇到了这样的错误:

System.NullReferenceException: 'Object reference not set to an instance of an object.'

System.Data.OleDb.OleDbCommand.Connection.get returned Nothing

我不明白这个,它指向我的连接语句。

我已经找到解决方案

Dim rdr as  OleDb.OleDbDataReader
Dim con As OleDb.OleDbConnection = New OleDb.OleDbConnection("Provider = Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\athan\Documents\PAGEANT.accdb")
Try

            With cmd
                .Connection = con
                .Connection.Open()
                .CommandText = "SELECT FullName from Judges"
                rdr = cmd.ExecuteReader

                While rdr.Read
                    cmbJudges.Items.Add(rdr.Item(0))
                End While
                rdr.Close()
                .Connection.Close()

            End With

        Catch ex As Exception

            Dim test = MsgBox(ex.Message)


        End Try

感谢您的反馈。下次我 post 一个问题时,我会记住你们所说的。

人脉是宝贵的资源。它们需要在最后可能的时刻(就在 .Execute... 方法之前)打开,并尽快关闭和处理。

一些数据库对象,如 ConnectionCommand 在幕后使用非托管资源。他们将在他们的 .Dispose 方法中释放这些资源。为了避免我们不得不 .Close 和 .Dispose 这些对象,我们有 Using...End Using 块来为我们处理这些琐事,即使出现错误也是如此。在此代码中,连接和命令均由单个 Using 块处理。

我通过将连接字符串直接传递给连接的构造函数并将命令文本和连接直接传递给命令的构造函数来缩短代码。

只要 reader 处于活动状态,连接就必须保持打开状态。我使用了一个 DataTable,我可以用 reader 快速加载它,然后用 End Using 关闭连接。然后我们通过将 .DisplayMember 设置为字段名称并将 DataSource 设置为 DataTable.

来更新用户界面
Private Sub FillComboBox()
    Dim dt As New DataTable
    Using con As New OleDbConnection("Provider = Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\athan\Documents\PAGEANT.accdb"),
            cmd As New OleDbCommand("SELECT FullName from Judges", con)
        Try
            con.Open()
            dt.Load(cmd.ExecuteReader)
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Using
    ComboBox1.DisplayMember = "FullName"
    ComboBox1.DataSource = dt
End Sub