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 :

Appel d'une proc stockée ayant des args de type TABLE en entree depuis du code C#


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Août 2005
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 102
    Par défaut [c#/PL/SQL]Appel d'une proc stock ayant une collec de User Data Type ORACLE en entrée
    Bonjour,

    Je cherche à appeler une procédure stockée oracle depuis du code C# qui prend en paramètre une liste de type Oracle.
    En gros j'ai defini un type de la manière suivante dans oracle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    create or replace TYPE NomType AS OBJECT
    (
      prop1 varchar2(255),
      prop2 varchar2(255),
      prop3 varchar2(255),
      prop4 varchar2(255)
    )
    et une liste de type "NomType" de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    create or replace TYPE "NomListType"
     IS TABLE OF "NomType"
    Après quoi je cherce à appeler une procstockée oracle qui prend en paramètre IN une variable de type NomListeType ?

    Comment puis je paramétre dans le code C# le passage de ce paramètre via la commande classique.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    sqlCmd = _refSchemaOwner + "NomProcStock";
    cmd = new OleDbCommand(sqlCmd, conn);
    cmd.CommandType = CommandType.StoredProcedure;
    param = new OleDbParameter("", OleDbType.VarChar);
    param.Direction = ParameterDirection.Input;
    param.Value = [Value];
    cmd.Parameters.Add(param);
    Quel type "OleDbType" puis je mettre pour ce paramètre de type liste?

    Merci d'avance

  2. #2
    Membre émérite Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 822
    Par défaut
    Je pense que tu devrais utiliser le provider oracle plutôt qu'OleDb, il gère les types de paramètre d'Oracle.

    Par contre, il faut veiller à avoir le bon client oracle sinon "ça fout la m..."

  3. #3
    Membre confirmé
    Inscrit en
    Août 2005
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 102
    Par défaut
    Le problème c'est que le type que je veux passer ne fait pas partie des types oracle de base puisque c'est moi qui l'ai créer. Il ne ne sera donc pas disponible dans l'énumération "OracleType".

    Je vais qd meme regardé au cas ou.

    merci en tout cas

    a+

  4. #4
    Membre émérite Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 822
    Par défaut
    Citation Envoyé par rabddoul Voir le message
    Le problème c'est que le type que je veux passer ne fait pas partie des types oracle de base puisque c'est moi qui l'ai créer. Il ne ne sera donc pas disponible dans l'énumération "OracleType".
    Ah oui, pas faux ça...

  5. #5
    Membre confirmé
    Inscrit en
    Août 2005
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 102
    Par défaut
    J'ai essayé de tenter qqch avec OracleDataAccessComponent qui me fournit la librairie Oracle.DataAccess.dll.

    Seulement toutes les utilisations que j'ai pu voir des "OracleCollectionType.PLSQLAssociativeArray" utilise des type de base d'oracle.

    Est ce qu'il est possible d'utiliser ces collections à partir de type Oracle que l'on aurait créer nous même comme définit dans le 1er thread de ce message.


    Voila ce que j'ai essayé :

    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
    string sqlCmd = null;
    OracleCommand cmd = null;
     
    int[] tbOracle = new int[8] {1,1,1,1,1,1,1,1};
    MonObjet [] listCb = new MonObjet[1] { new MonObjet("1","1","1","1","1","1","1","1")};
     
    sqlCmd = "NonProcedure";
    _conn.Open();
    cmd = new OracleCommand(sqlCmd, _conn);
    cmd.CommandType = CommandType.StoredProcedure;
     
    op_liste_MonObjet = new OracleParameter();
    op_liste_MonObjet.Direction = ParameterDirection.Input;
     
    op_liste_MonObjet.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
     
    op_liste_MonObjet.Value = listCb;
    op_liste_MonObjet.Size = 1;
    op_liste_MonObjet.ArrayBindSize = tbOracle;
     
    cmd.Parameters.Add(op_liste_MonObjet);
    retCode = cmd.ExecuteNonQuery();
    La classe "MonObjet" correspond au type que j'ai declaré dans le 1er thread "NomType "
    Il possède autant de propriété "string" que mon type Oracle "NomType" possède de propriété VARCHAR2.

    Le problème la dedans c'est que je ne definis jamais le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    op_liste_NomType.OracleDbType =  ?????    
    tout simplement parce je ne peux rien mettre de valable.


    Savez vous comment je peux résoudre mon problème? et si oui comment ?

    Merci d'avance.

  6. #6
    Membre confirmé
    Inscrit en
    Août 2005
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 102
    Par défaut
    En réalité , ce que je voulais faire n'est pas faisable avec une version de client oracle inférieur à la version 11 qui fonctionne très bien avec un server oracle 9.2.

    Pour ce faire, il faut utiliser "ODP.Net 11g" téléchargeable sur le site d'oracle.
    A l'installation du client oracle 11g des exemples vont être installés sur votre disque dans un sous répertoire [UDT] du répertoire HOME de l'installation.

    Pour réussir à faire cela, il faut s'inspirer des deux projets suivant :
    Object2.csproj et VArray.csproj.

    En installant ce client 11g, vous aurez a votre disposition de nouvelle propriété pour l'enumération OracleDbType et notamment la possiblité de définir des collections avec OracleDbType.Array.

    De plus lors de la création d "OracleParameter", vous aurez accès à une propriété "UdtTypeName" qui vous permettra de préciser qu'un paramètre d'entrée/sortie" d'appel à un procédure est un User Data Type Oracle.

    Pour le reste , il faut créer un custom object oracle et mapper ses propriétés avec celle du User Data Type (montrer dans les exemples).


    Je vous laisse le soin de regarder les exemples qui sont très bien fait.

    Voila.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 12/04/2011, 10h54
  2. Appel d'une procédure stockée ayant des arguments de type TABLE despuis du code C#
    Par rabddoul dans le forum Interfaces de programmation
    Réponses: 3
    Dernier message: 23/10/2008, 10h47
  3. Appels de procedures stockées dans une proc stockée ?
    Par Nadaa dans le forum MS SQL Server
    Réponses: 12
    Dernier message: 17/07/2008, 10h32
  4. Réponses: 2
    Dernier message: 16/02/2007, 18h49
  5. Réponses: 1
    Dernier message: 22/11/2006, 17h38

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