vb.net 我从下面的代码中收到错误“位置 0 没有行”

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/18402045/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-17 14:46:10  来源:igfitidea点击:

I am getting Error "There is no row at position 0" from code below

vb.net

提问by Sibusiso Dlamini

Private Sub Button3_Click (ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click

    If txtID.Text = "" Then
        MsgBox("Please input a valid Employee code to load a corresponding record", MsgBoxStyle.Information)
    Else
        dbProvider = "Provider=Microsoft.Ace.OLEDB.12.0;"
        dbSource = "Data Source = C:\Users\Blessing\Documents\IBCARIP.accdb;Persist Security Info=False"
        con.ConnectionString = dbProvider & dbSource
        con.Open()
        sql = "select * from Calculator where " _
            & "EmpCode = " & " '" & txtID.Text & "'"

        da = New OleDb.OleDbDataAdapter(sql, con)
        da.Fill(ds, "IBCARIP")
        lblSAI.Text = ds.Tables("IBCARIP").Rows(inc).Item("SName") & ds.Tables("IBCARIP").Rows(inc).Item("FName")
        lblRate.Text = ds.Tables("IBCARIP").Rows(inc).Item("NRate")
        lblOT.Text = ds.Tables("IBCARIP").Rows(inc).Item("OTRate")
        lblBnk.Text = ds.Tables("IBCARIP").Rows(inc).Item("BName") & ".." & ds.Tables("IBCARIP").Rows(inc).Item("ANumber") & ".." & ds.Tables("IBCARIP").Rows(inc).Item("AType")
        con.Close()
        ds.Tables("IBCARIP").DataSet.Clear()
        MaxRows = ds.Tables("IBCARIP").Rows.Count
        'inc = 0
    End If
End Sub

The message comes when i enter a wrong or non-existent Employee code in txtID.text

当我在 txtID.text 中输入错误或不存在的员工代码时出现该消息

how can i solve tha problem

我该如何解决这个问题

回答by Dhaval

try as below

尝试如下

you should always check dataset table and rows count

您应该始终检查数据集表和行数

i am not much familiar with vb .net(i am in C#) but i think following is good to go

我对 vb .net 不太熟悉(我在 C# 中)但我认为以下是好的

    If txtID.Text = "" Then
        MsgBox("Please input a valid Employee code to load a corresponding record", MsgBoxStyle.Information)
    Else
        dbProvider = "Provider=Microsoft.Ace.OLEDB.12.0;"
        dbSource = "Data Source = C:\Users\Blessing\Documents\IBCARIP.accdb;Persist Security Info=False"
        con.ConnectionString = dbProvider & dbSource
        con.Open()
        sql = "select * from Calculator where " _
            & "EmpCode = " & " '" & txtID.Text & "'"

        da = New OleDb.OleDbDataAdapter(sql, con)
        da.Fill(ds, "IBCARIP")
        If ds.Tables.Count > 0 AndAlso ds.Tables("IBCARIP").Rows.Count >0 Then
            lblSAI.Text = ds.Tables("IBCARIP").Rows(inc).Item("SName") & ds.Tables("IBCARIP").Rows(inc).Item("FName")
            lblRate.Text = ds.Tables("IBCARIP").Rows(inc).Item("NRate")
            lblOT.Text = ds.Tables("IBCARIP").Rows(inc).Item("OTRate")
            lblBnk.Text = ds.Tables("IBCARIP").Rows(inc).Item("BName") & ".." &                 ds.Tables("IBCARIP").Rows(inc).Item("ANumber") & ".." & ds.Tables("IBCARIP").Rows(inc).Item("AType")
            con.Close()
            ds.Tables("IBCARIP").DataSet.Clear()
            MaxRows = ds.Tables("IBCARIP").Rows.Count
            'inc = 0
        End if  
    End If
End Sub

回答by Tim Schmelter

First the most important: you are open for SQL-Injection since you are not using sql-parameters but concatenating the query with user input.

首先最重要的是:您对 SQL 注入开放,因为您没有使用 sql 参数,而是将查询与用户输入连接起来。

The reason for the error is that you are trying to access the a DataRowin the DataTablewithout checking if there is at least one. But you are accessing the row with index inc, maybe the table does not contain so many rows. Why do you use a variable at all here?

错误的原因是您试图访问 aDataRow中的 aDataTable而不检查是否至少有一个。但是您正在访问带有 index 的行inc,也许该表不包含这么多行。你为什么在这里使用一个变量?

da.Fill(ds, "IBCARIP")
If ds.Tables("IBCARIP").Rows.Count = 0 Then Return ' or something else

' here you can safely access the first row...

Here the long version with parameters:

这里是带参数的长版本:

Using con = New OleDbConnection(dbProvider & dbSource)
    Dim sql = "select * from Calculator where EmpCode=?"
    Using da = New OleDbDataAdapter(sql, con)
        da.SelectCommand.Parameters.AddWithValue("@EmpCode", txtID.Text)
        da.Fill(ds, "IBCARIP")
        If ds.Tables("").Rows.Count > 0 Then
            Dim row = ds.Tables("IBCARIP").Rows(0)
            Dim SName = row.Field(Of String)("SName")
            Dim FName = row.Field(Of String)("FName")
            Dim sai = String.Format("{0}{1}", SName, FName)
            lblSAI.Text = sai
            ' ... '
        End If
    End Using
End Using