Service web - Renvoyer plusieurs VARIABLES [Résolu]

Signaler
Messages postés
87
Date d'inscription
samedi 6 décembre 2003
Statut
Membre
Dernière intervention
7 novembre 2016
-
Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
-
Bonjour,



J'ai créé une procedure à l'intérieur de mon service web qui recoit
plusieurs variables (byval) et j'aimerai pouvoir renvoyer ces variables
modifiée a l'application utilisant ce service. (J'ai essayé un passage
par référence mais ca n'a rien donné... en gros ce qu'il me faut c'est
mettre mes variable en entrée/sortie).



Voici le code de mon service:





<WebMethod()> Public Sub PSCAvaleur(ByVal i As
Integer, ByVal PrenP As String, ByVal Sexe As String, ByVal Classe As
String, ByVal Autorise As Integer)

Dim cmdset As New SqlClient.SqlCommand

Dim compteur As Integer



cmdset.Connection = cnn

cmdset.CommandType = CommandType.StoredProcedure

cmdset.CommandText = "PSCAvaleur"

cnn.Open()



Dim Reader As SqlClient.SqlDataReader = cmdset.ExecuteReader



compteur = 0

While compteur <> i

Reader.Read()

PrenP = Reader.GetString(0)

Sexe = Reader.GetString(1)

Classe = Reader.GetString(2)

Autorise = Reader.GetInt32(3)

compteur = compteur + 1

Reader.Read()

End While





End Sub











Et voici l'appel à partir de mon application web :



MonService.PSCAvaleur(1,PrenP.Text,Sexe.Text,Classe.Text,0);









MERCI D'AVANCE


Cyberice

12 réponses

Messages postés
586
Date d'inscription
lundi 7 janvier 2002
Statut
Membre
Dernière intervention
10 février 2010
1
re,

tu as le choix pour ca.... tu peux par example faire une fonction qui te renvoie un dataset .. ou autre...
dans l'example qui suit, je renvoie une arraylist

<WebMethod()> Public Function PSCAvaleur(ByVal i As Integer, ByVal PrenP As String, ByVal Sexe As String, ByVal Classe As String, ByVal Autorise As Integer) as Arraylist
Dim sResults as Arraylist = new Arraylist()
Dim cmdset As New SqlClient.SqlCommand
Dim compteur As Integer

cmdset.Connection = cnn
cmdset.CommandType = CommandType.StoredProcedure
cmdset.CommandText = "PSCAvaleur"
cnn.Open()

Dim Reader As SqlClient.SqlDataReader = cmdset.ExecuteReader

compteur = 0
While compteur <> i
Reader.Read()
arrResults(0) = Reader.GetString(0)
arrResults(1) = Reader.GetString(1)
arrResults(2) = Reader.GetString(2)
arrResults(3) = Reader.GetString(3)
compteur = compteur + 1
Reader.Read()
End While

return arrResults
End Function

Att. je ne mets que des string dans l'arraylist..
...
je ne comprends pas trop l'intérêt de ta boucle ..??
yopyop
Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
28
<WebMethod>public function add(i as integer, j as integer) as double
return i + j
end function

ca va pas ca ?

par ByRef, c'est possible que ca merde, mais je suis pas sur de moi, peut etre du à la facon, dont un service web est géré en SOAP


<HR>
Cyril - MCP ASP.net
Webmaster de : Hoshimi.CodeS-SourceS.fr
Messages postés
586
Date d'inscription
lundi 7 janvier 2002
Statut
Membre
Dernière intervention
10 février 2010
1
Dim sResults as Arraylist = new Arraylist()
=>
Dim arrResults as Arraylist = new Arraylist()

yopyop
Messages postés
87
Date d'inscription
samedi 6 décembre 2003
Statut
Membre
Dernière intervention
7 novembre 2016

Merci Jesusonline et YopYop pour votre aide, je vais testé ça ce soir :)


ta réponse m'a fait rire Jesus, ca parait si évident quand j'la lis :D Faudra que je test...


