Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net错误(&Q)';InvalidArgument=的值';0';对';无效;索引';。参数名称:index'&引用;_Vb.net_Ms Access - Fatal编程技术网

Vb.net错误(&Q)';InvalidArgument=的值';0';对';无效;索引';。参数名称:index'&引用;

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

我知道为什么会出现错误“'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.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列的数据类型。如果您确认这是一个列表框,我将编辑我的答案以反映这一点。