Возникает исключение при выполнении запроса

У меня есть форма приложения vb.net, она содержит идентификатор в виде поля со списком. после нажатия кнопки редактирования и выбора другого идентификатора я обнаружил ошибку, как на картинке ниже. Итак, что делать?

      Private Sub searchparfum()
    Dim dt As New DataTable
    Dim ds As New DataSet
    ds.Tables.Add(dt)
    Dim da As New OleDbDataAdapter("select num from parfum", MaConnection)
    da.Fill(dt)
    Dim r As DataRow
    cmb_parfum.AutoCompleteCustomSource.Clear()
    For Each r In dt.Rows
        cmb_parfum.AutoCompleteCustomSource.Add(r.Item(0).ToString)
    Next
    cmb_parfum.AutoCompleteMode = AutoCompleteMode.SuggestAppend
    cmb_parfum.AutoCompleteSource = AutoCompleteSource.CustomSource
End Sub

Private Sub cmb_parfum_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmb_parfum.SelectedIndexChanged
    qry = "select * from parfum where num ='" & (cmb_parfum.Text) & "' "
    cmd = New OleDbCommand(qry, MaConnection)
    cmd.ExecuteNonQuery()
    dr = cmd.ExecuteReader
    If dr.Read Then

        txt_num.Text = dr("num")
        lab_nom.Text = dr("nom")
        lab_prix.Text = dr("prix")
        stock_par.Text = dr("stock")
        txt_ventes.Text = dr("ventes")
        photo.Text = dr("photo")

    End If
End Sub

2 ответа

Как говорится в сообщении об ошибке, у вас нет открытого соединения с БД. Добавьте open и close и, возможно, оберните его в Try.. Catch тоже так:

          cmd = New OleDbCommand(qry, MaConnection)
    Try
        MaConnection.Open()
        cmd.ExecuteNonQuery()
        dr = cmd.ExecuteReader
        If dr.Read Then
            txt_num.Text = dr("num")
            lab_nom.Text = dr("nom")
            lab_prix.Text = dr("prix")
            stock_par.Text = dr("stock")
            txt_ventes.Text = dr("ventes")
            photo.Text = dr("photo")
        End If
    Catch ex As Exception
        ' Handle any exception
    Finally
        MaConnection.Close()
    End Try

Также обратите внимание на использование параметров в ваших командах SQL.

Объекты базы данных, такие как команды и соединение, должны быть объявлены в методе, в котором они используются, чтобы их можно было правильно удалить. Using...End Usingблоки делают это за вас, даже если есть ошибка.

Вы бы не использовали cmd.ExecuteNonQuery()для Selectутверждение. Который используется только для Update, Insertили же Deleteкоманды.

Вы не хотите, чтобы соединение оставалось открытым, пока вы обновляете пользовательский интерфейс. Итак, мы загружаем таблицу данных, которая не требует, чтобы соединение оставалось открытым, пока мы используем данные. Для чтения требуется открытое соединение.

Является ли фотография действительно строковым типом?

      Private ConStr As String = "Your connection string"

Private Sub cmb_parfum_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmb_parfum.SelectedIndexChanged
    Dim dt As New DataTable
    Dim qry = "select * from parfum where num = @Parfum;"
    Using cn As New OleDbConnection(ConStr),
            cmd As New OleDbCommand(qry, cn)
        cmd.Parameters.Add("@Parfum", OleDbType.VarWChar).Value = cmb_parfum.Text
        cn.Open()
        Using dr = cmd.ExecuteReader
            dt.Load(dr)
        End Using
    End Using 'connection is closed and disposed and command is disposed
    If dt.Rows.Count > 0 Then
        txt_num.Text = dt(0)("num").ToString
        lab_nom.Text = dt(0)("nom").ToString
        lab_prix.Text = dt(0)("prix").ToString
        stock_par.Text = dt(0)("stock").ToString
        txt_ventes.Text = dt(0)("ventes").ToString
        photo.Text = dt(0)("photo").ToString
    End If
End Sub
Другие вопросы по тегам