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

ASP.NET Discussion :

ASP.NET C# Fonctions Stockée dans Oracle via ODBC avec paramètres


Sujet :

ASP.NET

  1. #1
    Candidat au Club
    Inscrit en
    Janvier 2010
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 8
    Points : 4
    Points
    4
    Par défaut ASP.NET C# Fonctions Stockée dans Oracle via ODBC avec paramètres
    Bonjour à tous,

    Je viens prendre des conseils auprès de vous en désespoir de cause.

    Cela fait une semaine que je cherche la réponse sur ce forum et sur d'autre et je n'ai pas trouvé. (mais peut être ai-je mal cherché !)..;

    Mon problème est le suivant :

    Je cherche à récupérer le résultat d'un fonction stockée sur Oracle avec mon code C#.

    Je suis bien sur au courant de l'objet command, de l'objet parameter et de l'option Command.type = Text ou StoredProcedure.

    Après avoir déclaré les variables qui vont bien, je tape le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Comm.CommandType = CommandType.Text; //(ou StoredProcedure)
     
    Comm.CommandText = "SELECT * FROM fc_getListeDotNet(WE,PAYS,4);";
     
    OdbcDataReader dr = Comm.ExecuteReader();
    Et à l'exécution, je me prend le message suivant :

    System.Data.Odbc.OdbcException: ERROR [42000] [Microsoft][ODBC driver for Oracle][Oracle]ORA-00933: La commande SQL ne se termine pas correctement
    Voici la signature de la fonction Oracle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    TYPE rcd is RECORD("CODE" varchar(2),"LIBS" varchar(50));
     
    Type WTbl is TABLE of rcd;
     
    FUNCTION fc_getListeDotNet(
    		CANA_COMM				IN char,
    		TYPE_LIST				IN char,
    		TYPE_TRI				IN integer
    	) RETURN WTbl;
    Je ne comprend pas !!! D'autant plus que la même instructinon exécuté dans TOAD (équivalent de Oracle sql developpeur) fonction très bien !!

    Je vous remercie par avance de votre aide !

    Mallory

  2. #2
    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 : 37
    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 080
    Points
    8 080
    Par défaut
    Pourquoi utiliser le provider ODBC? Il vaut mieux utiliser le provider fourni par Oracle : ODP.Net

  3. #3
    Candidat au Club
    Inscrit en
    Janvier 2010
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Cela m'est imposé par le client.

  4. #4
    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 : 37
    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 080
    Points
    8 080
    Par défaut
    Ouch! Tu peux dire à ton client que les performances ne seront pas top!
    Bref, peux tu essayer sans mettre le ; à la fin de la requête?

  5. #5
    Candidat au Club
    Inscrit en
    Janvier 2010
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    C'est la même chose.

  6. #6
    Rédacteur

    Avatar de Jean-Michel Ormes
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2007
    Messages
    1 838
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Services à domicile

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 838
    Points : 4 574
    Points
    4 574
    Par défaut
    Salut,

    Je m'y connais pas du tout en Oracle (je suis plutôt SQL Server) mais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT * FROM fc_getListeDotNet(WE,PAYS,4);
    Manquerait pas des simples quotes pour tes char ?

  7. #7
    Candidat au Club
    Inscrit en
    Janvier 2010
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Avec des simples ou double cotes cela ne marche pas non plus.

    Mais en fait, même dans oracle l'instruction de fonctionne pas...

  8. #8
    Candidat au Club
    Inscrit en
    Janvier 2010
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Le but de toute ces manoeuvre est :

    - Sélectionner tout les enregistrement d'une table (PAYS par exemple).
    - De classer de manière personaliser les enregistrement au sein d'une structure oracle temporaire ne prenant que 2 colonne de la table pays.
    - De retourner la table temporaire pour que je puisse la récupérer en dotnet (C#)

  9. #9
    Candidat au Club
    Inscrit en
    Janvier 2010
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Bonjour,

    Je vous remercie tous de votre aide !!

    Finalement, il s'avère que cela n'est pas possible vu que leur connecteur odbc date de Matusalem et qu'il ne connait pas les curseurs (dixit le dba).

    J'ai donc résolu le problème en passant par l'espace de nom System.Data.OracleClient du Framework .net. Et cela marche comme un charme !

    Pour ceux qui tomberai sur ce fil de discussion et qui souhaite avoir la réponse (car un simple "ça marche" peut être frustrant...) :

    La fonction PL/SQL de départ revient un procédure stockée avec 2 paramètre IN et un paramètre OUT de type CURSOR.

    Avec des simples "OracleDataReader", OracleCommande et parameter, la messe est dite.

    Voici le coté PL SQL (Type et signature de fonction):

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    TYPE lRefCursor is REF CURSOR;
     
    PROCEDURE ps_getListeDotNet(
    	CANA_COMM				IN char,
    	TYPE_LIST				IN char,
    	TYPE_TRI				IN integer,
    	CURS					OUT lRefCursor);

    Et voici le côté C# :

    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    private DataView nomDeMaFonction(String nomTable, int TypeDeTri)
            {
                try
                {
     
                    //Data table qui récupère les données de Oracle
                    DataTable Oracle_dt = new DataTable();
     
                    //Data table qui recevant les données de Oracle_dt retraité
                    //et servant à créer le DataView de retour
                    DataTable Returned_dt = new DataTable();
                    Returned_dt.Columns.Add("Value");
                    Returned_dt.Columns.Add("Text");
     
                    //Ajout du choix "Sélectionnez"
                    DataRow dr = Returned_dt.NewRow();
                    dr["Value"] = "";
                    dr["Text"] = "-Sélectionnez-";
                    Returned_dt.Rows.Add(dr);
     
                    //Récupération de la chaîne de connection
                    System.Configuration.Configuration rootWebConfig =
    		        System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("/");
                    System.Configuration.ConnectionStringSettings connString = rootWebConfig.ConnectionStrings.ConnectionStrings["TrueOraConnectionString"];
     
                    // Création de l'objet Oracle Connection
                    OracleConnection cnn = new OracleConnection(connString.ConnectionString);
     
                    //Initialisation de l'objet Command et de ses paramètres
                    OracleCommand Comm = new OracleCommand();
                    OracleParameter param_Cana_Com = new OracleParameter();
                    OracleParameter param_Type_List = new OracleParameter();
                    OracleParameter param_Type_Tri = new OracleParameter();
                    OracleParameter param_Type_Sorti = new OracleParameter();
     
                    //Définition de la connection pour l'objet Commande
                    Comm.Connection = cnn;
     
                    //Type de Commande
                    Comm.CommandType = CommandType.StoredProcedure;
     
                    //Nom de la procédure sotkcée
                    Comm.CommandText = "nomDePackage.nomDeMaProcedure";
     
                    /**********************************
                     * Paramètres d'entrée
                     * ********************************/
     
                    //Paramètre Canal de Comm
                    param_Cana_Com.ParameterName = "NomDeMonParametreCanal";
                    param_Cana_Com.OracleType = OracleType.VarChar;
                    param_Cana_Com.Size = 2;
                    param_Cana_Com.Direction = ParameterDirection.Input;
                    param_Cana_Com.Value = "WE";
                    Comm.Parameters.Add(param_Cana_Com);
     
                    //Paramètre Type de Liste
                    param_Type_List.ParameterName = "NomDeMonParametreTable";
                    param_Type_List.OracleType = OracleType.VarChar;
                    param_Type_List.Size = 4;
                    param_Type_List.Direction = ParameterDirection.Input;
                    param_Type_List.Value = nomTable;
                    Comm.Parameters.Add(param_Type_List);
     
                    //Paramètre Type de tri
                    param_Type_Tri.ParameterName = "NomDeMonParametreTypeTri";
                    param_Type_Tri.OracleType = OracleType.Int32;
                    param_Type_Tri.Direction = ParameterDirection.Input;
                    param_Type_Tri.Value = TypeDeTri;
                    Comm.Parameters.Add(param_Type_Tri);
     
                    /**********************************
                     * Paramètres de sortie
                     * ********************************/
     
                    // Curseur des enregistrements
                    param_Type_Sorti.ParameterName = "NomDeMonParametreCurs";
                    param_Type_Sorti.OracleType = OracleType.Cursor;
                    param_Type_Sorti.Direction = ParameterDirection.Output;
                    Comm.Parameters.Add(param_Type_Sorti);
     
                    //Data Adapter récupérant les donnée
                    OracleDataAdapter da = new OracleDataAdapter(Comm);
     
                    //Peuplement du DataTable de récupération des donnée Oracle
                    da.Fill(Oracle_dt);
     
                    //Je renomme les colonnes du DataTable pour harmonisé le code par la suite (DataBinding)
                    foreach (DataColumn dc in Oracle_dt.Columns)
                    {
                        if (dc.ColumnName.Contains("CODE"))
                        {
                            dc.ColumnName = "Value";
                        }
     
                        if (dc.ColumnName.Contains("LIB"))
                        {
                            dc.ColumnName = "Text";
                        }
                    }
     
                    //J'ajoute chaque enregitrement dans le DataTable retraité
                    foreach (DataRow drw in Oracle_dt.Rows)
                    {
                        DataRow ndr = Returned_dt.NewRow();
                        ndr["Text"] = drw["Text"];
                        ndr["Value"] = drw["Value"];
                        Returned_dt.Rows.Add(ndr);
                    }
     
                    //Je ferme la connection
                    cnn.Close();
     
                    //Je retourne mon DataView
                    return new DataView(Returned_dt);
     
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }

    Voilà ! J'espère avoir aidé quelqu'un !

  10. #10
    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 : 37
    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 080
    Points
    8 080
    Par défaut
    Comme je le mettais dans mon premier message: attention aux connecteurs pour Oracle!
    Notamment celui que tu as utilisé est déprécié et déconseillé dans la doc officielle:
    http://msdn.microsoft.com/en-us/library/77d8yct7.aspx
    The types in System.Data.OracleClient are deprecated. The types are supported in version 4 of the .NET Framework but will be removed in a future release. Microsoft recommends that you use a third-party Oracle provider.

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

Discussions similaires

  1. Stocker Image dans Oracle via VB.net
    Par sisiniya dans le forum VB.NET
    Réponses: 20
    Dernier message: 25/06/2010, 20h28
  2. [Asp.Net] Mettre un gridview dans un courriel
    Par Kiboumz dans le forum ASP.NET
    Réponses: 3
    Dernier message: 08/03/2007, 10h05
  3. [ASP.NET] Ajouter un noeud dans le web.config
    Par mafyoso dans le forum ASP.NET
    Réponses: 3
    Dernier message: 23/02/2007, 07h05
  4. Réponses: 1
    Dernier message: 20/02/2007, 13h43
  5. Importer via asp.net c# des variables dans mon namespace xsl
    Par akaii dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 23/01/2006, 08h41

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