没有数据时无效的读取错误

时间:2013-05-29 13:32:41

标签: asp.net vb.net

我有一个函数,其唯一目的是在按下按钮时获取一些数据,并且多次调用它。这是功能代码:

 Function GetData2(ByVal clientNo As Integer) As List(Of SocioInfo)


    Dim theResults2 = New List(Of SocioInfo)
    Dim connStr = "Data Source=localhost;Initial Catalog=testdb;Integrated Security=True;MultipleActiveResultSets=true"


    Using conn = New SqlConnection(connStr)

        Dim sql = "SELECT  [FirstName], [LastName] FROM [CustInfo] Where ([NumCuenta] = @SocioNum)"
        Dim sql2 = "SELECT [AcctName], [AcctNum], [NewAcct], [Balance] From [ACCT_NEW] Where ([AcctNum] =  @SocioNum)"
        Dim sqlCmd = New SqlCommand(sql, conn)
        Dim sqlCmd2 = New SqlCommand(sql2, conn)
        sqlCmd.Parameters.AddWithValue("@SocioNum", CDbl(txtInput.Text))
        sqlCmd2.Parameters.AddWithValue("@SocioNum", CDbl(txtInput.Text))



        conn.Open()

        Dim rdr = sqlCmd.ExecuteReader
        Dim rdr2 = sqlCmd2.ExecuteReader

        While rdr.Read
            theResults2.Add(New SocioInfo With {
                           .Nombre = rdr.GetString(0),
                           .LastName = rdr.GetString(1)
})

        End While
        While rdr2.Read
            theResults2.Add(New SocioInfo With {
                                         .CuentaName = rdr.GetString(0),
                                          .AcctNum = rdr.GetValue(1),
                                          .AcctFull = rdr2.GetValue(2),
                                         .Balance = rdr2.GetValue(3)
                        })


        End While

    End Using

    Return theResults2

End Function

我不是100%确定这是否是最好的方法(基本上需要从两个不同的表中获取数据)。事情是,虽然Rdr没有向我显示任何错误,Rdr2只是吹在脸上。例外是:

Invalid attempt to read when no data is present.

1 个答案:

答案 0 :(得分:2)

在第二个循环中,您尝试使用第一个SqlDataReader,但这是不可能的,因为第一个循环已经到达输入数据的末尾。

如果需要在两个表之间连接数据,更好的方法是使用JOIN运算符只使用一个查询。假设CustInfo表中的每个客户在ACCT_NEW表中都有一个帐户

,此查询可以正常工作
Dim sql = "SELECT  c.FirstName, c.LastName, a.AcctName, a.AcctNum, a.NewAcct, a.Balance " & _
          "FROM CustInfo c INNER JOIN ACCT_NEW a ON a.AcctNum = c.NumCuenta "  & _
          "WHERE NumCuenta = @SocioNum "


Using conn = New SqlConnection(connStr)

    Dim sqlCmd = New SqlCommand(sql, conn)
    sqlCmd.Parameters.AddWithValue("@SocioNum", CDbl(txtInput.Text))
    conn.Open()
    Dim rdr = sqlCmd.ExecuteReader

    While rdr.Read
        theResults2.Add(New SocioInfo 
        With {
                       .Nombre = rdr.GetString(0),
                       .LastName = rdr.GetString(1)
                       .CuentaName = rdr.GetString(2),
                       .AcctNum = rdr.GetValue(3),
                       .AcctFull = rdr.GetValue(4),
                       .Balance = rdr.GetValue(5)

       })
   End While

结束使用