1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2013
    Messages
    18
    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 : 18
    Points : 13
    Points
    13

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

  2. #2
    Membre actif
    Inscrit en
    avril 2010
    Messages
    182
    Détails du profil
    Informations forums :
    Inscription : avril 2010
    Messages : 182
    Points : 231
    Points
    231

    Par défaut

    Bonjour,

    Plutôt que :
    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
                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 : 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
                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

Discussions similaires

  1. Problèmes pour publier avec Visual Studio 2010 Express
    Par yannick34 dans le forum Visual Studio
    Réponses: 2
    Dernier message: 06/10/2011, 19h28
  2. Réponses: 15
    Dernier message: 29/06/2011, 15h47
  3. Problème d'installation de Visual Studio 2010 Ultimate
    Par 7amma7amma dans le forum Visual Studio
    Réponses: 7
    Dernier message: 23/02/2011, 22h06
  4. Réponses: 2
    Dernier message: 24/04/2008, 17h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo