Appel procédure stockée oracle avec VB.NET

multipac Messages postés 30 Date d'inscription jeudi 15 juillet 2004 Statut Membre Dernière intervention 7 mars 2012 - 6 déc. 2010 à 16:24
multipac Messages postés 30 Date d'inscription jeudi 15 juillet 2004 Statut Membre Dernière intervention 7 mars 2012 - 14 déc. 2010 à 09:47
Bonjour,
Besoin d'aide très urgent SVP. Je suis planté depuis plus de 3 semaines.
Alors j'ai créé une procédure stockée avec sqlplus oracle 10g release 10.2.0.1.0. je voudrais appeler cette procédure avec BN.net en utilisant ODP.net déjà installé.
J'arrive à me connecter à la base, mais le passage de paramètres à la procédure lors de l'exécution en VB.NET 2008 fait défaut.
J'ai suivi toutes les étapes qui sont bien expliquées dans les forums, mais malheureusement je ne trouve pas de solution.

Mon application généère cette erreur: "L'OBJET ORACLE PARAMETER FIGURE DEJA DANS UNE COLLECTION".

Je n'arrive pas à comprendre ce que c'est.

Voici le code de ma procédure stockée:
--------------------------------------
CREATE OR REPLACE FUNCTION "SMTTEST"."F_GET_LIBMCC" (p_mcc IN varchar2)
Return varchar2
is p_libmcc varchar2(50);
begin
Select lib_mcc into p_libmcc From mrchcateg Where mcc = p_mcc ;
return(p_libmcc);
end;


la portion du code en VB.NET qui fait appel est la suivante:
------------------------------------------------------------

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim cmd As OracleCommand = MYCONNECTION.CreateCommand()
Dim parm_in As OracleParameter = New OracleParameter()
Dim parm_out As OracleParameter = New OracleParameter()

Try
cmd.CommandType = CommandType.StoredProcedure
cmd.CommandText = "F_GET_LIBMCC" 'Le nom de la fonction/procédure stockée

parm_in = cmd.Parameters.Add("p_mcc", OracleDbType.Varchar2)
parm_in.Direction = ParameterDirection.Input
parm_in.Value = "6010" 'le passage de valeur au paramètre d'entrée à la fonction stockée
cmd.Parameters.Add(parm_in)

MsgBox(parm_in.Value.ToString)

parm_out = cmd.Parameters.Add("p_libmcc", OracleDbType.Varchar2)
parm_out.Direction = ParameterDirection.Output
parm_out.OracleDbType = OracleDbType.Varchar2
cmd.Parameters.Add(parm_out)

cmd.ExecuteNonQuery()

MsgBox(parm_out.Value.ToString)


Dim my_output As Double = parm_out.Value

MsgBox("La Valeur retirée de la base est: " & my_output.ToString)

Catch ex As Exception ' intercepte toutes les erreurs

MessageBox.Show(ex.Message.ToString())

End Try
End Sub



Est ce que c'est un problème oracle ou bien microsoft?
Bien que j'utilise les classes d'ODP.NET (Imports Oracle.DataAccess.Client)

Merci de bien vouloir me répondre et m'aider.
Walid
A voir également:

15 réponses

nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
6 déc. 2010 à 22:26
Salut,

Il me semble que tu n'indiques pas le message d'erreur
dur pour t'aider

Il me semble que tu n'utilises pas correctement le pattern
pour utiliser les paramétres output ado.net

Regardes icipour plus d'infos

Il est a adapter à Oracle mais c'est quasi la même chose (a part le nom des classes sqlcommand --> oraclecommand etc...)

en bref
connexion.open
creation et parametrage de la commande
execution de la commande
fermeture de la connexion
lecture du parametre output avec des convertions éventuelles.
0
multipac Messages postés 30 Date d'inscription jeudi 15 juillet 2004 Statut Membre Dernière intervention 7 mars 2012
7 déc. 2010 à 20:35
Bonsoir,

Merci pour ta prompte réponse.

En fait l'erreur que mon application génère est:

L'objet oracle parameter figure déjà dans une collection.

Par contre ce que j'ai remarqué en lisant l'exemple que tu m'as proposé de voir, il n'est pas indiqué si le paramètre de la procédure est en entrée contrairement à l'autre où on attend vraiment un résultat de retour.

Walid
0
multipac Messages postés 30 Date d'inscription jeudi 15 juillet 2004 Statut Membre Dernière intervention 7 mars 2012
8 déc. 2010 à 09:17
Bonjour ,

Voici un autre exemple de procédure assez simple qui renvoi juste une valeur 1.
Lorsque je fais appel à cette procédure dans mon applicatif VBNET, avec la même procédure, elle s'exécute normalement.


Code de la Procédure:
---------------------
CREATE OR REPLACE FUNCTION "SMTTEST"."GETONE" return number
as
begin
return 1;
end;


Mon Code Front End:
-------------------
' create command and setup to call test function
Dim cmd As OracleCommand = MYCONNECTION.CreateCommand()
cmd.CommandType = CommandType.StoredProcedure
cmd.CommandText = "getone"

' create parameter for the test function return value
Dim retval As OracleParameter = New OracleParameter()
retval.Direction = ParameterDirection.ReturnValue
retval.OracleDbType = OracleDbType.Int32

' add the parameter to the parameters collection
cmd.Parameters.Add(retval)

' execute the function
cmd.ExecuteNonQuery()

' get the return value in a local variable
Dim my_one As Integer = retval.Value

