La liaison des paramètres de la requête par un nom avec ODP.NET

Je suis actuellement à l'aide de Microsoft ADO.NET provider for Oracle (System.Data.OracleClient). Je suis conscient que ce n'est certainement pas le meilleur fournisseur Oracle disponible et qu'il sera bientôt obsolète, je devrais être à l'aide d'Oracle ODP.NET au lieu de cela. La raison pour laquelle j'utilise toujours le MME fournisseur est parce que ODP.NET elle lie les paramètres par position, non par leur nom. Cela peut vraiment être un pain PITA lorsque vous utilisez de nombreux paramètres dans une requête, parce que vous devez être prudent de les ajouter dans le bon ordre, ce qui peut facilement conduire à des bugs. C'est aussi ennuyeux quand vous utilisez le même paramètre plusieurs fois dans la même requête, par exemple :

SELECT A,B,C FROM FOO WHERE X = :PARAM_X OR :PARAM_X = 0

Avec ODP.NET je dois ajouter deux paramètres à la OracleCommand, je pense que c'est stupide...

ODP.NET's OracleCommand a la propriété de changer ce comportement par défaut : BindByName. Lorsque la valeur est true, les paramètres sont liés par un nom, qui est ce que je veux. Malheureusement, ce n'est pas vraiment m'aider, parce que :

  • Il est à false par défaut
  • Je n'ai presque jamais utiliser le béton ADO.NET les classes explicitement, je préfère utiliser ADO.NET 2.0 couche d'abstraction (DbProviderFactory, DbConnection, DbCommand...) afin de réduire le couplage à un SGBDR. Donc je n'ai pas accès à la BindByName propriété, à moins que je cast explicite OracleCommand, de perdre tous les avantages ou l'abstraction.
  • Lors de l'utilisation d'un ASP.NET SqlDataSource, je n'ai pas créer le DbCommand moi-même, donc je n'ai pas eu la chance de définir BindByName vrai (je pourrais le faire dans la Sélection de l'événement, mais c'est vraiment une douleur à faire pour chaque SqlDataSource...)

Comment suis-je censé s'occuper de ce problème ? Est-il un BindByNameByDefault réglage quelque part ? (Je n'ai pas trouver quelque chose comme ça, mais j'ai peut-être raté...)

Je viens de perdre 3 heures à cause de cette "fonctionnalité"!

OriginalL'auteur Thomas Levesque | 2009-06-25