2010-11-10 25 views
0

J'ai deux ou trois questions que je dois exécuter un à un serveur lié et un pas comme çaDataReader déjà ouvert une erreur lors d'une tentative d'exécuter deux requêtes

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(' [email protected] + ', ''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() 

Pour autant que je peux dire de débogage du requêtes à la fois fonctionnent comme ils le devraient, mais je reçois l'erreur

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

Est-il possible d'exécuter deux requêtes dans deux DataReaders différentes. J'ai besoin de référencer plus tard chaque DataReader et de sélectionner les valeurs de chacun.

Répondre

1

Par défaut ne d'une manière possible d'avoir deux ouvert de SqlDataReader en même temps partageant le même objet SqlConnection. Vous devez fermer le premier (queryInvestorLookup) avant d'appeler le second (queryPasswordCheck). Ce serait bon du point de vue de la conception et des performances, car une recommandation pour .NET est que chaque ressource non managée (comme l'accès à la base de données) soit ouverte aussi tard que possible et fermée le plus tôt possible.

Une autre façon serait d'activer MARS mais afaik est seulement disponible pour Sql2005 et plus.

La troisième solution consisterait à utiliser le même SqlDataReader pour émettre les deux requêtes, puis à naviguer puis à utiliser la méthode NextResults().

+0

En fait, je crois que le support MARS a été introduit avec SQL 2005 –

+0

Vous avez raison! J'ai édité ma réponse. Merci! – tucaz

+0

Comment puis-je savoir sur quel serveur SQL je suis? –

0

Par défaut, vous ne pouvez pas avoir des DataReaders ouverts sur la même connexion. Vous pouvez donc obtenir un résultat, le placer dans un DataTable et obtenir l'autre résultat. Ou vous pouvez activer le MARS

ADO.NET Multiple Active Resut Sets

+0

Comment puis-je le 'bourrer' dans un DataTable? –

+0

Vous pouvez utiliser l'adaptateur pour placer automatiquement un DbDataReader dans un DataTable ou un DataSet. Essentiellement, vous créez une instance d'un adaptateur et lui assignez la SelectCommand (la commande que vous utilisez pour votre instruction select), puis appelez la méthode Fill sur l'adaptateur http://msdn.microsoft.com/en-us/library/system .data.common.dataadapter.aspx –

0

Si le fournisseur que vous utilisez le prend en charge, vous pouvez activer MARS (Multiple Active Result Sets) en ajoutant MultipleActiveResultSets = True à la chaîne de connexion que vous utilisez.

+0

Je l'ai fait mais me donne toujours la même erreur pas sûr pourquoi –