VB. NET - SQL Запрос сервера завершается неудачно с сообщением «уже существует связанный открытый носитель данных» - PullRequest
1 голос
/ 27 мая 2020

У меня есть следующий код:

  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: выберите * из настроек, где setting = ' Actorid '- System.InvalidOperationException: уже существует открытый DataReader, связанный с этой командой, который должен быть закрыт первым.

в System.Data.SqlClient.SqlInternalConnectionTds.ValidateConnectionForExecute (команда SqlCommand)
в System.Data .SqlClient.SqlConnection.ValidateConnectionForExecute (метод String, команда SqlCommand)
в System.Data.SqlClient.SqlCommand.ValidateCommand (метод String, логический асинхронный c)
в System.Data.SqlClientRunCommand. CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String метод, завершение TaskCompletionSource`1, тайм-аут Int32, Task & task, Boolean & usedCache, Boolean asyncWrite, Boolean inRetry)
в System.Data.SqlBehavior (CommandBehavior (CommandBehavior) ру nBehavior, Boolean returnStream, String метод)
в System.Data.SqlClient.SqlCommand.ExecuteReader (поведение CommandBehavior, метод String)
в System.Data.SqlClient.SqlCommand.ExecuteDbDataReader (CommandBehavior * в поведении системы) * 1015 .Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader (поведение CommandBehavior)
в System.Data.Common.DbDataAdapter.FillInternal (набор данных DataSet, таблицы данных DataTable [], startRecord Int32, Int32 maxRecords, String srcTand команда, поведение CommandBehavior)
в System.Data.Common.DbDataAdapter.Fill (DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, команда IDbCommand, поведение CommandBehavior)
в System.Data.Common.DbDataAdapter.Fill (DataSet dataSet)
в DataCollector.Form1.executequery (строковый запрос, логическая отладка)

уже должен быть закрыт открытый загрузчик данных.

Я не понимаю, что читатель вызывает это .. где в этом коде считыватель данных? Кроме того, почему это появляется только иногда?

1 Ответ

3 голосов
/ 27 мая 2020

Всегда создавайте новые экземпляры для 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
...