VB.NET - SQL 服务器查询失败 "there is already an open datareader associated"
VB.NET - SQL Server query fails with "there is already an open datareader associated"
我有以下代码:
Public Function executequery(ByVal query As String, Optional debug As Boolean = False)
Try
If debug Then
Console.WriteLine(query)
End If
Dim da As New SqlDataAdapter
Dim dtset As New DataSet
Cmd.CommandText = query
da.SelectCommand = Cmd
da.Fill(dtset)
dtset.Tables.Add()
Return dtset.Tables(0)
Catch ex As Exception
logstring = "HH exq err: " & query & " - " & ex.ToString
End Try
End Function
此功能有时会因以下错误而失败:
HH exq err: select * from Settings where setting = 'actorid' - System.InvalidOperationException: There is already an open DataReader associated with this Command which must be closed first.
at System.Data.SqlClient.SqlInternalConnectionTds.ValidateConnectionForExecute(SqlCommand command)
at System.Data.SqlClient.SqlConnection.ValidateConnectionForExecute(String method, SqlCommand command)
at System.Data.SqlClient.SqlCommand.ValidateCommand(String method, Boolean async)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean& usedCache, Boolean asyncWrite, Boolean inRetry)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
at System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet)
at DataCollector.Form1.executequery(String query, Boolean debug)
already an open datareader must be closed first.
我不明白 reader 是什么原因造成的。这段代码中的数据 reader 在哪里?还有,为什么这个只是偶尔出现?
始终为 SqlConnection
和 SqlCommand
创建新实例
Private Function GetData(query As String) As DataTable
Using connection As New SqlConnection(connectionString),
adapter As New SqlDataAdapter(query, connection)
Dim table As New DataTable()
adapter.Fill(table)
Return table
End Using
End Function
我有以下代码:
Public Function executequery(ByVal query As String, Optional debug As Boolean = False)
Try
If debug Then
Console.WriteLine(query)
End If
Dim da As New SqlDataAdapter
Dim dtset As New DataSet
Cmd.CommandText = query
da.SelectCommand = Cmd
da.Fill(dtset)
dtset.Tables.Add()
Return dtset.Tables(0)
Catch ex As Exception
logstring = "HH exq err: " & query & " - " & ex.ToString
End Try
End Function
此功能有时会因以下错误而失败:
HH exq err: select * from Settings where setting = 'actorid' - System.InvalidOperationException: There is already an open DataReader associated with this Command which must be closed first.
at System.Data.SqlClient.SqlInternalConnectionTds.ValidateConnectionForExecute(SqlCommand command)
at System.Data.SqlClient.SqlConnection.ValidateConnectionForExecute(String method, SqlCommand command)
at System.Data.SqlClient.SqlCommand.ValidateCommand(String method, Boolean async)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean& usedCache, Boolean asyncWrite, Boolean inRetry)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
at System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet)
at DataCollector.Form1.executequery(String query, Boolean debug)already an open datareader must be closed first.
我不明白 reader 是什么原因造成的。这段代码中的数据 reader 在哪里?还有,为什么这个只是偶尔出现?
始终为 SqlConnection
和 SqlCommand
Private Function GetData(query As String) As DataTable
Using connection As New SqlConnection(connectionString),
adapter As New SqlDataAdapter(query, connection)
Dim table As New DataTable()
adapter.Fill(table)
Return table
End Using
End Function