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

C# Discussion :

[C#] - [ORACLE] - Procédures stockées et paramètres


Sujet :

C#

  1. #1
    Membre du Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2002
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Mai 2002
    Messages : 49
    Points : 55
    Points
    55
    Par défaut [C#] - [ORACLE] - Procédures stockées et paramètres
    Bonjour à tous,
    j'ai épluché la FAQ, les articles et les sources sans succès.
    Je m'adresse donc à vous pour le problème suivant :
    Environnement
    C#-VS2008-Oracle 10g-ODP.NET
    J'aimerais connaitre la syntaxe correcte à employer dans le bout de code suivant pour appeler une procédure stockée résidant dans ma DB Oracle et nécéssitant le passage d'un paramètre en entrée de type varchar !

    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
     
    public static bool Test_SP()
    {
                DbConnection dbConn ;
                DbProviderFactory dbpf;
                string sConnectionString;
     
                dbpf = DbProviderFactories.GetFactory("Oracle.DataAccess.Client"); //Client Oracle
                dbConn = dbpf.CreateConnection();
                dbConn.ConnectionString = "User ID=" + ConfigurationSettings.AppSettings["UserID"].ToString() + "; Password=" + ConfigurationSettings.AppSettings["Password"].ToString() + ";Data Source=" + ConfigurationSettings.AppSettings["DataSource"].ToString();
                try
                {
                    dbConn.Open();
                }
                catch (Exception e)
                {
                    Sys.Alert("Unable to connect to the database!" + Sys.CR + "Please check your network connection or Oracle service." + Sys.CR + Sys.CR +
                                  "Error message : " + Sys.CR + "--------------- " + Sys.CR + e.Message);
                    return false;
                }
     
                try
                {
                    DbCommand oCmd = dbConn.CreateCommand();
                    DbParameter ocParam = oCmd.CreateParameter();
     
                    oCmd.CommandType = CommandType.StoredProcedure;
                    oCmd.CommandText = "DUMP_SEASON_TO_CSV";
     
                    ocParam.Direction = ParameterDirection.Input;
                    ocParam.Value = "W10";
     
                    object result = oCmd.ExecuteNonQuery();
                }
                catch (Exception e)
                {
                    Sys.Alert("Error message : " + Sys.CR + "--------------- " + Sys.CR + e.Message);
                    return false;
                }
                return true;           
    }
    A la question pourquoi ne pas avoir utilisé directement le client Oracle:
    Mon collègue a travaillé ainsi dans un souci de portabilité vers d'autres DB.

    Déjà merci pour vos réponses.

    Yndigos

  2. #2
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Points : 8 873
    Points
    8 873
    Par défaut
    Bonjour,

    d'après la documentation (MSDN),le fait de créer le paramètre ne le rajoute pas dans la liste des paramètres de la commande (il n'est qu'instancié).

    Il faut le rajouter à la main, à savoir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    DbCommand oCmd = dbConn.CreateCommand();
    DbParameter ocParam = oCmd.CreateParameter();
     
    oCmd.CommandType = CommandType.StoredProcedure;
    oCmd.CommandText = "DUMP_SEASON_TO_CSV";
     
    ocParam.Direction = ParameterDirection.Input;
    ocParam.Value = "W10";
     
    oCmd.Parameters.Add(ocParam);


  3. #3
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 082
    Points
    8 082
    Par défaut
    Je confirme!
    De plus il faut faire attention avec les drivers oracle, ils manipulent des ressources non managées (du moins ODP.Net). Ne pas oublier les Dispose et using de rigueur!

  4. #4
    Membre du Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2002
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Mai 2002
    Messages : 49
    Points : 55
    Points
    55
    Par défaut
    Bonjour,
    merci pour vos réponses, çà fonctionne !
    Ce n'est pas encore évident pour moi le fait qu'instancier un objet ne le rajoute pas nécessairement et automatiquement ...
    Soit dit en passant, et pour ma "culture générale", je lis bien dans l'aide que la commande CreateParameter instancie un paramètre, comment puis-je détecter que je dois l'ajouter ! (désolé de paraître un peu lourd, je sors de language bien différent, RPG et Windev)

    Par ailleurs, la remarque de PitMaverick78 m'interpelle :
    les drivers Oracle manipulent des ressources non-managées...
    OK pour le principe, mais où puis-je trouver la liste ou plus d'informations sur ces ressources.
    Mon collègue a bâtit notre framework sur le driver ODP, mais je ne suis pas certain que celà soit pris en compte... Cela m'intéresse donc fortement !

    Merci

  5. #5
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Points : 8 873
    Points
    8 873
    Par défaut
    Citation Envoyé par Yndigos Voir le message
    Bonjour,
    merci pour vos réponses, çà fonctionne !
    Ce n'est pas encore évident pour moi le fait qu'instancier un objet ne le rajoute pas nécessairement et automatiquement ...
    Soit dit en passant, et pour ma "culture générale", je lis bien dans l'aide que la commande CreateParameter instancie un paramètre, comment puis-je détecter que je dois l'ajouter ! (désolé de paraître un peu lourd, je sors de language bien différent, RPG et Windev)
    Re,

    en général la documentation est assez claire à ce sujet, et il faut bien lire ce qui est écrit.

    Si le fait de créer un paramètre via CreateParameter(), le rajouterais automatiquement à la collection de paramètres de ta commande, ça serait marqué noir sur blanc avec même un exemple à la clé.

    Mais d'un autre côté, il y a un côté logique aussi, pourquoi rajouterais-t-on un paramètre qu'on vient juste de créer? Il n'a ni nom, ni paramétrage associé.

    ++

  6. #6
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 082
    Points
    8 082
    Par défaut
    Citation Envoyé par Yndigos Voir le message
    Bonjour,
    merci pour vos réponses, çà fonctionne !
    Ce n'est pas encore évident pour moi le fait qu'instancier un objet ne le rajoute pas nécessairement et automatiquement ...
    Soit dit en passant, et pour ma "culture générale", je lis bien dans l'aide que la commande CreateParameter instancie un paramètre, comment puis-je détecter que je dois l'ajouter ! (désolé de paraître un peu lourd, je sors de language bien différent, RPG et Windev)

    Par ailleurs, la remarque de PitMaverick78 m'interpelle :
    les drivers Oracle manipulent des ressources non-managées...
    OK pour le principe, mais où puis-je trouver la liste ou plus d'informations sur ces ressources.
    Mon collègue a bâtit notre framework sur le driver ODP, mais je ne suis pas certain que celà soit pris en compte... Cela m'intéresse donc fortement !

    Merci
    Il suffit de vérifier que pour tous les objets qui implémentent IDisposable il y'a un Dispose ou un using d'utilisé. Les objets connexions et paramètres implémentent notamment IDisposable

    Edit: A la vue du premier poste, ca n'est pas fait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public static bool Test_SP()
    {
                DbProviderFactory dbpf;
                string sConnectionString;
     
                dbpf = DbProviderFactories.GetFactory("Oracle.DataAccess.Client"); //Client Oracle
                using(DbConnection dbConn = dbpf.CreateConnection())
                {
                //doing stuffs...
     
                }
    }
    Edit2: En reflechissant, je me suis apercu que vous avez rajouté une surcouche aux objets odp.net. Il faut donc que chaque objet encapsulant un objet odp.net implémente IDisposable et qu'il provoque le Dispose du sous-jacent.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [WD20] Oracle Procédure stockée paramètre out type structure
    Par VincentRoy dans le forum WinDev
    Réponses: 1
    Dernier message: 23/12/2014, 18h05
  2. [SQL2005] [TSQL] Procédure stockée et paramètres
    Par Invité dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 13/12/2007, 13h53
  3. Procédure stockée et paramètres de retour..
    Par nikalkal dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 20/07/2006, 17h53
  4. [ORACLE] Procédure stockée
    Par Herveg dans le forum Oracle
    Réponses: 2
    Dernier message: 09/05/2006, 18h06
  5. Procédure stockée et paramètre CLOB
    Par Sebounet19 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 03/11/2005, 17h05

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