Vb.net错误(&Q)';InvalidArgument=的值';0';对';无效;索引';。参数名称:index'&引用;
我知道为什么会出现错误“'0'的'InvalidArgument=值对'index'无效”。参数名称:index'”是因为我的sql语句没有返回任何值。问题是我如何编程vb.net,所以如果没有值,我就不会遇到这个问题Vb.net错误(&Q)';InvalidArgument=的值';0';对';无效;索引';。参数名称:index'&引用;,vb.net,ms-access,Vb.net,Ms Access,我知道为什么会出现错误“'0'的'InvalidArgument=值对'index'无效”。参数名称:index'”是因为我的sql语句没有返回任何值。问题是我如何编程vb.net,所以如果没有值,我就不会遇到这个问题 Private Sub showdata1() Dim queryStr As String = "SELECT student.id,firstname,lastname FROM Student INNER JOIN Class_Student ON student
Private Sub showdata1()
Dim queryStr As String = "SELECT student.id,firstname,lastname FROM Student INNER JOIN Class_Student ON student.id = class_student.ID where class_student.classid=" & ListView1.SelectedItems(0).SubItems(0).Text & ""
Dim con As New OleDbConnection("provider=microsoft.jet.oledb.4.0;data source=C:\Users\XXXX\XXXX\XXX\XXX.mdb")
con.Open()
Dim cmd As OleDbCommand = New OleDbCommand(queryStr, con)
Dim read As OleDbDataReader = cmd.ExecuteReader()
If queryStr = "" Then
Else
While read.Read()
Dim item As ListViewItem = New ListViewItem()
item.Text = CStr(read.Item("StudentId"))
item.SubItems.Add(read.Item("FirstName"))
item.SubItems.Add(read.Item("LastName"))
ListView2.Items.Add(item)
End While
End If
con.Close()
End Sub
andalso是一种很好的方法,首先测试它是否为“无”,然后检查值
if queryStr isnot nothing andalso queryStr.lenght > 0 then
除非满足第一个条件,否则不会对andalso之后的if语句的第二部分求值。因此,如果没有什么,就不会创建运行时错误 在数据库中仔细检查class_student.classid的数据类型。我遵循了您的指导,使用VarChar作为数据类型,但当我看到ID时,我认为是Long或Interger
Private Sub showdata1()
'Thanks to Lectere and Hans Passant
If ListView1.SelectedItems.Count = 0 OrElse String.IsNullOrEmpty(ListView1.SelectedItems(0).SubItems(0).Text) Then
Return
End If
'It is OK to use parameter names with OleDB and I think it makes the code clearer.
'Just remember that the additions to the parameters collection must be in the same
'order as they appear in the query.
Dim queryStr As String = "SELECT student.id,firstname,lastname
FROM Student
INNER JOIN Class_Student ON student.id = class_student.ID
WHERE class_student.classid= @ClassID;"
Using con As New OleDbConnection("provider=microsoft.jet.oledb.4.0;data source=C:\Users\XXXX\XXXX\XXX\XXX.mdb")
Using cmd As OleDbCommand = New OleDbCommand(queryStr, con)
cmd.Parameters.Add("@ClassID", OleDbType.VarChar).Value = ListView1.SelectedItems(0).SubItems(0).Text
con.Open()
Using read As OleDbDataReader = cmd.ExecuteReader()
While read.Read()
Dim item As New ListViewItem()
item.Text = CStr(read.Item("StudentId"))
item.SubItems.Add(CStr(read.Item("FirstName")))
item.SubItems.Add(CStr(read.Item("LastName")))
ListView1.Items.Add(item)
End While
End Using 'Close and dispose reader
End Using 'Close and dispose command
End Using 'Close and dispose connection
End Sub
使用参数可避免sql注入和格式错误。调试器所说的是
列表视图1.SelectedItems(0).子项(0).文本的值?该列表视图中不会有任何值。因此,您的查询打印如下:“…where class_student.classid=”使用参数<代码>…其中class_student.classid=?
然后,cmd.Parameters.AddWithValue(“?”,ListView1.SelectedItems(0).SubItems(0).Text)
ItemSelectionChanged事件是危险的,它也会在未选择任何项目的情况下触发,这将轰炸此代码。我们看不到它。总之,如果ListView1.SelectedItems.Count=0,则在该方法开始时退出Sub。是的,很好地使用了和,但在这种情况下查询语句不能是Nothing
,因为它只被清楚地分配了几行。好的,这种方法很有效。但是当您现在无法选择listview项目时。现在它会出错,而之前它会告诉你班上所有的学生……”没有为一个或多个必需参数指定值。'如果未选择任何内容,则只应返回调用代码。你犯了什么错误?好的,我是这个网站的新手。很抱歉,我如何发布程序的屏幕截图。您不需要屏幕截图,只需要错误的文本。发布的问题使用了ListView1。选择editems(0)。SubItems(0)。text
作为classID参数的值。现在您使用的是一个列表框
,当然它会改变一些事情。顺便说一句,您是否验证了数据库中classID列的数据类型。如果您确认这是一个列表框,我将编辑我的答案以反映这一点。