почему я не могу использовать два устройства чтения данных в одной процедуре?

Вы можете объяснить мне, почему я не могу использовать два устройства чтения данных в процедуре?

Вот пример кода:

Private Sub  Do_Execute()

  Dim conx as SqlConnection
  Dim cmd1 as SqlCommand
  Dim cmd2 as SqlCommand

  Dim drd1 as SqlDataReader
  Dim drd2 as SqlDataReader

  conx = new SqlConnection("connection string")
  conx.Open()

     cmd1 = new SqlCommand("SELECT * FROM Category" , conx)
     drd1 = cmd1.ExecuteReader()

     While (drd1.Read())
     {
        Reading Data From drd1
     }

     cmd2 = new SqlCommand("SELECT * FROM Stock" , conx)
     drd2 = cmd2.ExecuteReader()

     While (drd2.Read())
     {
        Reading Data From drd2
     }

End Sub

Когда я выполняю эту программу, она выдает сообщение об исключении: «Уже существует открытый DataReader, связанный с этой командой, которую нужно сначала закрыть!»

Когда я закрыл drd1 до инициализации drd2. Оно работает.

Почему я не могу использовать приведенный выше код? Пожалуйста, объясните мне. Заранее спасибо!


person RedsDevils    schedule 23.11.2009    source источник
comment
ВСЕГДА закрывайте / удаляйте ваши SqlDataReaders. Вы должны сделать то же самое для своего SqlConnection   -  person Brannon    schedule 23.11.2009
comment
Да, Браннон! Спасибо за советы! Я закрываю все объекты подключения и чтения в блоке finally.   -  person RedsDevils    schedule 23.11.2009


Ответы (3)


Я не пробовал этого раньше, но это должно быть возможно.

Прочтите Использование нескольких наборов активных результатов и
Включение нескольких наборов активных результатов в MSDN

Обратите внимание, что это для SQL2005 и выше.

Выдержка из одной из статей:

Для доступа к нескольким наборам результатов в предыдущих версиях SQL Server с использованием объектов SqlDataReader необходимо использовать отдельный объект SqlConnection с каждым объектом SqlCommand.

person o.k.w    schedule 23.11.2009
comment
Спасибо ! Теперь я могу использовать его, включив режим MARS в моем соединении. - person RedsDevils; 23.11.2009

Это потому, что вы фактически используете одно и то же соединение.

Вам либо нужно:
1) использовать разные соединения для каждого SqlCommand, что было оригинальным способом, которым вы это делали.

or

2) используйте MARS (несколько активных наборов результатов), как описано здесь

person AdaTheDev    schedule 23.11.2009
comment
Я использую твой второй способ! Спасибо, теперь все работает! :) большое вам спасибо! Если я использую разные подключения, как насчет производительности между использованием разных подключений и использованием MARS? ты можешь мне ответить? - person RedsDevils; 23.11.2009
comment
Учитывая, что для этой цели был введен MARS, это как раз то, что нужно. При подходе с несколькими подключениями для каждого подключения потребуются ресурсы сервера db, поэтому для каждого подключения есть накладные расходы. Также см. stackoverflow.com/questions/510899/ - person AdaTheDev; 23.11.2009

В этой статье объясняется, в чем проблема, и представляет решение, если вы используете SQL Server. Решение называется MARS, или несколько наборов активных записей, и доступно в SQL Server 2005 и более поздних версиях.

person Pete OHanlon    schedule 23.11.2009
comment
Спасибо ! Ваш ответ пригодится и мне на вопрос! - person RedsDevils; 23.11.2009