Возникает исключение при выполнении запроса
У меня есть форма приложения 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