8

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

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

4

7 回答 7

13

我没试过,但是,

我见过类似的东西

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

也许它可以提供帮助。

于 2011-09-02T11:37:38.160 回答
10

我知道这个线程很旧,但我今天遇到了同样的问题,我想我会分享我的解决方案,以防其他人遇到这个问题。由于 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
}

然后,我需要做的就是清理命令,搜索 OracleCommand 并替换为 DatabaseCommand 并进行测试。

于 2011-04-20T13:21:44.803 回答
5

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

protected void SqlDataSource_Updating(object sender, SqlDataSourceCommandEventArgs e)
{
    Oracle.DataAccess.Client.OracleCommand b_OracleCommand = 
                  (Oracle.DataAccess.Client.OracleCommand)e.Command;
    b_OracleCommand.BindByName = true;
}
于 2012-12-19T09:49:09.803 回答
3

使用 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>
于 2019-08-26T11:47:14.160 回答
1

我解决了在 SqlDataSource 更新事件的处理程序中设置 BindByName 属性的问题:

protected void SqlDataSource1_Updating(object sender, SqlDataSourceCommandEventArgs e)
{
    ((Oracle.ManagedDataAccess.Client.OracleCommand)e.Command).BindByName = true;
    // ...
}
于 2016-04-19T12:52:45.250 回答
0

使用以下代码为您的 TableAdapter 添加部分类,并根据需要添加方法或属性:

        for (int i = 0; (i < this.CommandCollection.Length); i = (i + 1))
        {
            if ((this.CommandCollection[i] != null))
            {
                ((global::Oracle.DataAccess.Client.OracleCommand)(this.CommandCollection[i])).BindByName = value;
            }
        }
于 2011-06-25T11:24:31.870 回答
-2

减少 # 行代码

VB.NET

Dim command As OracleCommand = New OracleCommand(query, connection) With {.CommandType = CommandType.StoredProcedure, .BindByName = True}

C#

OracleCommand command = new OracleCommand(query, connection) { CommandType = CommandType.StoredProcedure, BindByName = true };
于 2014-05-04T01:50:46.117 回答