Précédent   Forum du club des développeurs et IT Pro > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels Oracle
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 04/01/2013, 21h02   #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 [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.
abradax est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2013, 23h09   #2
Waldar
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 6 278
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 35
Localisation : France, Essonne (Î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 278
Points : 13 549
Points : 13 549
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
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é.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2013, 16h28   #3
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 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#.
abradax est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2013, 08h52   #4
mnitu
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 4 115
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 115
Points : 8 010
Points : 8 010
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.
mnitu 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 06h06.


 
 
 
 
Partenaires

Hébergement Web