使用ODP.NET按名称绑定查询参数

Tho*_*que 17 c# oracle ado.net odp.net

我目前正在使用Oracle(System.Data.OracleClient)的Microsoft ADO.NET提供程序.我知道它肯定不是最好的Oracle提供商,它很快就会被弃用,我应该使用Oracle的ODP.NET.我仍然使用MS提供程序的原因是因为ODP.NET按位置绑定参数,而不是按名称绑定.当您在查询中使用许多参数时,这实际上可能是PITA,因为您必须小心以正确的顺序添加它们,这很容易导致错误.在同一查询中多次使用相同参数时也很烦人,例如:

SELECT A,B,C FROM FOO WHERE X = :PARAM_X OR :PARAM_X = 0
Run Code Online (Sandbox Code Playgroud)

使用ODP.NET,我必须添加两个参数OracleCommand,我认为这是愚蠢的......

ODP.NET OracleCommand有一个属性来改变默认行为:BindByName.设置为true时,参数按名称绑定,这就是我想要的.不幸的是,这对我没有帮助,因为:

  • 默认设置为false
  • 我几乎从来不使用混凝土ADO.NET类明确,我更喜欢使用ADO.NET 2.0抽象层(DbProviderFactory,DbConnection,DbCommand...),以减少连接到任何特定的RDBMS.所以我没有访问该BindByName属性,除非我明确地转换OracleCommand,失去所有的好处或抽象.
  • 当使用ASP.NET SqlDataSource时,我自己不创建DbCommand,所以我没有机会设置BindByName为true(我可以在Selecting事件中做到这一点,但是对于每个事件来说真的很难SqlDataSource的...)

我该如何处理这个问题?BindByNameByDefault某处有设置吗?(我没有找到类似的东西,但我可能错过了......)

The*_*heo 7

我认为您可以创建自己的提供程序,使用您要使用的默认值.您可以通过从odp.net继承所有类来轻松创建该提供程序,只需调整一些属性,如BindByName.

DbProviderfactory将创建您的类而不是普通的odp.net类.

  • 好吧,这似乎是可行的,但不是很简单...大多数ODP.NET类是密封的,所以我不能从它们继承来覆盖方法,并且根据Reflector有很多地方显式调用OracleCommand构造函数.无论如何,我想不出更好的解决方案,所以我接受你的回答.谢谢 ! (2认同)