Sql 类型为'的首次机会例外;系统索引自动失效异常';发生在System.Data.dll中

Sql 类型为'的首次机会例外;系统索引自动失效异常';发生在System.Data.dll中,sql,vb.net,visual-studio-2010,ms-access-2007,Sql,Vb.net,Visual Studio 2010,Ms Access 2007,我刚刚将这段代码移动到一个新的子代码中,并尝试运行它,并按照tite中的说明获取异常 Public Sub LoadPanel(TableName As String) Debug.Print("LoadPanel:") 'name of module PushCallStack("LoadPanel") 'name of module Try Using dbConnection As New OleDbConnection(My.Settings.

我刚刚将这段代码移动到一个新的子代码中,并尝试运行它,并按照tite中的说明获取异常

Public Sub LoadPanel(TableName As String)

    Debug.Print("LoadPanel:") 'name of module
    PushCallStack("LoadPanel") 'name of module

    Try
        Using dbConnection As New OleDbConnection(My.Settings.SMSA_databaseConnectionString)
            dbConnection.Open()
            Debug.Print("   dbConnection Success")

            Dim sqlcommand As String
            sqlcommand = "SELECT " & TableName & ".[PanelName] FROM  " & TableName & " WHERE (((" & TableName & ".[Owner])=" & CurrentClientID & ")) OR (((" & TableName & ".[Admin1])=" & CurrentClientID & ")) OR (((" & TableName & ".[Admin2])=" & CurrentClientID & ")) OR (((" & TableName & ".[Admin3])=" & CurrentClientID & ")) OR (((" & TableName & ".[Admin4])=" & CurrentClientID & "));"
            Debug.Print("   sqlcommand = " & sqlcommand)

            Dim getSomeData As New OleDbCommand(sqlcommand, dbConnection)
            With getSomeData
                .Parameters.AddWithValue("@variableName", "variableValue")
                Debug.Print("   Executing: getSomeData")
            End With
            Debug.Print("   Success: getSomeData")

            Debug.Print("   Try: DataReader")
            Using dataReader As OleDbDataReader = getSomeData.ExecuteReader
                Do While dataReader.Read
                    Dashboard_Client.ComboBox_PanelChoice.Items.Add(dataReader("PanelIP"))
                Loop
            End Using
        End Using

        PopCallStack() 'do not remove
    Catch ex As Exception
        GlobalErrHandler()
    End Try

    Debug.Print("LoadPanel End")
从调试面板:

LoadPanel:
dbConnection Success
Executing: getSomeData
Success: getSomeData
Try: DataReader
A first chance exception of type 'System.IndexOutOfRangeException' occurred in System.Data.dll
是否有办法解决此错误或进行变通以保留功能

谢谢。

在这行

  Dashboard_Client.ComboBox_PanelChoice.Items.Add(dataReader("PanelIP"))
您正试图读取名为
PanelIP
的字段,但您的查询无法检索该字段。
这会导致
索引自动失效异常
,因为在内部,读卡器会尝试将该名称(PanelIP)转换为检索字段列表中的一个位置,当该名称不存在时,则假定该位置为-1。当然,-1在检索的字段列表中是无效的索引

说,让我们看看你的查询以及如何修复它。 我希望TableName变量在您的严格控制之下,因为用户可以传递该变量中的任何内容,这可能导致一种称为Sql注入的危险情况

需要修复的是缺少的字段,并将currentClientID的每个字符串串联更改为适当的参数

Dim sqlcommand = "SELECT " & TableName & ".[PanelName] " & _ 
                             TableName & ".[PanelID] " & _
                 " FROM  " & TableName & _ 
                 " WHERE (" & TableName & ".[Owner])=@ownerID) " & _
                 " OR    (" & TableName & ".[Admin1])=@clientID1) " & _
                 " OR    (" & TableName & ".[Admin2])=@clientID2) " & _   
                 " OR    (" & TableName & ".[Admin3])=@clientID3) " & _ 
                 " OR    (" & TableName & ".[Admin4])=@clientID4)"

Try
    Using dbConnection As New OleDbConnection(.....)
    Using getSomeData As New OleDbCommand(sqlcommand, dbConnection)
        dbConnection.Open()
        With getSomeData
            ' In oledb you need to add a parameter for every placeholder
            ' because the parameters are not recognized by name but by position
            .Parameters.Add("@ownerID", OleDbType.Integer).Value = currentClientID
            .Parameters.Add("@clientID1", OleDbType.Integer).Value = currentClientID
            .Parameters.Add("@clientID2", OleDbType.Integer).Value = currentClientID
            .Parameters.Add("@clientID3", OleDbType.Integer).Value = currentClientID
            .Parameters.Add("@clientID4", OleDbType.Integer).Value = currentClientID
        End With
        Using dataReader As OleDbDataReader = getSomeData.ExecuteReader
            Do While dataReader.Read
                Dashboard_Client.ComboBox_PanelChoice.Items.Add(dataReader("PanelIP"))
            Loop
        End Using
    End Using
    End Using

    PopCallStack()
Catch ex As Exception
    GlobalErrHandler()
End Try

遗憾的是,无法同时参数化TableName,因为参数只能用于值,而不能用于字段或表名

查询中没有
variableName
参数,您试图添加一个参数的值。这会导致
indexootfrangeexception

您可以包含该参数,也可以删除该参数

.Parameters.AddWithValue("@variableName", "variableValue")

你能用
while
循环而不是
do while
检查吗?刚刚尝试过,不幸地得到了同样的错误。谢谢,开发人员。查询中的
variableName
parametr在哪里\我找不到,但您添加了一个参数??如果dataReader为emptySorry,do while可能会抛出错误,但这不会导致OP提到的错误。它只是被忽略。然而,我同意,在这个问题的背景下,它没有立足之地