Pour répondre à ta question Yep Yep la boucle sert à aller sur l'enregistrement numéro X (X étant la valeur de la variable INDEX que l'on passe en parametre). Si t'as un système D plus simple ?
j'ai pensé à faire :

while compteur < i
MonReader.read()
wend

puis affecter les valeurs...

MERCI ENCORE

Cyberice
Messages postés
87
Date d'inscription
samedi 6 décembre 2003
Statut
Membre
Dernière intervention
7 novembre 2016

JesusOnline,

J'ai un petit problème avec ta solution... Voici ce que j'ai tenté :


<WebMethod()>
Public
Function PSCAvaleur(
ByVal i
As
Integer,
ByVal PrenP
As
String,
ByVal Sexe
As
String,
ByVal Classe
As
String,
ByVal Autorise
As
Integer)
As double



Dim cmdset
As
New SqlClient.SqlCommand

Dim compteur
As
Integer


cmdset.Connection = cnn
cmdset.CommandType = CommandType.StoredProcedure
cmdset.CommandText = "PSCAvaleur"
cnn.Open()



Dim Reader
As SqlClient.SqlDataReader = cmdset.ExecuteReader


compteur = 0

While compteur <> i
Reader.Read()
PrenP = Reader.GetString(0) 'renvoie CHRIS
Sexe = Reader.GetString(1) 'renvoie M
Classe = Reader.GetString(2) ' renvoie 2TIGD
Autorise = Reader.GetInt32(3) 'renvoie 1
compteur = compteur + 1
Reader.Read()

End
While



Return PrenP + Sexe + Classe + Autorise



End
Function

Quand j'execute il me dit :

System.InvalidCastException: Cast de la chaîne "CHRISm2tigd" en type 'Double' non valide. ---> System.FormatException: Le format de la chaîne d'entrée est incorrect.
at Microsoft.VisualBasic.CompilerServices.DoubleType.Parse(String Value, NumberFormatInfo NumberFormat)
at Microsoft.VisualBasic.CompilerServices.DoubleType.FromString(String Value, NumberFormatInfo NumberFormat)
--- Fin de la trace de la pile d'exception interne ---
at Microsoft.VisualBasic.CompilerServices.DoubleType.FromString(String Value, NumberFormatInfo NumberFormat)
at Microsoft.VisualBasic.CompilerServices.DoubleType.FromString(String Value)
at AP4.Service1.PSCAvaleur(Int32 i, String PrenP, String Sexe, String Classe, Int32 Autorise) in d:\inetpub\wwwroot\AP4\Service1.asmx.vb:line 153

Cyberice
Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
28
t'as compris ma solution ???

l'erreur vient de cette ligne et c'est évident !

Return PrenP + Sexe + Classe + Autorise

PrenP, Sexe, Classe, sont de type string tu lui rajoutes un integer

heureusement VB.net est trés gentil !!!

mais aprés le type de la fonction est double, et on peut pas, caster des string en double ...

pour faire comme je t'ai dit, il faut changer le type, mettre comme l'a dit YopYop, un arraylist, ou un dico ou meme une string concatené ...

petite remarque, niveau optimisation, t'as mis Sexe as string, jusqu'a preuve du contraire, il n'y a que deux cas possible, donc met plutot un boolean, ou au pire un integer ...


<HR>
Cyril - MCP ASP.net
Webmaster de : Hoshimi.CodeS-SourceS.fr
Messages postés
87
Date d'inscription
samedi 6 décembre 2003
Statut
Membre
Dernière intervention
7 novembre 2016

Oui maintenant je vois c'que tu voulais dire :)



Ce que j'avais en tete de faire c'est l'entrée/sortie => modifié les
valeur qui sont pointées par les variable transmisent en parametre
directement en mémoire... mais j'pense pas qu'un service web accepte
ca...



Sinon comme tu me l'as conseillé j'ai essayé de mettre en place un
ArrayList et ca marche très bien sauf que lorsque je recupére
l'arraylist de ma fonction (contenu ds les service web), il ne veut pas
me l'affectée. En clair ca donne :







//appel de PSCAvaleur => Renvoie un ArrayList


ArrayList MonArray = new
ArrayList();


MonArray =
MonService.PSCAvaleur(1);



