DataReader уже открывает ошибку при попытке запустить два запроса - PullRequest
0 голосов
/ 10 ноября 2010

У меня есть пара запросов, которые мне нужны для запуска одного из них на связанном сервере, и один не такой, как этот

    Dim InvestorLookup As String = "DECLARE @investor varchar(10), @linkedserver varchar(25), @sql varchar(1000) "
    InvestorLookup += "SELECT @investor = '" & investor & "', @linkedserver = '" & db & "', "
    InvestorLookup += "@sql = 'SELECT * FROM OPENQUERY(' +@linkedserver + ', ''SELECT * FROM db WHERE investor = ' + @investor + ' '')' EXEC(@sql)"
    Dim queryInvestorLookup  As SqlCommand = New SqlCommand(InvestorLookup , conn)

    Dim BondNoDR As SqlDataReader = queryInvestorLookup.ExecuteReader()

    Dim PasswordCheck As String = "DECLARE @investor varchar(10), @password varchar(20), @linkedserver varchar(25), @sql varchar(1000) "
    PasswordCheck += "SELECT @investor = '" + investor + "', @password = '" + password + "', @server = '" + db2 + "', "
    PasswordCheck += "@sql = 'SELECT * FROM @server WHERE investor = @investor AND password = ' + @password + ' '' EXEC(@sql)"
    Dim queryPasswordCheck As SqlCommand = New SqlCommand(PasswordCheck, conn)

    Dim PasswordDR As SqlDataReader = queryPasswordCheck.ExecuteReader()

Насколько я могу судить по отладке, оба запроса выполняются так, как должны, но я получаю ошибку

There is already an open DataReader associated with this Command which must be closed first.

Возможно ли выполнить два запроса в двух разных DataReaders. Мне нужно позже ссылаться на каждый DataReader и выбирать значения из каждого.

Ответы [ 3 ]

1 голос
/ 10 ноября 2010

По умолчанию невозможно одновременно открыть два SqlDataReader, совместно использующих один и тот же объект SqlConnection. Вы должны закрыть первый (queryInvestorLookup) перед вызовом второго (queryPasswordCheck).

Это было бы хорошо с точки зрения дизайна и производительности, поскольку для .NET рекомендуется, чтобы каждый неуправляемый ресурс (например, доступ к базе данных) открывался как можно позже и закрывался как можно раньше.

Другой способ - включить MARS, но на самом деле он доступен только для Sql2005 и выше.

Третье решение - использовать один и тот же SqlDataReader для выдачи двух запросов, а затем выполнить навигацию и затем использовать метод NextResults ().

0 голосов
/ 10 ноября 2010

Если используемый вами провайдер поддерживает его, вы можете включить MARS (Multiple Active Result Set), добавив MultipleActiveResultSets = True к используемой строке подключения.

0 голосов
/ 10 ноября 2010

По умолчанию вам не нужно открывать dataReaders по одному и тому же соединению.Таким образом, вы можете получить один результат, поместить его в DataTable, а затем получить другой результат.Или вы можете включить MARS

ADO.NET Несколько активных наборов результатов

...