Обнаружение завершения метода заполнения SqlDataAdapter

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

There is already an open DataReader associated with this Command...

Мне интересно, существует ли способ узнать, когда метод заполнения все еще выполняется?

Я слышал, что SqlDataAdapter использует DataReader внутри.

Может получить это DataReader?


person cristian her    schedule 11.04.2020    source источник


Ответы (1)


"У меня есть глобальный SqlDataAdapter" — это ваша ошибка. Избавьтесь от этого понятия и создавайте DataAdapter всякий раз, когда вы хотите его использовать. Поместите его в оператор using, чтобы не забыть удалить его.

Кроме того, если вы кешируете соединения и открываете и закрываете их вручную, этого тоже не делайте — просто дайте адаптеру (который вы делаете на месте) строку SQL и строку подключения и позвольте ему создавать объекты подключения и команды. Единственный случай, когда вы можете захотеть создать соединение и открыть его самостоятельно, — это если у вас есть много операций, которые нужно выполнить последовательно с использованием разных адаптеров, возможно, как часть транзакции. Не забывайте, что открытие и закрытие соединения не обязательно создает TCP-соединение с базой данных (медленное) — это аренда и возврат текущего подключенного и пригодного для использования соединения из пула соединений и является тривиальной операцией.

Чем больше вы пытаетесь управлять этим на микроуровне, тем хуже это будет становиться, и попытки покачиваться, обнаруживая это и ожидая этого, а) не нужны, б) хакерский беспорядок, чтобы попытаться обойти угол, в который вы себя загнали, c ) приведет к некачественному пользовательскому интерфейсу.

person Caius Jard    schedule 11.04.2020
comment
Я объявил локальный SqlDataAdapter, но ошибка все равно возникает - person cristian her; 11.04.2020
comment
Да, я установил свойство SqlDataAdapter SelectCommand, но с SqlDataAdapter, объявленным внутри функции. - person cristian her; 11.04.2020
comment
И ошибка говорит, что у этой команды уже есть открытый считыватель данных... - person Caius Jard; 11.04.2020
comment
Итак, возвращаясь к тому моменту, когда я упомянул, создайте новый адаптер данных, дайте ему строку SQL и строку подключения и позвольте ему выполнить команду и соединение - если вы это сделаете, вы не получите ту же команду, которая используется в нескольких местах и ​​уже имея открытый считыватель данных - person Caius Jard; 11.04.2020
comment
Мне кажется, что сообщение об ошибке неверно, потому что я использую разные объекты команд. Возможно, соединение не поддерживает несколько команд одновременно. - person cristian her; 12.04.2020