Il me met "Impossible de convertir implicitement le type 'object[]' en 'System.Collections.Arraylist'



Un peu con comme truc vu que j'affecte une fonction retournant un
arraylist à une variable local de mon application web qui se trouve
etre aussi une Arraylist..

Ps : mon service web est en vb.net et mon application web en ASP.net
(mais bon ca doit pas venir de là vu qu'y'a SOAP entre les deux...)



Une idée ?

Merci pour ton aide antérieure...


Cyberice
Messages postés
87
Date d'inscription
samedi 6 décembre 2003
Statut
Membre
Dernière intervention
7 novembre 2016

Au fait sorry pour les fautes d'ortho-gramm, j'ai pas dormis depuis 24
heures et j'ai des alumettes dans les yeux pour pas m'endormir... :)

Cyberice
Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
28
asp.net n'est pas un langage, mais une technologie, on peut utiliser asp.net avec tout les langages .net C# etc...

ton problème à l'air un problème de casting donc en C# ca donne

ArrayList MonArray = new ArrayList();
MonArray = [ArrayList]MonService.PSCAvaleur(1);

normalement c'est bon.

PS : pour les fautes, t'inquietes meme moi au réveil, j'en fait ;)


<HR>
Cyril - MCP ASP.net
Webmaster de : Hoshimi.CodeS-SourceS.fr
Messages postés
87
Date d'inscription
samedi 6 décembre 2003
Statut
Membre
Dernière intervention
7 novembre 2016

Merci pour ta réponse... Elle ne marche pas directement mais en fouinant j'pense avoir trouvé !

Voici ma solution :


ArrayList MonArray =
new ArrayList();
MonArray = ArrayList.Adapter(MonService.PSCAvaleur(1));

J'espere que ca fait bien une affectation des valeurs transmisent... Mais now je seche sur la maniere de récupérer ces valeurs à partir de la arraylist, en vb c'est pas dur mais en C# j'connais pas la syntaxe et les méthodes de ma variable arraylist me parlent pas vraiment...
Si t'as une idée j'suis preneur...

Ps : quand ca marchera j'mettrai mon projet sur code-source pcq j'trouve pas enormement d'infos dessus...

Cyberice
Messages postés
87
Date d'inscription
samedi 6 décembre 2003
Statut
Membre
Dernière intervention
7 novembre 2016

C'est bon j'viens de trouver la solution :)

En fait avant d'mettre le post précédent j'l'avais essayé mais j'ai fait une faute au niveau des déclaration et comme C# et pas aussi gentil que VB ;)

Solution



foreach (
object y
in MonArray)
{
Autorise.Text = Autorise.Text + y.ToString();
}

Cyberice
Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
28
je suis fatigué moi aussi ...

ArrayList MonArray = (ArrayList)MonService.PSCAvaleur(1);

Autorise = MonArray [3] //pas sur de l'index

Si ca marche pas comme ca au lieu de faire un ArrayList, car la t'en as pas besoin, fais un string()

<WebMethod()> Public Function PSCAvaleur(ByVal i As Integer) as string()
Dim sResults(3) as string
Dim cmdset As New SqlClient.SqlCommand
Dim compteur As Integer

cmdset.Connection = cnn
cmdset.CommandType = CommandType.StoredProcedure
cmdset.CommandText = "PSCAvaleur"
cnn.Open()

Dim Reader As SqlClient.SqlDataReader = cmdset.ExecuteReader

compteur = 0
While compteur <> i
Reader.Read()
sResults(0) = Reader.GetString(0)
sResults(1) = Reader.GetString(1)
sResults(2) = Reader.GetString(2)
sResults(3) = Reader.GetString(3)
compteur = compteur + 1
Reader.Read()
End While

return sResults
End Function

string[] MonArray = (string)MonService.PSCAvaleur(1);

Autorise = MonArray[3] //pas sur de l'index

j'espere mais j'en doute fort de ne pas avoir trop dit de connerie dans ce message ;)

<HR>

Cyril -
MCP ASP.net
Webmaster de :
Hoshimi.CodeS-SourceS.fr