执行查询时抛出异常
Posted
技术标签:
【中文标题】执行查询时抛出异常【英文标题】:Exception thrown when executing query 【发布时间】:2021-01-31 00:09:39 【问题描述】:我有 vb.net 应用程序表单,它包含 id 作为组合框。单击编辑按钮并选择其他ID后,我发现错误如下图所示。那该怎么办?
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
【问题讨论】:
这是一个可怕的问题,原因有很多。尽管收到提示,但您显然没有费心去参观站点以了解站点的工作原理,这意味着您肯定没有花任何时间在帮助中心了解更多信息。您在问题中只发布了代码,甚至没有对其进行格式化,然后您在标题中发布了一个问题。当出现提示时,您也不必费心输入图像描述,并且您发布了文本图片而不是文本,如果我们想搜索它,这会阻止我们复制它。您还发布了两个相同的屏幕截图。 正确的问题在问题本身中提供了完整而清晰的描述,其中包括您想要实现的目标、您如何尝试实现它以及尝试时会发生什么。屏幕截图应仅用于澄清。它们永远不应该是任何东西的唯一来源。错误消息是文本,应该这样发布。你应该做的最后一件事是写标题,它应该是对问题的总结,而不是问题本身。如果您懒得做力所能及的事来帮助我们,您会发现我们不太热心帮助您。 请阅读How to Ask和minimal reproducible example 【参考方案1】:像命令和连接这样的数据库对象应在使用它们的方法中声明,以便正确处理它们。即使出现错误,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
【讨论】:
【参考方案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 命令中使用参数
【讨论】:
以上是关于执行查询时抛出异常的主要内容,如果未能解决你的问题,请参考以下文章
Windows Azure:“已添加具有相同密钥的项目。”选择时抛出异常