Bonjour, j'ai un petit problème avec l'exécution d'une procédure stockée dans ORACLE que je veux faire fonctionner avec C#.
voilà le code de ma Procédure stockée :
et j'essaye d’exécuter ça avec le code suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 CREATE OR REPLACE PROCEDURE MODIFIE_FOURNISSEUR(IDFOURNISSEUR IN FOURNISSEURS.PK_FOURNISSEUR_ID%TYPE, P_SOCIETE IN FOURNISSEURS.SOCIETE%TYPE, P_CONTACT IN FOURNISSEURS.CONTACT%TYPE, P_TEL IN FOURNISSEURS.TEL%TYPE, P_RUEETNUM IN FOURNISSEURS.RUE_NUM%TYPE, P_Ville IN FOURNISSEURS.VILLE%TYPE, P_CodePostal IN FOURNISSEURS.CP%TYPE, ErrorMessage out varchar2) IS FOURNISSEUREXISTE INTEGER; FournisseurNOEXISTANT EXCEPTION; BEGIN SELECT count(*) INTO fournisseurexiste FROM fournisseurs WHERE FOURNISSEURS.PK_FOURNISSEUR_ID=IDFOURNISSEUR; IF FOURNISSEUREXISTE>0 THEN UPDATE FOURNISSEURS SET SOCIETE = P_SOCIETE, CONTACT = P_CONTACT, TEL = P_TEL, RUE_NUM = P_RUEETNUM, VILLE = P_VILLE, CP = P_CODEPOSTAL WHERE PK_FOURNISSEUR_ID = IDFOURNISSEUR; ErrorMessage := 'La mise à jour s''est faite correctement'; ELSE RAISE FournisseurNoExistant; END IF; EXCEPTION WHEN FOURNISSEURNOEXISTANT THEN ErrorMessage := 'Le fournisseur ne figure pas dans la DB'; END;
en exécutant ça j'ai l'erreur suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70 static public void modifierFournisseur(int ID, string Societe, string contact, string tel, string rue_num, string ville, string CodePostal, ref string ErrMsg) { OracleConnection con = Utilitaire.getConnection(); // on creer l'objet de connection //bool retVal; OracleCommand commandeModif = new OracleCommand("MODIFIE_FOURNISSEUR", con); //on affecte à l'objet commande la procédure voulue et l'objet de connection qui va avec la commande. commandeModif.CommandType = System.Data.CommandType.StoredProcedure; //on dit qu'on va travailler sur une procédure stockée //création des différents paramètres en rapport à la procédure stockée. OracleParameter param1 = new OracleParameter(":IDFOURNISSEUR", OracleDbType.Int32); OracleParameter param2 = new OracleParameter(":p_SOCIETE", OracleDbType.Varchar2); OracleParameter param3 = new OracleParameter(":P_CONTACT", OracleDbType.Varchar2); OracleParameter param4 = new OracleParameter(":P_TEL", OracleDbType.Varchar2); OracleParameter param5 = new OracleParameter(":P_RUEETNUM", OracleDbType.Varchar2); OracleParameter param6 = new OracleParameter(":P_VILLE", OracleDbType.Varchar2); OracleParameter param7 = new OracleParameter(":P_CODEPOSTAL", OracleDbType.Varchar2); OracleParameter param8 = new OracleParameter(":ERRORMESSAGE", OracleDbType.Varchar2, System.Data.ParameterDirection.Output); param8.OracleDbType = OracleDbType.Varchar2; param1.Direction = ParameterDirection.Input; //ParameterDirection permet de dire si le paramètre est de type in ou out (voir les paramètres de la procédure stockée) param1.Value = ID; param2.Direction = ParameterDirection.Input; param2.Value = Societe; param3.Direction = ParameterDirection.Input; param3.Value = contact; param4.Direction = ParameterDirection.Input; param4.Value = tel; param5.Direction = ParameterDirection.Input; param5.Value = rue_num; param6.Direction = ParameterDirection.Input; param6.Value = ville; param7.Direction = ParameterDirection.Input; param7.Value = CodePostal; param8.Value = ErrMsg; //ajout des paramètre à la commande commandeModif.Parameters.Add(param1); commandeModif.Parameters.Add(param2); commandeModif.Parameters.Add(param3); commandeModif.Parameters.Add(param4); commandeModif.Parameters.Add(param5); commandeModif.Parameters.Add(param6); commandeModif.Parameters.Add(param7); commandeModif.Parameters.Add(param8); try { con.Open(); commandeModif.ExecuteNonQuery(); if (commandeModif.Parameters[":ERRORMESSAGE"].Value != null) ErrMsg = (string) commandeModif.Parameters[":ERRORMESSAGE"].Value; } catch (Exception ex) { Console.WriteLine(ex.Message); ErrMsg = ex.Message.ToString(); } finally { con.Close(); } //return retVal; }
ORA-06502: PL/SQL : ereur numérique ou erreur sur une valeur:tampon de chaîne de caractères trop petit
ORA-06512: à "ABRADAX.MODIFIE_FOURNISSEUR", ligne 29
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
et mon appel à ma méthode se fait avec :
J'ai un petit doute avec le type number d'oracle et le type int32 de C# est-ce que c'est la même chose? ou est-ce qu'il faut une conversion? si c'est le cas comment est-ce qu'on l'a fait ? car ORACLEDBTYPE ne me propose pas de type number.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 private void btModifier_Click(object sender, EventArgs e) { string Messageerreur = ""; int IDfournisseur = Convert.ToInt32(this.tbIdFournisseur.Text.ToString()); DAL.GestionFournisseur.modifierFournisseur(IDfournisseur, tbSociete.Text, tbContact.Text, tbTel.Text, tbRueNum.Text, tbVille.Text, tbCP.Text, ref Messageerreur); MessageBox.Show(Messageerreur.ToString(), "information de modification", MessageBoxButtons.OKCancel); }
à savoir que je travail en 4 couches (PL, DAL, BLL et BO)
Le problème c'est que je ne sais pas comment exécuter ma procédure via le C#, le code que j'ai mis ne m'exécute pas ma procédure lorsque je tente une modification. Est-ce que le fait de mettre un paramètre de type ref dans ma méthode C# ça va passer avec mon paramètre OUT de ma procédure stockée ?
voilà j'espère que je suis déjà au bon endroit pour poser ma question et j'espère aussi avoir été assez clair dans ma question :s
Merci d'avance pour les réponses.
Partager