[c#]Verifier qu'un enregistrement est present dans la BDD

Verifier qu'un enregistrement est present dans la BDD [c#] - C#/.NET managed - Programmation

Marsh Posté le 30-06-2005 à 10:50:07    

Salut,
 
j'ai créé un bout de code qui me permet de verifier si un element est present ou pas dans ma base.
Ca ne me semble pas vraiment optimisé. Voici le code
 

Code :
  1. SqlCommand myCommand;
  2.         SqlDataReader myReader;
  3.         SqlConnection myConnection = (SqlConnection)Session["myConnection"];
  4.         string req_select = "SELECT * FROM matable WHERE id = @id";
  5.         myCommand = new SqlCommand(req_select, myConnection);
  6.         //creation et declaration des parametres
  7.         myCommand.Parameters.Add(new SqlParameter("@id", SqlDbType.Char, 100));
  8.         //Attribution des valeurs aux parametres
  9.         myCommand.Parameters["@id"].Value = "2";
  10.         myReader = myCommand.ExecuteReader();
  11.         int i = 0;
  12.         while (myReader.Read())
  13.         {
  14.             i++;
  15.         }
  16.         myReader.Close();
  17.         if (i >= 1)
  18.             Response.Write("Element present dans la base" );
  19.         else
  20.             Response.Write("Element pas present dans la base" );


 
Je suis preneur de tous conseil pour ameliorer et optimiser mon code.
Merci


Message édité par herks le 30-06-2005 à 11:06:32
Reply

Marsh Posté le 30-06-2005 à 10:50:07   

Reply

Marsh Posté le 30-06-2005 à 10:52:50    

myReader vaut pas null normalement quand ca retourne rien?


---------------
!== Force et honneur ==!
Reply

Marsh Posté le 30-06-2005 à 11:03:33    

apparament ca retourne flase ou true
voici la nouvelle version du code:
 

Code :
  1. SqlCommand myCommand;
  2.         SqlDataReader myReader;
  3.         SqlConnection myConnection = (SqlConnection)Session["myConnection"];
  4.         string req_select = "SELECT * FROM matable WHERE id = @id";
  5.         myCommand = new SqlCommand(req_select, myConnection);
  6.         myCommand.Parameters.Add(new SqlParameter("@id", SqlDbType.Char, 100));
  7.         myCommand.Parameters["@id"].Value = "2";
  8.         myReader = myCommand.ExecuteReader();
  9.      
  10.         if (myReader.Read() == true)
  11.             Response.Write("Element present dans la base" );
  12.         else
  13.             Response.Write("Element pas present dans la base" );


 
si y'a d'autre soluce plus propre ou mieux optimisé je suis toujours preneur ;)

Reply

Marsh Posté le 30-06-2005 à 11:04:33    

Ca m'a l'air correct....faudrait un 'expert' pour t'en dire plus..genre FlorentG.


---------------
!== Force et honneur ==!
Reply

Marsh Posté le 30-06-2005 à 11:07:32    

Et pourquoi pas faire :  
 
if ( reader.HasRows )
 
C'est plus simple quand même :)
Et ca t'evite une méthode de lecture qui sert a rien ^^


Message édité par zetranber le 30-06-2005 à 11:08:20
Reply

Marsh Posté le 30-06-2005 à 11:11:55    

Ca à l'air potable, en effet. J'enlèverais juste la string req_select qui sert à rien, autant la foutre directe dans le constructeur. Aussi vu qu'on ne retourne qu'un truc, autant utiliser ExecuteScalar(), qui renvoi en même temps la première colonne du premier enregistrement, ou null si y'a rien.
 
Enfin, ça sert à rien de faire un SELECT *, vu qu'on ne fait que tester. Suffit d'un SELECT id, pas besoin de toute la ligne...

Code :
  1. SqlConnection myConnection = (SqlConnection)Session["myConnection"];
  2. SqlCommand myCommand = new SqlCommand("SELECT id FROM matable WHERE id = @id", myConnection); 
  3. myCommand.Parameters.Add(new SqlParameter("@id", SqlDbType.Char, 100)); 
  4. myCommand.Parameters["@id"].Value = "2"; 
  5. if (myCommand.ExecuteScalar() == null) // Vérifier syntaxe, je connais pas assez le cécharppe
  6.   Response.Write("Element pas present dans la base" ); 
  7. else 
  8.   Response.Write("Element present dans la base" );

Reply

Marsh Posté le 30-06-2005 à 12:09:52    

si tu veux pas avoir de probleme avec le null qui pose tjs probleme en général
 
tu changes légèrement la requete
 
