Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 2 sur 2
  1. #1
    Invité de passage
    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 : 4
    Points
    4

    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.

  2. #2
    Membre confirmé
    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 :
    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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •