我正在尝试使用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
答案 0 :(得分:0)
如果没有NextResut
,则无需测试HasRows在C#中 最后一次将导致它立即离开。
using (IDataReader reader = ...)
{
do
{
if (reader.HasRows())
{
while (reader.Read())
{
....
}
}
} while (reader.NextResult())
}