C# 当读卡器关闭时调用Read的尝试无效。ExecuteReader以获取多个表结果
我尝试使用SqlDataReader返回(DataTable的)列表,而不是填充数据集。在读卡器正确检索了4个表之后,出现了“当读卡器关闭时调用Read的尝试无效”错误。这是我正在使用的函数C# 当读卡器关闭时调用Read的尝试无效。ExecuteReader以获取多个表结果,c#,.net,vb.net,sqldatareader,C#,.net,Vb.net,Sqldatareader,我尝试使用SqlDataReader返回(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) D
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()处获得错误
如果没有NextResut,则不需要测试HasRows 在C#
最后一段时间将导致它立即离开
using (IDataReader reader = ...)
{
do
{
if (reader.HasRows())
{
while (reader.Read())
{
....
}
}
} while (reader.NextResult())
}
当我使用它时,你应该使用它,它跳过我结果中的表。它从我的结果中返回表0和表2。。因此,我无法从结果集中获取表1和表3。请尝试DataTableReader,而不是DataReader DataRow。当我以这种方式尝试时,在同一个地方出现了同样的错误。在我的示例代码中,在我的“ds”对象中有4个表,然后在dr.Read()处抛出错误。我将我的代码作为编辑2发布在主帖子中。谢谢你的回复。
using (IDataReader reader = ...)
{
do
{
if (reader.HasRows())
{
while (reader.Read())
{
....
}
}
} while (reader.NextResult())
}