Есть ли способ заставить OracleCommand.BindByName быть истинным по умолчанию для ODP.NET? - PullRequest
6 голосов
/ 01 февраля 2010

Поскольку библиотека System.Data.OracleClient устарела , мы находимся в процессе миграции нашей кодовой базы для использования Oracle Data Provider для .NET (ODP.NET) вместо. Одна из проблем, с которой мы столкнулись, заключается в том, что System.Data.OracleClient использует привязку имени параметра, а не привязку по позиции, и весь код напрямую обращается к System.Data.OracleClient.OracleCommand , а не к используя промежуточный слой данных.

Поскольку кода довольно много, существует ли простой способ заставить ODP.NET OracleCommand.BindByName быть истинным по умолчанию, или мы должны проходить и устанавливать значение каждый раз, когда оно используется? В противном случае, есть ли простой способ вставить эту строку кода в Visual Studio 2008?

Ответы [ 6 ]

12 голосов
/ 02 сентября 2011

Я не пробовал, но

Я видел что-то вроде

"cmd.GetType().GetProperty("BindByName").SetValue(cmd,true,null);" в файле PetaPoco.cs.

Возможно, это может помочь.

8 голосов
/ 20 апреля 2011

Я знаю, что эта ветка старая, но у меня была такая же проблема сегодня, и я подумал, что поделюсь своим решением на случай, если у кого-то еще возникнет эта проблема.Поскольку 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 и протестировать.

4 голосов
/ 19 декабря 2012

У меня была такая же проблема с командами обновления SqlDataSource после переноса кода ASPX в Oracle.DataAcees.Client, и я решил ее, изменив свойство OracleCommand.BindByName в обработчике SqlDataSource OnUpdating следующим образом:

protected void SqlDataSource_Updating(object sender, SqlDataSourceCommandEventArgs e)
{
    Oracle.DataAccess.Client.OracleCommand b_OracleCommand = 
                  (Oracle.DataAccess.Client.OracleCommand)e.Command;
    b_OracleCommand.BindByName = true;
}
0 голосов
/ 19 апреля 2016

Я решил эту проблему, установив свойство BindByName в обработчике события обновления SqlDataSource:

protected void SqlDataSource1_Updating(object sender, SqlDataSourceCommandEventArgs e)
{
    ((Oracle.ManagedDataAccess.Client.OracleCommand)e.Command).BindByName = true;
    // ...
}
0 голосов
/ 04 мая 2014

Сократить # строк кода

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 };
0 голосов
/ 25 июня 2011

Добавьте частичный класс для вашего 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;
            }
        }
...