Lier les paramètres de la requête par nom avec ODP.NET

J'utilise actuellement Microsoft ADO.NET fournisseur D'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 utiliser Oracle ODP.NET a la place. La raison pour laquelle j'utilise toujours MS provider est parce que ODP.NET lie les paramètres par position, et non par son nom. Cela peut vraiment être un PITA quand vous utilisez de nombreux paramètres dans une requête, parce que vous devez faire attention à les ajouter dans le bon ordre, ce qui peut facilement conduire à des bogues. 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 à l' OracleCommand, je pense que c'est stupide...

ODP.NET ' s OracleCommand possède une propriété pour changer ce comportement par défaut:BindByName. Une fois défini à true, les paramètres sont liés par le nom, ce qui est ce que je veux. Malheureusement, cela ne m'aide pas vraiment, parce que :

  • C'est à false par défaut
  • Je n'utilise presque jamais de béton ADO.NET les classes explicitement, je préfère utiliser ADO.NET 2.0 couche d'abstraction (DbProviderFactory,DbConnection,DbCommand...) pour réduire l'accouplement à des RDBM spécifiques. Donc je n'ai pas accès à la BindByName propriété, sauf si je jette explicitement à OracleCommand, de perdre tous les avantages ou l'abstraction.
  • lors de l'utilisation d'un ASP.NET SqlDataSource, Je ne crée pas le DbCommand moi-même, possibilité 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 puis-je gérer ce problème ? Est-il un vous installez quelque part ? (Je n'ai rien trouvé de tel, mais je l'ai peut-être manqué...)

16
demandé sur Thomas Levesque 2009-06-26 03:04:24

3 réponses

je pense que vous pouvez créer votre propre fournisseur qui utilise les valeurs par défaut que vous souhaitez utiliser. Vous pouvez créer ce fournisseur facilement en héritant toutes les classes de odp.net, il suffit d'ajuster certaines propriétés comme BindByName.

le DbProviderfactory va créer vos classes au lieu des classes normales odp.net les cours.

7
répondu Theo 2009-06-26 09:19:55

Utiliser l'héritage et l'héritage! Si vous effectuez l'accès aux données par le biais d'une classe de base de données abstraite, vous avez besoin de l'implémentation de la base de données.

public abstract class Database
{
    private readonly DbProviderFactory factory;

    protected Database(DbProviderFactory factory)
    {
        this.factory = factory;
    }

    public virtual DbCommand CreateCommand(String commandText)
    {
        return CreateCommand(CommandType.Text, commandText);
    }

    public virtual DbCommand CreateCommand(CommandType commandType, String commandText)
    {
        DbCommand command = factory.CreateCommand();
        command.CommandType = commandType;
        command.Text = commandText;
        return command;
    }

    public virtual void BindParametersByName(DbCommand command)
    {

    }
}

et choisir de créer une implémentation spécifique à Oracle qui supplante la création de commandes par défaut ou fournit l'option de lier les paramètres par nom.

public class OracleDatabase : Database
{
    public OracleDatabase()
        : base(OracleClientFactory.Instance)
    {

    }

    public override DbCommand CreateCommand(CommandType commandType, String commandText)
    {
        DbCommand command = base.CreateCommand(commandType, commandText);
        BindParametersByName(command);
        return command;
    }

    public override void BindParametersByName(DbCommand command)
    {
        ((OracleCommand)command).BindByName = true;
    }
}

Code basé sur le Bloc D'Application Accès Aux Données dans le Enterprise Bibliothèque.

4
répondu Anthony Mastrean 2009-07-28 20:09:25

en ce qui concerne la suppression du fournisseur Microsoft ADO .NET pour Oracle:

  • je vais continuer à l'utiliser à la place D'ODP .NET, votre problème n'étant qu'un des nombreux problèmes avec lui. Et comme il va, il sera toujours disponible en .net 4.0, bien que non pris en charge.
  • si Oracle parvient à rendre ce fournisseur inutilisable, je choisirai probablement une alternative commerciale comme DataDirect ADO.NET fournisseur de données pour Oracle ou dotConnect pour Oracle, qui s'intègrent pleinement dans le cadre D'ADO.NET. Et ils soutiennent déjà le cadre D'entité, soit dit en passant (je crois Qu'Oracle a déclaré ODP .NET ne le ferait pas).

ODP. net a déjà pris trop de temps.

1
répondu Mac 2011-03-25 09:21:47