Anjani Rawat Ответов: 1

Ошибка "с этой командой уже связан открытый datareader, который должен быть закрыт первым."


Как мне преодолеть эту ошибку, которая всегда возникает во время нескольких обращений к одному и тому же процессу "с этой командой уже связан открытый считыватель данных, который должен быть закрыт первым."

Любая помощь будет оценена по достоинству.

заранее спасибо

Что я уже пробовал:

Эта ошибка возникает в нескольких местах моего проекта.

Это мой код:
Shared Function GetTable(ByVal SqlString As String) As DataSet
Dim ds As New DataSet
If con.State = ConnectionState.Closed Then con.Open()
Using con
Dim da As New SqlClient.SqlDataAdapter(SqlString, con)
da.SelectCommand.CommandTimeout = 5000
da.Fill(ds)
End Using
Return ds

CPallini

Тогда закрой проклятый DataReader.
(Я не могу дать лучшего ответа, потому что вы дали мне плохую информацию).

Anjani Rawat

Я не использовал datareader в своем проекте, я использовал dataset, но эта ошибка возникает.

Ralf Meier

И какую помощь вы хотите получить без какой-либо информации о вашем коде-конструкции ?

Anjani Rawat

Это мой код:

Общий Метод Gettable Функции(Типа Sqlstring Бывал Как Строка), А Массив Данных
Dim ds как новый набор данных
Если Кон.Состояние = ConnectionState.Закрыто, потом кон.Открыть()
Используя кон
Dim da как новый SqlClient.SqlDataAdapter(SqlString, con)
да.Команды selectcommand.CommandTimeout = 5000
да.Заполнить(ДС)
Конец Использования
Возврат ДС

Ralf Meier

Так... почему бы вам не закрыть соединение перед выходом из функции ?

Anjani Rawat

Пожалуйста, посмотрите код, который я уже закрыл, как "End Using" и начните соединение как " Using con"

Ralf Meier

если 'помощью' закрывает соединение - зачем ты открыл это явный перед использованием кон' ?

1 Ответов

Рейтинг:
2

OriginalGriff

Когда вы открываете DataReader, он" блокирует " соединение до тех пор, пока считыватель не будет закрыт.
Где - то в вашем коде вы создали DataReader из команды SQL и запустили его чтение с помощью того же объекта connection-и он будет оставаться активным до тех пор, пока читатель или объект Connection не закроется, даже если метод, который его использует, закончит выполнение.

Посмотрите на свой код, найдите везде, где вы используете соединение, и убедитесь, что вы закрываете и удаляете все, что используете: SqlCommand, SqlDataAdapter, SqlDataReader.

Лучший способ сделать это-удалить объект global connection и создавать новые соединения каждый раз, когда вы хотите его использовать: SqlConnections-это дефицитный ресурс, и вы не должны удерживать их, особенно если они открыты, так как они могут блокировать доступ других пользователей к БД.