我有以下代码。
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: 已经有一个打开的DataReader与这个命令相关联,必须先关闭它。
在 System.Data.SqlClient.SqlInternalConnectionTds.ValidateConnectionForExecute(SqlCommand command) 在 System.Data.SqlClient.SqlConnection. 在System.Data.SqlClient.SqlCommand.ValidateConnectionForExecute(String method,SqlCommand command)处,在System.Data.SqlClient.SqlCommand.ValidateCommand(String method,Boolean async)处。 RunExecuteReader(CommandBehavior cmdBehavior,RunBehavior runBehavior,Boolean returnStream,String method,TaskCompletionSource`1 completion,Int32 timeout,Task& task,Boolean& usedCache,Boolean asyncWrite,Boolean inRetry)在System.Data.SqlClient.SqlCommand.ValidateCommand(String method,Boolean async)。 Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior,RunBehavior runBehavior,Boolean returnStream,String method)在System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior,RunBehavior runBehavior,Boolean returnStream,String method)处。 FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) 在 System.Data.Common.DbDataAdapter. 在 System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) 在 DataCollector.Form1.executequery(String query, Boolean debug).
已经打开的数据读取器必须先关闭。
我不明白是什么阅读器造成的......在这段代码中,数据阅读器在哪里?另外,为什么这只是有时出现?
总是创建新的实例 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