MsgBox("La Valeur retirée de la base est: " & my_one.ToString)

' cleanup
retval.Dispose()
cmd.Dispose()
MYCONNECTION.Dispose()

________________________________________________________________________

Je précise bien que j'utilise oracle comme base de données et la bibliothèque ODP.NET que j'ai intégérée dans ma référence dans le prohet VB.NET.

Merci
Walid
0
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
8 déc. 2010 à 09:39
IL faut regarder du coté des executeScalar dans ton cas.

Ou ExecuteReader si il y a plusieurs lignes/colonnes
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
multipac Messages postés 30 Date d'inscription jeudi 15 juillet 2004 Statut Membre Dernière intervention 7 mars 2012
8 déc. 2010 à 11:20
Merci pour ton aide comme même, mais je suis désolé car ce n'st pas ça le problème.

C'est un sujet de passage de paramètre.


Walid
0
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
8 déc. 2010 à 11:39
0
multipac Messages postés 30 Date d'inscription jeudi 15 juillet 2004 Statut Membre Dernière intervention 7 mars 2012
8 déc. 2010 à 13:41
Alors là !!! Totalement perdu !!!

Je suis dans une impasse !!!

Walid
0
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
8 déc. 2010 à 13:53
C'est à dire.
0
multipac Messages postés 30 Date d'inscription jeudi 15 juillet 2004 Statut Membre Dernière intervention 7 mars 2012
8 déc. 2010 à 14:02
C'est à dire que je me retroufve plus du tout.
Je n'arrive pas à localiser vraiment le problème du moment qu'il y a trois provider qui entrent en jeu, à savoir SQLPLUS* d'oracle 10g, oracle ODP.NET et Microsoft VB.NET.

Walid
0
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
8 déc. 2010 à 14:31
0
multipac Messages postés 30 Date d'inscription jeudi 15 juillet 2004 Statut Membre Dernière intervention 7 mars 2012
8 déc. 2010 à 14:43
Déjà après une petite modification le message d'erreur que mon application a généré est devenu différent. le problème de collections de paramètres n'est plus car il ne fallait pas mettre .add deux fois.

C'était comme ça:
parm_in = cmd.Parameters.Add("p_col1", OracleDbType.Int32)
cmd.Parameters.Add(parm_in)
Or la première ligne suffisait.

Maintenant l'erreur est devenu celle-ci:
ORA-01403: aucune donnée trouvée ORA-06512: à "SMTTEST.F_GET_LIBMCC", ligne 5 ORA-06512: à ligne 1

C'est comme si la requête n'a pas trouvé d'enregistrement, or la table est pleine de données.

Peut être faudrait i l se pencher à SQLPLUS maintenant.

Walid
0
multipac Messages postés 30 Date d'inscription jeudi 15 juillet 2004 Statut Membre Dernière intervention 7 mars 2012
8 déc. 2010 à 15:19
Maintenant j'ai interverti les paramètres comme indiqué dans la solution que tu m'as proposée dernièrement, et je reçois cette erreur

ORA-06502: PL/SQL : erreur numérique ou erreur sur une valeur: tampon de chaîne de caractères trop petit ORA-06512: à ligne 1


Walid
0
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
8 déc. 2010 à 15:22
J'ai pas d'oracle sous la main je ne peut pas t'aider désolé.
Je connais plus SQL server.
0
multipac Messages postés 30 Date d'inscription jeudi 15 juillet 2004 Statut Membre Dernière intervention 7 mars 2012
8 déc. 2010 à 15:24
Merci beaucoup. Sympa de ta part d'avoir comme même essayé et aidé.


Walid
0
multipac Messages postés 30 Date d'inscription jeudi 15 juillet 2004 Statut Membre Dernière intervention 7 mars 2012
14 déc. 2010 à 09:47
Hi,

Greate,

It works.

these are my new codes which are fine now.

PL/SQL CODE:
----------------------
CREATE OR REPLACE FUNCTION "SMTTEST"."F_GET_LIBMCC" (p_mcc IN varchar2)
Return varchar2
is p_libmcc varchar2(50);
begin
Select lib_mcc into p_libmcc From mrchcateg where mcc = p_mcc;
return(p_libmcc);

exception
when NO_DATA_FOUND
then return 'No Authors in that State';
when others
then raise_application_error(-20011,'Unknown Exception in F_GET_LIBMCC Function');
end;
--------------------------------------------------------------

The front end code:
-------------------------
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
Dim cmd As OracleCommand = MYCONNECTION.CreateCommand()
Dim parm_in As OracleParameter = New OracleParameter()
Dim parm_out As OracleParameter = New OracleParameter()
Try
cmd.CommandType = CommandType.StoredProcedure
cmd.CommandText =
"F_GET_LIBMCC"
cmd.Parameters.Add(
"p_libmcc", OracleDbType.Varchar2, 50).Direction = ParameterDirection.ReturnValue
parm_in = cmd.Parameters.Add(
"p_mcc", OracleDbType.Varchar2)
parm_in.Direction = ParameterDirection.Input
parm_in.Value =
"5999"
MsgBox(parm_in.ParameterName &
" = " & parm_in.Value)
cmd.ExecuteNonQuery()
MsgBox(cmd.Parameters(
"p_libmcc").Value)
Catch ex As Exception ' intercepte toutes les erreurs
MessageBox.Show(ex.Message.ToString())
End Try
End Sub

Thank You

Walid
0
Rejoignez-nous