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

Signaler
Messages postés
30
Date d'inscription
jeudi 15 juillet 2004
Statut
Membre
Dernière intervention
7 mars 2012
-
Messages postés
30
Date d'inscription
jeudi 15 juillet 2004
Statut
Membre
Dernière intervention
7 mars 2012
-
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

15 réponses

Messages postés
6063
Date d'inscription
dimanche 13 avril 2003
Statut
Modérateur
Dernière intervention
15 juillet 2011
36
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.
Messages postés
30
Date d'inscription
jeudi 15 juillet 2004
Statut
Membre
Dernière intervention
7 mars 2012

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
Messages postés
30
Date d'inscription
jeudi 15 juillet 2004
Statut
Membre
Dernière intervention
7 mars 2012

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
Messages postés
6063
Date d'inscription
dimanche 13 avril 2003
Statut
Modérateur
Dernière intervention
15 juillet 2011
36
IL faut regarder du coté des executeScalar dans ton cas.

Ou ExecuteReader si il y a plusieurs lignes/colonnes
Messages postés
30
Date d'inscription
jeudi 15 juillet 2004
Statut
Membre
Dernière intervention
7 mars 2012

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
Messages postés
6063
Date d'inscription
dimanche 13 avril 2003
Statut
Modérateur
Dernière intervention
15 juillet 2011
36
Messages postés
30
Date d'inscription
jeudi 15 juillet 2004
Statut
Membre
Dernière intervention
7 mars 2012

Alors là !!! Totalement perdu !!!

Je suis dans une impasse !!!

Walid
Messages postés
6063
Date d'inscription
dimanche 13 avril 2003
Statut
Modérateur
Dernière intervention
15 juillet 2011
36
C'est à dire.
Messages postés
30
Date d'inscription
jeudi 15 juillet 2004
Statut
Membre
Dernière intervention
7 mars 2012

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
Messages postés
6063
Date d'inscription
dimanche 13 avril 2003
Statut
Modérateur
Dernière intervention
15 juillet 2011
36
Messages postés
30
Date d'inscription
jeudi 15 juillet 2004
Statut
Membre
Dernière intervention
7 mars 2012

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
Messages postés
30
Date d'inscription
jeudi 15 juillet 2004
Statut
Membre
Dernière intervention
7 mars 2012

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
Messages postés
6063
Date d'inscription
dimanche 13 avril 2003
Statut
Modérateur
Dernière intervention
15 juillet 2011
36
J'ai pas d'oracle sous la main je ne peut pas t'aider désolé.
Je connais plus SQL server.
Messages postés
30
Date d'inscription
jeudi 15 juillet 2004
Statut
Membre
Dernière intervention
7 mars 2012

Merci beaucoup. Sympa de ta part d'avoir comme même essayé et aidé.


Walid
Messages postés
30
Date d'inscription
jeudi 15 juillet 2004
Statut
Membre
Dernière intervention
7 mars 2012

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