使用ODP.NET按名称绑定查询参数
我目前正在使用Oracle的Microsoft ADO.NET提供程序( System.Data.OracleClient
)。 我知道它肯定不是最好的Oracle提供商,它很快就会被弃用 ,我应该使用Oracle的ODP.NET。 我仍然使用MS提供程序的原因是因为ODP.NET按位置绑定参数 ,而不是按名称绑定 。 当您在查询中使用许多参数时,这实际上可以是PITA,因为您必须小心地以正确的顺序添加它们,这很容易导致错误。 在同一查询中多次使用相同参数时也很烦人,例如:
SELECT A,B,C FROM FOO WHERE X = :PARAM_X OR :PARAM_X = 0
使用ODP.NET,我必须向OracleCommand
添加两个参数,我认为这是愚蠢的……
ODP.NET的OracleCommand
具有更改默认行为的属性: BindByName
。 设置为true时,参数按名称绑定,这就是我想要的。 不幸的是,这对我没有帮助,因为:
我该如何处理这个问题? 某处有BindByNameByDefault
设置吗? (我没有找到类似的东西,但我可能错过了……)
我认为您可以创建自己的提供程序,使用您要使用的默认值。 您可以通过从odp.netinheritance所有类来轻松创建该提供程序,只需调整一些属性,如BindByName。
DbProviderfactory将创建您的类而不是普通的odp.net类。
使用间接和inheritance! 如果您通过抽象数据库类执行数据访问,则需要数据库实现句柄参数绑定。
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) { } }
并选择创建一个覆盖默认命令创建的Oracle特定实现,或者提供按名称绑定参数的选项。
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; } }
基于企业库中的数据访问应用程序块的代码。
至于停止使用Oracle的Microsoft ADO .NET提供程序:
ODP .NET已经占用了我太多的时间。
上述就是C#学习教程:使用ODP.NET按名称绑定查询参数分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1030596.html