2016-04-15 8 views
0

Я занимаюсь некоторым обслуживанием в устаревшем приложении, использующем OracleConnection и OracleCommand для управления нашими данными. У меня возникла проблема, когда определенное обновление не работает, когда я использую параметры, но если я конвертирую один и тот же оператор в интерполированную строку, он работает нормально. Я не получаю никаких исключений, обновления просто не происходит, и возвращает 0 для обновленных строк. Я делаю другие обновления с параметрами, поэтому мне интересно, если кто-нибудь увидит что-то, что я мог пропустить с этим. Я попытался с/без транзакции, а также явно создавал объекты OracleParameter без каких-либо последствий.OracleCommand Update работает с интерполированным SQL, но не с параметризированным

Метод ниже. Я оставил параметризованную версию и параметр, закомментированный для справки.

public int UpdateBusinessEntitlement(int appId, int businessId, int entitlementTypeId, string sso) 
    { 

     // Non-Working Parameterized Version 
     //var sql = "UPDATE APD.APD_BUS_TO_APP_MAP " + 
     //     "SET ENTITLEMENT_TYPE_SEQ_ID = :entitlementTypeId, " + 
     //     "LAST_UPDATE_DATE = SYSDATE, " + 
     //     "LAST_UPDATED_BY = :lastUpdatedBy " + 
     //     "WHERE APP_SEQ_ID = :appId AND BUSINESS_SEQ_ID = :businessId"; 

     var sql = "UPDATE APD.APD_BUS_TO_APP_MAP " + 
       $"SET ENTITLEMENT_TYPE_SEQ_ID = {entitlementTypeId}, " + 
       "LAST_UPDATE_DATE = SYSDATE, " + 
       $"LAST_UPDATED_BY = {sso} " + 
       $"WHERE APP_SEQ_ID = {appId} AND BUSINESS_SEQ_ID = {businessId}"; 


     using (var cn = _connectionBuilder.GetUpdaterConnection()) 
     { 
      using (var cmd = _connectionBuilder.GetCommand(sql, cn)) 
      { 
       cn.Open(); 
       var transaction = cn.BeginTransaction(IsolationLevel.ReadCommitted); 
       cmd.Transaction = transaction; 

       //cmd.Parameters.Add("appId", appId); 
       //cmd.Parameters.Add("businessId", businessId); 
       //cmd.Parameters.Add("entitlementTypeId", entitlementTypeId); 
       //cmd.Parameters.Add("lastUpdatedBy", sso); 


       var rows = cmd.ExecuteNonQuery(); 
       transaction.Commit(); 

       return rows; 
      } 
     } 
    } 

ответ

2

Я подозреваю, что вы привязываете параметры по позиции, а не по имени.

По позиции, вы должны сначала добавить appId в entitlement_type_seq_id. Затем BusinessId в last_Updated_By, entitlementTypeId в app_seq_id и lastUpdatedBy в business_seq_id.

https://docs.oracle.com/cd/B19306_01/win.102/b14307/OracleCommandClass.htm#i997666

+0

Спасибо! Это устранило мою проблему. Я не понимал, что по умолчанию он привязывается по положению. Буду признателен за ссылку на документы. –

1

Либо вы должны установить

cmd.BindByName = true; 

потому, что значение по умолчанию для BindByName собственности false, что означает, что параметры связаны позиции.

Или вы должны использовать один и тот же порядок параметров, как они появляются в вашем заявлении, т.е.

cmd.Parameters.Add("entitlementTypeId", entitlementTypeId); 
cmd.Parameters.Add("lastUpdatedBy", sso); 
cmd.Parameters.Add("appId", appId); 
cmd.Parameters.Add("businessId", businessId); 

кстати, обычно OracleParameter добавляются так:

cmd.Parameters.Add("entitlementTypeId", OracleDbType.Int32, ParameterDirection.Input).Value = entitlementTypeId; 
cmd.Parameters.Add("lastUpdatedBy", OracleDbType.Varchar2, ParameterDirection.Input).Value = entitlementTypeId; 
cmd.Parameters.Add("appId", OracleDbType.Int32, ParameterDirection.Input).Value = appId; 
cmd.Parameters.Add("businessId", OracleDbType.Int32, ParameterDirection.Input).Value = businessId; 

Я предполагаю, что для простых данных типы, подобные номерам строки, не имеют значения, однако другой тип данных (например, Дата) может потерпеть неудачу, если вы просто используете cmd.Parameters.Add(string name, object val).

+0

Спасибо! Это устранило мою проблему. Я не понимал, что по умолчанию он привязывается по положению. Я прочитаю документы, которые выложил Гэри, и измените мои параметры на новый формат. –

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

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