对于ODP.NET,有没有办法强制OracleCommand.BindByName为true?

rjz*_*zii 6 .net oracle refactoring odp.net system.data.oracleclient

由于不推荐使用System.Data.OracleClient库,因此我们正在迁移代码库以使用Oracle Data Provider for .NET(ODP.NET).我们遇到的一个问题是System.Data.OracleClient使用参数名绑定而不是按位置绑定,并且所有代码都直接访问System.Data.OracleClient.OracleCommand而不是使用中间数据层.

由于存在相当多的代码,是否有一种简单的方法可以强制ODP.NET OracleCommand.BindByName默认为true,或者我们必须在每次使用它时设置值?如果失败了,是否有一种简单的方法可以在Visual Studio 2008中插入这行代码?

小智 12

我没试过,但是,

我见过类似的东西

" cmd.GetType().GetProperty("BindByName").SetValue(cmd,true,null);"在PetaPoco.cs文件中.

也许它可以帮助.


Bra*_*der 9

我知道这个帖子已经过时了,但我今天遇到了同样的问题,并且认为我会分享我的解决方案以防其他人遇到这个问题.由于OracleCommand是密封的(很糟糕),我创建了一个封装OracleCommand的新类,在实例化时将BindByName设置为true.以下是实施的一部分:

public class DatabaseCommand
{
    private OracleCommand _command = null;

    public DatabaseCommand(string sql, OracleConnection connection)
    {
        _command = new OracleCommand(sql, connection)
        {
            BindByName = true
        };
    }

    public int ExecuteNonQuery()
    {
        return _command.ExecuteNonQuery();
    }

    // Rest of impl removed for brevity
}
Run Code Online (Sandbox Code Playgroud)

然后我需要做的就是清理命令,然后搜索OracleCommand并用DatabaseCommand替换并测试.

  • DatabaseCommand应该实现IDisposable,因为OracleCommand是从实现它的DbCommand派生的. (9认同)

小智 5

将 ASPX 代码移植到 Oracle.DataAcees.Client 后,我​​遇到了与 SqlDataSource Update 命令相同的问题,并通过更改 SqlDataSource OnUpdating 处理程序中的 OracleCommand.BindByName 属性解决了这个问题,如下所示:

protected void SqlDataSource_Updating(object sender, SqlDataSourceCommandEventArgs e)
{
    Oracle.DataAccess.Client.OracleCommand b_OracleCommand = 
                  (Oracle.DataAccess.Client.OracleCommand)e.Command;
    b_OracleCommand.BindByName = true;
}
Run Code Online (Sandbox Code Playgroud)


小智 5

使用 Oracle.ManagedDataAccess.Client,您可以在 app.config 中进行配置:

<oracle.manageddataaccess.client>
<version number="*">
  <dataSources>
    <dataSource alias="SampleDataSource" descriptor="(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCL))) " />
  </dataSources>
  <settings>
    <setting name="BindByName" value="True"/>
  </settings>
</version></oracle.manageddataaccess.client>
Run Code Online (Sandbox Code Playgroud)