2015-10-22 1 views
0

Я использую .net 4.5.1, приложение командной строки Windows с использованием Oracle.DataAccess (ODP.NET) x86 2.122.1.0.C# Oracle 9i - Обновление двойного значения с использованием параметра не работает

где tran - транзакция базы данных Oracle.

OracleCommand updCmd = 
     new OracleCommand("update mytable set price =0.5 where anseq = :p_id", tran.Connection); 
updCmd.Transaction = tran; 
updCmd.Parameters.Add("p_id", itemId); 
var count= updCmd.ExecuteNonQuery(); 

count == 1

тогда:

OracleCommand updCmd = 
     new OracleCommand("update mytable set price =:p_price where anseq = :p_id", tran.Connection); 
updCmd.Transaction = tran; 
updCmd.Parameters.Add("p_id", itemId); 
updCmd.Parameters.Add("p_price", 0.5); 
var count= updCmd.ExecuteNonQuery(); 

count == 0

Даже явно устанавливая тип параметра:

updCmd.Parameters.Add(
    new OracleParameter("p_price", 
      OracleDbType.Double, 
      22, System.Data.ParameterDirection.Input, 
      false, 16, 2, "myprice", 
      System.Data.DataRowVersion.Default, 0.5)); 

Результаты не обновляются.

Кто-нибудь испытал эту проблему раньше или имеет представление о том, что может вызвать ее?

ТИА

+1

Вы пытались изменить порядок параметров.Add? для добавления первой цены, затем itemId? –

+0

нет, зачем мне это делать !!!! но, конечно, это работает. если вы знаете, почему, пожалуйста, напишите как ответ – sambomartin

+0

рад, что это вам помогло. AFAIK, в pl/sql порядок или привязки очень важен. Другими словами, если вы не привязываетесь по имени, вы связываете его по заказу. –

ответ

0

Хорошо, хорошо Заслуга Флорин для выделения проблемы.

Я сделал еще несколько копаний и нашел, что проблема была вызвана дизайном!

Объект OracleCommand имеет значение BindByName, которое является false по умолчанию.

Как видно из этого так оставлять C# parameterized queries for Oracle - serious & dangerous bug! вы можете увидеть по умолчанию имена параметров полностью игнорируются драйвером ODP.NET если BindByName свойство не true.

Ответ на мой вопрос, как определил Флорин, состоял в том, чтобы изменить порядок добавления параметров - ИЛИ - как я впоследствии выяснил, установить BindByName=true.

 Смежные вопросы

  • Нет связанных вопросов^_^