Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 4 sur 4
  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 [10g] Exécution procédure stockée depuis C#

    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
    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 C# :
    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
    static public bool modifierFournisseur(int ID, string Societe, string contact, string tel, string rue_num, string ville, string CodePostal, ref string ErrMsg)
            {
                bool retVal = false;
                int nombreDeModif;
     
                OracleConnection con = Utilitaire.getConnection();
                OracleCommand commandeModif = new OracleCommand();
                commandeModif.CommandType = System.Data.CommandType.StoredProcedure;
                commandeModif.Connection = con;
                commandeModif.CommandText = "MODIFIE_FOURNISSEUR";
     
                OracleParameter param1 = new OracleParameter(":1", OracleDbType.Int32);
                OracleParameter param2 = new OracleParameter(":2", OracleDbType.Varchar2);
                OracleParameter param3 = new OracleParameter(":3", OracleDbType.Varchar2);
                OracleParameter param4 = new OracleParameter(":4", OracleDbType.Varchar2);
                OracleParameter param5 = new OracleParameter(":5", OracleDbType.Varchar2);
                OracleParameter param6 = new OracleParameter(":6", OracleDbType.Varchar2);
                OracleParameter param7 = new OracleParameter(":7", OracleDbType.Varchar2);
                OracleParameter param8 = new OracleParameter(":2", OracleDbType.Varchar2, System.Data.ParameterDirection.Output);
                param8.OracleDbType = OracleDbType.Varchar2;
     
                param1.Value = ID;
                param2.Value = Societe;
                param3.Value = contact;
                param4.Value = tel;
                param5.Value = rue_num;
                param6.Value = ville;
                param7.Value = CodePostal;
                param8.Value = ErrMsg;
     
                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();
                    nombreDeModif = (int) commandeModif.ExecuteNonQuery();
     
                    if (nombreDeModif > 0)
                        retVal = true;
                    else
                        retVal = false;
     
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
                finally
                {
                    con.Close();
                }
     
                return retVal;
            }

    à 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
    Modérateur

    Homme Profil pro Fabien
    Ingénieur d'études en décisionnel
    Inscrit en
    septembre 2008
    Messages
    6 808
    Détails du profil
    Informations personnelles :
    Nom : Homme Fabien
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études en décisionnel
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : septembre 2008
    Messages : 6 808
    Points : 13 461
    Points
    13 461

    Par défaut

    Je ne sais pas vous répondre sur la partie C#, mais en tout cas votre procédure est simplifiable (alors qu'elle est déjà simple) :
    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
    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
     
    BEGIN
     
        UPDATE FOURNISSEURS 
           SET SOCIETE           = MODIFIE_FOURNISSEUR.P_SOCIETE
             , CONTACT           = MODIFIE_FOURNISSEUR.P_CONTACT
             , TEL               = MODIFIE_FOURNISSEUR.P_TEL
             , RUE_NUM           = MODIFIE_FOURNISSEUR.P_RUEETNUM
             , VILLE             = MODIFIE_FOURNISSEUR.P_VILLE
             , CP                = MODIFIE_FOURNISSEUR.P_CODEPOSTAL
         WHERE PK_FOURNISSEUR_ID = MODIFIE_FOURNISSEUR.IDFOURNISSEUR;
     
        MODIFIE_FOURNISSEUR.ErrorMessage := CASE SQL%ROWCOUNT WHEN 0 THEN 'Le fournisseur ne figure pas dans la DB' ELSE 'La mise à jour s''est faite correctement' END;
     
    END;
    /
    Pas de test préalable pour savoir si l'enregistrement existe, on tente la mise à jour et on regarde simplement si ça a fonctionné.

  3. #3
    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 simplification du code

    Bonjour et merci de votre réponse, j'ai simplifié ma procédure mais je dois avouer que je ne comprend pas la partie :

    CASE SQL%ROWCOUNT

    est-ce que ça me retourne le nombre de ligne affectée par la mise à jour ?

    en tout cas merci encore je ne connaissais pas cette syntaxe :o qui est fort proche du n = condition ? val1 : val2; que j'ai vue en C et C#.

  4. #4
    Expert Confirmé Sénior Avatar de mnitu
    Homme Profil pro Marius Nitu
    Ingénieur développement logiciels
    Inscrit en
    octobre 2007
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Nom : Homme Marius Nitu
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : octobre 2007
    Messages : 4 580
    Points : 8 297
    Points
    8 297

    Par défaut

    Virez le paramètre ErrorMessage qui est inutile. Si vous utilisez des exceptions en C# faite-le aussi pour le PL/SQL.
    Code :
    1
    2
    3
    4
     
    IF SQL%ROWCOUNT = 0 Then
      Raise_Application_Error(-20000, 'Le fournisseur ne figure pas dans la DB');
    End IF;
    SQL%RowCount vous indique le nombre des enregistrements modifié suite à l'instruction update.

    Si la mise à jour ne se fait pas probablement que vous avez oubliez d'exécuter commit après avoir appelée la procédure.

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
  •