IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Oracle Discussion :

[10g] Exécution procédure stockée depuis C#


Sujet :

Oracle

  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 [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 : 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
    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# : 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
    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
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 814
    Points
    17 814
    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 : 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
    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
    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 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 éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 5 611
    Points : 11 252
    Points
    11 252
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

Discussions similaires

  1. Réponses: 5
    Dernier message: 17/11/2010, 16h38
  2. [SQL-Server] Exécution procédure stockée MSSQL depuis PHP
    Par Lejohnn dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 01/10/2008, 20h31
  3. [SQL SERVER 2K]Droits d'exécution procédure stockée
    Par Franck2mars dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 16/05/2006, 16h01
  4. Créer une procédure stockée depuis Delphi
    Par blonde dans le forum Bases de données
    Réponses: 10
    Dernier message: 10/03/2006, 12h26
  5. Appeler Procédure stockée depuis ACCESS
    Par Sunny dans le forum Access
    Réponses: 2
    Dernier message: 13/09/2005, 23h07

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