读取器关闭时无效尝试调用Read。 ExecuteReader获取多个表结果

时间:2013-09-23 17:26:22

标签: c# .net vb.net sqldatareader

我正在尝试使用SqlDataReader返回List(Of DataTable)而不是填充数据集。在正确检索4个表后,我收到“读取器关闭时调用Read的无效尝试”错误。这是我正在使用的功能

Private Function ExecuteDS(ByVal SPName As String, ByVal ParamList As List(Of System.Data.SqlClient.SqlParameter)) As List(Of System.Data.DataTable)
    Dim ds As New List(Of System.Data.DataTable)
    Dim dbConStr As Database  
    dbConStr = New Database()
    Using con As New System.Data.SqlClient.SqlConnection(dbConStr.ReturnString)
        Dim cmd As New System.Data.SqlClient.SqlCommand(CStr(SPName), con)
        cmd.CommandType = System.Data.CommandType.StoredProcedure
        cmd.CommandTimeout = 30
        For Each p As System.Data.SqlClient.SqlParameter In ParamList
            cmd.Parameters.Add(p)
        Next

        con.Open()
        Using dr As System.Data.SqlClient.SqlDataReader = cmd.ExecuteReader
            If dr.HasRows Then
                Do While dr.Read()
                    Dim dt As New System.Data.DataTable
                    dt.Load(dr)
                    ds.Add(dt)
                Loop
            End If
        End Using

        con.Close()
    End Using
    Return ds
End Function

错误发生在dr.Read()。它应该返回4个表但是在它获得第4个之后,它仍然会尝试执行dr.Read()并抛出错误而不是仅仅正确地退出循环。任何见解,我将不胜感激,谢谢。

编辑:还尝试使用dr.NextResult()并仍然在同一行收到错误。

            Using dr As System.Data.SqlClient.SqlDataReader = cmd.ExecuteReader
                Do While dr.HasRows
                    Do While dr.Read()
                        Dim dt As New System.Data.DataTable
                        dt.Load(dr)
                        ds.Add(dt)
                    Loop
                    dr.NextResult()
                Loop
            End Using

编辑2:在一个IF声明中与dr.HasRows一起尝试,仍然在dr.Read()...

中得到错误
            Using dr As System.Data.SqlClient.SqlDataReader = cmd.ExecuteReader
                Do
                    If dr.HasRows Then
                        While dr.Read()
                            Dim dt As New System.Data.DataTable
                            dt.Load(dr)
                            ds.Add(dt)
                        End While
                    End If
                Loop While dr.NextResult()
            End Using

1 个答案:

答案 0 :(得分:0)

如果没有NextResut

,则无需测试HasRows

在C#中 最后一次将导致它立即离开。

using (IDataReader reader = ...) 
{ 
  do 
  {
    if (reader.HasRows())
    {
       while (reader.Read()) 
       { 
           ....
       }
    }
  } while (reader.NextResult())
}