Почему я получаю это исключение при запросе базы данных Access? - PullRequest
0 голосов
/ 29 февраля 2020

Мне нужна небольшая помощь, пожалуйста, помогите мне. Я хочу заполнить поле со списком данными, поступающими из моей базы данных. Я использую MS Access. Я пытаюсь заполнить поле со списком только именем или одним столбцом из моей базы данных. Я с трудом добиваюсь этого.

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

Я не понимаю этого, и это указывает на мое заявление о соединении.

Ответы [ 2 ]

0 голосов
/ 29 февраля 2020

Связи - это драгоценные ресурсы. Они должны быть открыты в последний возможный момент (прямо перед методом .Execute...) и закрыты и утилизированы как можно скорее.

Некоторые объекты базы данных, такие как Connection и Command, используют неуправляемые ресурсы за кулисами. Они высвободят эти ресурсы в своем методе .Dispose. Чтобы избавить нас от необходимости .Close и .Dispose этих объектов, у нас есть Using...End Using блоков, которые обрабатывают эту работу для нас, даже если есть ошибка. В этом коде и соединение, и команда обрабатываются одним Using блоком.

Я сократил код, передав строку соединения непосредственно в конструктор соединения, а также передав текст команды и соединение непосредственно к конструктору команды.

Пока активен считыватель, соединение должно оставаться открытым. Я использовал DataTable, который я мог быстро загрузить с помощью ридера, а затем закрыть соединение с 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
0 голосов
/ 29 февраля 2020

Я уже нашел решение

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

Спасибо за ваш отзыв. В следующий раз, когда я напишу вопрос, я буду помнить, что вы все сказали.

...