SELECT count(id) FROM matable WHERE id = @id
 
voila et ça te renvera 0 s'il n'existe pas...
 
ATTENTION 0 n'est pas égale à NULL

Reply

Marsh Posté le 30-06-2005 à 12:10:35    

Non, le null ne pose pas problème, vu que c'est un des retour possible de ExecuteScalar() [:spamafote]

Reply

Marsh Posté le 30-06-2005 à 14:15:45    

ici oui, mais dans d'autre cas il peut poser problème! de ce fait j'évite impérativement de retourner un null dans mes programmes! c'est une méthode de travail quoi! ici je ne dis pas que ça vient du null, mais moi personnellement je préfère l'éviter

Reply

Marsh Posté le 30-06-2005 à 14:18:02    

*ouch* tu retourne quoi à la place ? :heink:

Reply

Marsh Posté le 30-06-2005 à 14:18:02   

Reply

Marsh Posté le 30-06-2005 à 14:47:08    

D'ailleur, il me vient une petite idee sur un debat à lancer...
 
 
Mieux vaut-il utiliser une instruction d'egalité sous la forme
 

Code :
  1. if(MonObjet == null)


 
Ou plutot
 

Code :
  1. if(MonObjet.Equals(null))


 
 :??:

Reply

Marsh Posté le 30-06-2005 à 15:03:38    

ixemul a écrit :

D'ailleur, il me vient une petite idee sur un debat à lancer...
 
 
Mieux vaut-il utiliser une instruction d'egalité sous la forme
 

Code :
  1. if(MonObjet == null)


 
Ou plutot
 

Code :
  1. if(MonObjet.Equals(null))


 
 :??:


 
Moi aussi ca m'interresse de savoir le pourquoi du comment.
 
En tout k merci a tous pour vos reponses

Reply

Marsh Posté le 30-06-2005 à 15:10:37    

ixemul a écrit :

D'ailleur, il me vient une petite idee sur un debat à lancer...
 
 
Mieux vaut-il utiliser une instruction d'egalité sous la forme
 

Code :
  1. if(MonObjet == null)


 
Ou plutot
 

Code :
  1. if(MonObjet.Equals(null))


 
 :??:


En VB.NET, le problème ne se pose presque pas, on utilise généralement :

If Object Is Nothing Then


Sachant que Nothing est l'équivalent de null

Reply

Marsh Posté le 30-06-2005 à 15:17:21    

Ha ben ouais, mais j'ai delaissé le VB 6 que je ne pouvait plus voir en couleur pour passer à DotNet il y a 1 an maintenant et mon choix c'est naturellement porté sur C# qui me faisait plus tripper en me renvoyant à de vieux souvenirs de C++/java d'étudiant  :sweat:  
 
Bref, ma question reste en suspends, si qqun avait le pourquoi du comment il vaut mieux utiliser l'un ou l'autre... question de perf, de conso mémoire ou tout autre explication ca me ferait enormement plaisir  :D

Reply

Marsh Posté le 30-06-2005 à 15:35:55    

ixemul a écrit :

D'ailleur, il me vient une petite idee sur un debat à lancer...
 
 
Mieux vaut-il utiliser une instruction d'egalité sous la forme
 

Code :
  1. if(MonObjet == null)


 
Ou plutot
 

Code :
  1. if(MonObjet.Equals(null))


 
 :??:


ça dépend de ce que tu compares.
si tu compares 2 types valeur, alors utiliser l'un ou l'autre est exactement la même chose :

Code :
  1. int a = 5;
  2. int b = 5;
  3. Console.WriteLine(a == b);
  4. Console.WriteLine(a.Equals(b));


te renverra  

Citation :


true
true


 
par contre, si tu compares 2 types references, == fera une comparaison d'identité (les references pointent t'elles sur le même objet ?) , tandis que Equals comparera les valeurs.

Code :
  1. Int32 a = new Int32(5);
  2. Int32 b = new Int32(5);
  3. Console.WriteLine (a == b);
  4. Console.WriteLine (a.Equals(b));


te renverra

Citation :


false
true


attention à l'exception par contre : l'operateur == de la classe String compare les valeurs, et non les references (même si c'est un type reference). il en est de même pour System.Object
 
pour éviter toute ambiguité, le mieux est d'utiliser Equals() si tu veux comparer les valeurs, et ReferenceEquals si tu veux comparer les references.


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

Marsh Posté le 30-06-2005 à 15:43:07    

:love: LA lumiere !
 
merci beaucoup, ça a son importance  :jap:

Reply

Sujets relatifs:

Leave a Replay

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