multipac
Messages postés30Date d'inscriptionjeudi 15 juillet 2004StatutMembreDernière intervention 7 mars 2012
-
6 déc. 2010 à 16:24
multipac
Messages postés30Date d'inscriptionjeudi 15 juillet 2004StatutMembreDerniè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)
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.
multipac
Messages postés30Date d'inscriptionjeudi 15 juillet 2004StatutMembreDerniè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.
multipac
Messages postés30Date d'inscriptionjeudi 15 juillet 2004StatutMembreDerniè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)
multipac
Messages postés30Date d'inscriptionjeudi 15 juillet 2004StatutMembreDerniè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.
multipac
Messages postés30Date d'inscriptionjeudi 15 juillet 2004StatutMembreDerniè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.
multipac
Messages postés30Date d'inscriptionjeudi 15 juillet 2004StatutMembreDerniè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