Параметризованный запрос в проблеме Oracle - PullRequest
17 голосов
/ 12 мая 2011

Я использую Oracle.DataAccess вместо устаревшего System.Data.OracleClient, и у меня, похоже, возникают проблемы с передачей нескольких параметров в мой запрос на обновление

Это работает

OracleCommand.CommandText = "UPDATE db SET column1 = :param1 WHERE column2 = 'Y'"
OracleCommand.Parameters.Add(New OracleParameter("param1", "1234"))

Но яхочу иметь возможность передавать несколько параметров

Вот мой полный код

    OracleConn.Open()
    OracleCommand = OracleConn.CreateCommand()
    OracleCommand.CommandText = "UPDATE db SET column1 = :param1 WHERE column2 = :param2"
    OracleCommand.CommandType = CommandType.Text
    OracleCommand.Parameters.Add(New OracleParameter("param1", "1234"))
    OracleCommand.Parameters.Add(New OracleParameter("param2", "Y"))
    OracleCommand.ExecuteNonQuery()

Мой SELECT запрос, кажется, работает при передаче нескольких параметров, но не обновляет один

Ответы [ 6 ]

30 голосов
/ 19 мая 2011

Хотя я не вижу ничего плохого в вашем примере, мне интересно, если вы столкнулись со старой проблемой BindByName. По умолчанию ODP.NET связывает параметры с запросом в том порядке, в котором они добавляются в коллекцию, а не на основе их имени, как вам бы того хотелось. Попробуйте установить BindByName на true на вашем OracleCommand объекте и посмотрите, решит ли это проблему.

У меня была такая проблема так много раз, что я использую свой собственный фабричный метод для создания команд, который автоматически устанавливает для меня это свойство true.

Классическая бесполезная документация Oracle здесь

4 голосов
/ 19 мая 2011

Чтобы эмулировать поведение System.Data.OracleClient по умолчанию, вы должны установить для OracleCommand привязку по имени.

OracleCommand.BindByName = True
2 голосов
/ 19 мая 2011

Попробуйте обновить OracleParameter с указанным типом. Установите значение объекта перед добавлением его в список параметров.

var param1 = new OracleParameter( "param1", OracleType.Int32 );
param1.Value = "1234";

OracleCommand.Parameters.Add( param1 );
1 голос
/ 03 июня 2011

Попробуйте, надеюсь, это работает.Это компилируется.Не уверен, что вам также нужно отправить коммит ...Я всегда делаю подобные вещи через хранимую процедуру, поэтому у меня есть коммит после оператора update в хранимой процедуре.

Harvey Sather

        OracleConnection ora_conn = new OracleConnection("connection string");

        OracleCommand ora_cmd = new OracleCommand("UPDATE db SET column1 = :param1 WHERE column2 = :param2", ora_conn);
        ora_cmd.CommandType = CommandType.Text;
        ora_cmd.BindByName = true;

        ora_cmd.Parameters.Add(":param1", OracleDbType.Varchar2, "1234", ParameterDirection.Input);
        ora_cmd.Parameters.Add(":param2", OracleDbType.Varchar2, "Y", ParameterDirection.Input);

        ora_cmd.ExecuteNonQuery();                
0 голосов
/ 13 мая 2011

Вот тип структуры, которую я обычно использую (извините, это из памяти):

int rows = 0;
using ( OracleConnection conn = new OracleConnection(connectionString) ) {
  using ( OracleCommand cmd = conn.CreateCommand() ) {
    cmd.CommandText = "UPDATE table SET column1 = ':p1 WHERE column2 = :p2";
    cmd.CommandType = CommandType.Text;
    cmd.Parameters.AddWithValue(":p1", p1Val);
    cmd.Parameters.AddWithValue(":p2", p2Val);
    rows = cmd.ExecuteNonQuery();
  }
}

Ключевым отличием является использование AddWithValue - я не помню, почему я в конечном итоге использовал это, но помните, что у вас были проблемы с некоторыми другими способами сделать это.

0 голосов
/ 12 мая 2011

Первый блок кода правильный: используйте двоеточие перед именем параметра, но не в первом аргументе OracleParameter.

Если не выдано никаких ошибок, возможно, что UPDATE выполняется успешно,он просто не обновляет записи на основе предложения WHERE и значения его замещенного параметра.Попробуйте сделать это на тестовой таблице без предложения WHERE в ОБНОВЛЕНИИ, чтобы убедиться, что он что-то делает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...