Erreur Oracle: PLS-00306: nombre incorrect ou types d'arguments

.net dapper odp.net oracle stored-procedures

Question

J'utilise Dapper et ODP.Net pour appeler une procédure stockée. Je me sens stupide de ne pas trouver ce qui ne va pas avec mes paramètres, mais voilà:

Voici la signature de la procédure stockée:

PROCEDURE SP_NETWORK_GETALL(UserLogon IN VARCHAR2, NetworkVersionList OUT refCursor)

Et voici mon appel .Net:

using (var conn = new OracleConnection(connString))
{
    var parameters = new List<OracleParameter>
    {
        new OracleParameter()
        {
            Direction = ParameterDirection.Input,
            ParameterName = "UserLogon",
            OracleDbType = OracleDbType.Varchar2,
            Size = 4000,
            Value = "TEST"
        },
        new OracleParameter()
        {
            Direction = ParameterDirection.Output,
            OracleDbType = OracleDbType.RefCursor,
            ParameterName = "NetworkVersionList",
            Value = DBNull.Value
        },
    };

    var results = conn.Query("SDTM.PKG_SP_GET.SP_NETWORK_GETALL", parameters, commandType: CommandType.StoredProcedure);
}

J'ai essayé cette procédure stockée, ça marche. J'ai utilisé Dapper pour d'autres procédures stockées, cela fonctionne également. J'ai essayé de modifier l'ordre des paramètres (le curseur de référence en premier), de définir la taille du paramètre VarChar2 ou non, DBNull.Value pour le curseur ref ou non.

J'ai vu un million de questions comme celle-ci sur stackoverflow ou sur internet, mais je ne vois pas la disparité des paramètres ici ...

Réponse acceptée

Le problème est que vous envoyez une liste d'objets OracleParameter à la variable "paramètres" de dapper. Dapper est censé être indépendant du fournisseur et vous envoyez des types spécifiques au fournisseur.

Jetez un oeil à la méthode GetCacheInfo dans le code Dapper et vous verrez trois cas dans la façon dont dapper tente de gérer les paramètres:

  1. Un objet de IDynamicParameters
  2. Un objet de IEnumerable <KeyValuePair <string, object >>
  3. Default / Else - Essayez de trouver des propriétés dans votre objet qui correspondent aux jetons de la commande.

Vous tombez probablement dans le cas par défaut, mais comme vous avez un proc, il n'y a pas de jeton dans la commande et aucun paramètre n'est ajouté. Même si c’était le cas, il s’agirait probablement de rechercher les propriétés de type List <> et cela ne permettrait pas de trouver une correspondance.

L'ajout d'IDynamicParameters vous permet de contrôler les paramètres et c'est pourquoi cela fonctionne. Cela n'a rien à voir avec odp.net.

Je suppose que c'est un de mes soucis avec Dapper comme avec tous les ORM - aussi dur qu'ils essaieront, il y aura toujours des choses spécifiques au fournisseur qui ne peuvent pas être retirées. C'est pourquoi je préfère simplement configurer la commande spécifique au fournisseur, puis utiliser une classe d'utilitaire qui ne fait que le mappage (sans se préoccuper de la connexion / configuration / exécution).



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi