Précédent   Forum du club des développeurs et IT Pro > Dotnet > Accès aux données > ADO.NET
ADO.NET Forum d'entraide sur le développement avec les services d'accès aux données disponibles avec ADO.NET.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 05/01/2013, 21h17   #1
abradax
Invité de passage
 
Homme
Développeur informatique
Inscription : janvier 2013
Messages : 5
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2013
Messages : 5
Points : 0
Points : 0
Par défaut Problème procédure stockée et visual studio 2010 (framework 4.5)

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 :

Code :
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;
et j'essaye d’exécuter ça avec le code suivant :


Code :
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;
        }
en exécutant ça j'ai l'erreur suivante :

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 :

Code :
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);
}
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.

à 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.
abradax est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2013, 09h38   #2
jcdentons
Membre confirmé
 
Inscription : avril 2010
Messages : 182
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 182
Points : 206
Points : 206
Bonjour,

Plutôt que :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
            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();
            }
Vous pouvez essayer d'utiliser un OracleDataAdapter pour faire ce genre de chose :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
            OracleDataAdapter da;
            DataSet ds = new DataSet();
            try
            {
                da = new OracleDataAdapter(commandeModif);
                da.Fill(ds, <NOM_TABLE>);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                ErrMsg = ex.Message.ToString();
            }
            finally
            {
                commandeModif.Dispose();
                da.Dispose();
            }
http://msdn.microsoft.com/fr-fr/libr...=vs.80%29.aspx
jcdentons est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 08h24.


 
 
 
 
Partenaires

Hébergement Web