[Résolu][C# .net] SqlDataReader ne contenant rien => exception

SqlDataReader ne contenant rien => exception [Résolu][C# .net] - C#/.NET managed - Programmation

Marsh Posté le 16-07-2006 à 15:10:20    

Bonjour à tous :)
 
Je fais une requête toute simple qui ne retourne aucune ligne.  

Code :
  1. string command = "select * from member";
  2. using (SqlDataReader reader = DbManager.SelectAndReturn(command))
  3. {
  4.   if (reader.HasRows)
  5.   {
  6.     reader.Read();
  7.   }
  8. }


Le problème, c'est que reader.HasRows retourne une InvalidOperationException, comme si ça tentait de lire le premier enregistrement.  
Faut-il utiliser qqch d'autre que reader.HasRows ??
Merci de votre aide :)

Message cité 1 fois
Message édité par Roodie le 16-07-2006 à 17:01:41
Reply

Marsh Posté le 16-07-2006 à 15:10:20   

Reply

Marsh Posté le 16-07-2006 à 15:21:49    

Roodie a écrit :

Code :
  1. DbManager.SelectAndReturn(command))




c'est quoi ça ?


Message édité par Harkonnen le 16-07-2006 à 15:22:03

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 16-07-2006 à 15:33:54    

Oops, "SelectAndReturn" est une fonction à moi tout seul :)
 
Voici le nouveau bout de code, simplifié :  

Code :
  1. string command = "select * from member";
  2. using (SqlConnection connection = new SqlConnection(...))
  3. {
  4.   connection.Open();
  5.   SqlCommand cmd = new SqlCommand(command, connection);
  6.   SqlDataReader reader = cmd.ExecuteReader();
  7.   connection.Close();
  8.   if (reader.HasRows)
  9.   {
  10.     reader.Read();
  11.   }
  12. }


Mici bien pour votre aide :)

Reply

Marsh Posté le 16-07-2006 à 15:42:30    

enleve le connection.close() de la ligne 7, il est strictement inutile vu que tu englobes ton objet SqlConnection dans une clause using{}


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 16-07-2006 à 15:51:39    

Exact !
ça marche !
Apparemment le reader dépend de la connection...
Mici bien à toi :)

Reply

Marsh Posté le 16-07-2006 à 15:55:08    

[:ojap]


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 16-07-2006 à 16:00:57    

Attends, c'est pas fini :)
En fait, ma méthode SelectAndReturn ferme la connection puis retourne le SqlDataReader.  
Mets après ça, on a vu que le SqlDataReader est mort.  
 
Ya-t-il un moyen de pouvoir lui faire retourner un SqlDataReader valable, même si la connection fermée ?  
Duplication du SqlDataReader ??
Mici si tu as une petite idée :)

Message cité 1 fois
Message édité par Roodie le 16-07-2006 à 16:01:27
Reply

Marsh Posté le 16-07-2006 à 16:11:26    

Roodie a écrit :


Ya-t-il un moyen de pouvoir lui faire retourner un SqlDataReader valable, même si la connection fermée ?  


non, car sans connection, le reader ne peut rien faire. je cite la MSDN :

Citation :


Lorsque SqlDataReader est en cours d'utilisation, le SqlConnection qui lui est associé est occupé à servir SqlDataReader et aucune autre opération ne peut être effectuée sur SqlConnection, à l'exception de sa fermeture. Cette situation subsiste jusqu'à ce que la méthode Close de SqlDataReader soit appelée. Par exemple, vous ne pouvez pas récupérer de paramètres de sortie tant que vous n'avez pas appelé Close.


http://msdn2.microsoft.com/fr-fr/l [...] eader.aspx
 
ceci dit, en quoi ça te gène ? si c'est pour libérer la connexion le plus vite possible, alors tu stockes les données du reader dans une collection quelconque pour utilisation ultérieure et ensuite tu peux fermer la connexion :spamafote:


Message édité par Harkonnen le 16-07-2006 à 16:12:13

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 16-07-2006 à 16:23:02    

Ma méthode est propre et consistante avec toutes les autres méthodes que j'ai faite, alors je voulais la garder.  
Sinon, tu parles de garder les données du reader qqpart. Veux-tu dire qu'il faut par exemple lire le reader, stocker ses données dans un dictionnaire, et retourner le dictionnaire ? Si c'est ça, c'est pas pratique effectivement :)
Merci bcp de ton aide!!!

Reply

Marsh Posté le 16-07-2006 à 16:45:25    

Roodie a écrit :

 
Sinon, tu parles de garder les données du reader qqpart. Veux-tu dire qu'il faut par exemple lire le reader, stocker ses données dans un dictionnaire, et retourner le dictionnaire ? Si c'est ça, c'est pas pratique effectivement :)


ben le mieux, c'est pas la solution que je t'ai donnée (qui est une solution batarde), mais c'est d'utiliser un DataSet, qui justement est fait pour ça. le DataSet est (pour simplifier) une base de données en mémoire. tu dois mapper via un SqlAdapter ta base dans le Dataset, puis ensuite tu peux fermer ta connexion et faire ce que tu veux de ton Dataset
http://msdn2.microsoft.com/en-us/l [...] taset.aspx


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 16-07-2006 à 16:45:25   

Reply

Marsh Posté le 16-07-2006 à 17:01:13    

Ah ouais ! Très intéressant.  
Je vais quand même garder la solution du SqlDataReader pour mon problème.  
Et pis si un jour j'ai vraiment besoin de garder en mémoire mon SqlDataReader, j'utiliserai un DataSet !  
Merci bcp pr ton aide !
Bonne fin de week-end à toi :)

Reply

Marsh Posté le 16-07-2006 à 17:06:18    

idem [:ohello]


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 17-07-2006 à 11:28:53    

Reply

Marsh Posté le 17-07-2006 à 11:37:05    


toi aussi t'as fermé la connexion avant d'utiliser le reader ? :whistle:


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 17-07-2006 à 11:40:30    

Harkonnen a écrit :

toi aussi t'as fermé la connexion avant d'utiliser le reader ? :whistle:


:o
 
(nan, moi j'ai oublié d'allumer mon serveur ce matin en allant au boulot, et du coup je m'ennuie comme un rat mort :/)


Message édité par Arjuna le 17-07-2006 à 11:41:07
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed