Fonction qui peut retourner un string ou un int. ??? [Résolu]

Signaler
Messages postés
78
Date d'inscription
samedi 4 août 2001
Statut
Membre
Dernière intervention
29 mars 2007
-
Messages postés
78
Date d'inscription
samedi 4 août 2001
Statut
Membre
Dernière intervention
29 mars 2007
-
Bonjour,
Je voulais créer une fonction en asp.net C#  afin d’exécuter des requêtes dans une base de donnée oracle cependant le type de retour peut très bien être un String ou un Int et donc j’aurai aimais pouvoir retourné l’objet dans sont format.


J’ai trouvé plusieurs possibilités mais j’aimerais savoir s’il y en a d’autres car celles ci me semble un peu trop « bricolage » :
- Retourné un objet de type ‘Object’ puis le casté avant de le mettre dans ma variable
- Créer deux fonction de nom différents et le paramètre de retour différents ….
Il est clair qu’ici le surchargement de la fonction est impossible car uniquement le paramètre de retour doit varier.


Ici c’est pour des int et des string mais j’ai une autre fonction ou j’aimerai retourner un OracleDataReader dans un cas et un OracleDataAdapter dans l’autre afin de pouvoir mettre le résultat dans un DataSet ou simplement faire des GetString et GetInt32 avec le DataReader.
Merci d’avance pour votre aide, je suis un peu perdu<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /?>


 

5 réponses

Messages postés
1642
Date d'inscription
samedi 6 novembre 2004
Statut
Modérateur
Dernière intervention
28 avril 2011
2
Pour le string et le int :
Le problème du Cast dans un object est que ça va faire des opérations de boxing / unboxing du int (car c'est un type valeur).
Et malheureusement c'est pas très bon côté performances...
Après, il faudrait tester si ce Cast + le GetType() est plus rapide que le Int.TryCast(), mais dans tous les cas c'est de la bidouille.
Pour les OracleDataXXXX, tu peux renvoyer un object et faire un Cast, ça ira mais ce sera pas très...propre  

Dans les deux cas, le mieux serait :
- soit de séparer en deux fonctions différentes.
- soit de créer une classe ReturnInfos (par exemple), qui aurait deux propriété, une de type String, l'autre Int (et une classe OracleReturnInfos avec une de type OracleDataAdapter, l'autre de type OracleDataReader), et ensuite de renvoyer un objet de type ReturnInfos en paramètre. La classe appellante aura ensuite juste à tester laquelle des deux propriétés n'est pas nulle, et ça y est elle a sa valeur, le tout sans aucun cast !

Mais tout ce bazard vient surtout d'un problème d'architecture de ta couche d'accès aux données : normalement, quand on utilises un DataReader, on n'utilises pas un DataAdapter... !
La 3ème (et la vrai) solution serait de restructurer tes classes qui gèrent l'accès aux données.

(merci poppyto de m'avoir réveillé, je lui ait donné une solution sans même lui donner les autres, sans les explications, etc...)

<hr width="100%" size="2" />Nurgle (Antoine)
Messages postés
1642
Date d'inscription
samedi 6 novembre 2004
Statut
Modérateur
Dernière intervention
28 avril 2011
2
Salut, une autre possibilité :

Fait le renvoyer toujours un string :
- si tu dois renvoyer un string, et ben c'est bon
- si tu dois renvoyer un int, et ben tu fais un ToString() pour caster ton int en string.

Ensuite à l'arrivée, tu testes si c'est un int ou un string :

string retour = maFonctionQuiRetourneUnStringOuUnInt();

int nombre;

if (!int.TryCast(retour, nombre))
{
// c'est un string
// et nombre == null
// tu peux travailler directement avec ta variable "retour"
}
else
{
// c'est un int
// tu peux ensuite travailler avec ta variable "nombre"
}


<hr width="100%" size="2" />
Nurgle (Antoine)
Messages postés
540
Date d'inscription
dimanche 29 décembre 2002
Statut
Modérateur
Dernière intervention
13 mai 2011

La méthode avec Cast sur Object est plus intéressante vu que tu vas aussi utiliser des objets OracleDataReader, donc pour le cast il faut d'abord appeler la fonction GetType de l'objet et après caster quoi. Enfin bon c'est pas une solution de porc quoi.......si ?

Poppyto
Cours de basse gratuits avec vidéos et ralentis 
Cours de guitare gratuits avec vidéos et ralentis 
[</body ]
Messages postés
540
Date d'inscription
dimanche 29 décembre 2002
Statut
Modérateur
Dernière intervention
13 mai 2011

De toute façon, je pense pas qu'il ai besoin de performances monstrueuses donc un box / unbox et hop hein...
C'est marrant y'a vraiment pleins d'idées reçues sur .net  !
Perso j'adopterais pour 3 fonctions différentes...

Poppyto
Cours de basse gratuits avec vidéos et ralentis 
Cours de guitare gratuits avec vidéos et ralentis 
[</body ]
Messages postés
78
Date d'inscription
samedi 4 août 2001
Statut
Membre
Dernière intervention
29 mars 2007

Bhen j'utilise simplement le DataReader pour récupérer le résultat d'une requete et le DataAdapter me permet de remplir un DataSet afin de ne pas avoir à rééffectuer la requete à chaque fois et pouvoir faire des recharche à l'interieur de celui ci. Dans mon cas c'est pour résuperer un lexique pour supporter le multi-lingue.
En ce qui concerne les performances il y a quand meme dans les 50 000 personne / mois donc il faut faire ça propre...
Merci pour vos réponse j'ai finalement opter pour 3 fonctions surchargé en lui passant mon dataadapter ou mon datareader ou rien si c'est une requete insert ou update..
Merci encore