VB.NET - SQL Server查询失败,"已经有一个开放的datareader关联"。

问题描述 投票:0回答:1

我有以下代码。

  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).

已经打开的数据读取器必须先关闭。

我不明白是什么阅读器造成的......在这段代码中,数据阅读器在哪里?另外,为什么这只是有时出现?

sql-server vb.net datareader
1个回答
3
投票

总是创建新的实例 SqlConnectionSqlCommand

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
© www.soinside.com 2019 - 2024. All rights reserved.