没有为一个或多个必需参数reader vb.net提供值
我在窗体上运行以下代码时收到上述错误消息没有为一个或多个必需参数reader vb.net提供值,vb.net,Vb.net,我在窗体上运行以下代码时收到上述错误消息 Dim SqlString As String = "select [containmentid],[incidentid],[containmentdate],[containment] from [containment] WHERE [incidentid] = " & lbl_incidentid.Text & "" Using conn As New OleDbConnection(ConnString)
Dim SqlString As String = "select [containmentid],[incidentid],[containmentdate],[containment] from [containment] WHERE [incidentid] = " & lbl_incidentid.Text & ""
Using conn As New OleDbConnection(ConnString)
Using command As New OleDbCommand(SqlString, conn)
Using adapter As New OleDbDataAdapter(command)
conn.Open()
Dim reader As OleDbDataReader = command.ExecuteReader()
Try
If reader.Read() Then
Button1.Visible = False
Else
Button1.Visible = True
End If
Finally
reader.Close()
End Try
End Using
End Using
End Using
我认为这是因为我在lbl_包含的部分缺少了一个撇号,所以如果我修改sql行为
Dim SqlString As String = "select [containmentid],[incidentid],[containmentdate],[containment] from [containment] WHERE [incidentid] = '" & lbl_incidentid.Text & "'"
我现在得到以下错误
条件表达式中的数据类型不匹配
如果我修改sql行以读取一个数字,我知道是否存在如下情况
Dim SqlString As String = "select [containmentid],[incidentid],[containmentdate],[containment] from [containment] WHERE [incidentid] = 622"
它工作得很好,我肯定会错过一些显而易见的东西,但我就是看不到。有人能告诉我为什么我的代码错了吗?也许你需要删除整数周围的撇号。但是,不要试图解决这个问题。而是始终使用sql参数。例如,为了防止sql注入:
Dim SqlString As String = "select [containmentid],[incidentid],[containmentdate],[containment] from [containment] WHERE [incidentid] = @incidentid"
Using conn As New OleDbConnection(ConnString)
Using command As New OleDbCommand(SqlString, conn)
' *** That's all you need to safeguard your code: ***
command.Parameters.Add("@incidentid", OleDbType.Integer).Value = CInt(lbl_incidentid.Text)
Using adapter As New OleDbDataAdapter(command)
conn.Open()
Dim reader As OleDbDataReader = command.ExecuteReader()
Try
If reader.Read() Then
Button1.Visible = False
Else
Button1.Visible = True
End If
Finally
reader.Close()
End Try
End Using
End Using
End Using
没有缺少后缀,但sql参数如果incidentid是数据库中的字符串类型(例如varchar、nvarchar),则只需要使用撇号。如果是数值类型,如int,则不需要撇号。无论如何,您是否检查了
lbl\u incidentid.Text
是否确实包含有效值?另外,你的代码很容易受到SQL注入的攻击,你应该使用参数化查询,正如Tim的回答一样。Tim感谢你的回答,我承认我在这方面是个新手,我在构建这个项目的过程中大部分时间都在胡乱摸索。实际上,我不知道您可以使用参数。但是,command.Parameters.Add(“@incidentid”,OleDbType.Int)返回错误,错误“Int”不是“System.Data.OleDb.OleDbType”的成员。@Boneyt:您需要检查它是否适用于您。语法取决于数据库。也许你的不支持命名参数Hanks@Tim Schmelter,有什么办法可以阻止从字符串“label”到类型“Integer”的转换吗?@Boneyt:solbl\u incidentid.Text
包含字符串label
,你想用它作为incidentid
的参数吗?这听起来不像是incidentid的有效值。数据库中该列的类型是什么?如果是varchar
(字符串),请使用OleDbType.varchar
并删除CInt
,您可以直接分配lbl\u incidentid.Text
。