2016-04-15 48 views
0

我正在對傳統應用程序進行一些維護,使用OracleConnection和OracleCommand來管理我們的數據。我遇到了一個問題,即當我使用參數時特定的更新不起作用,但如果我將相同的語句轉換爲插入的字符串,則工作正常。我沒有收到任何異常,更新不會發生,並且爲更新的行返回0。我正在用參數進行其他更新,所以我很好奇,如果有人看到我可能錯過的任何內容。我嘗試了/不使用事務,也沒有明確地創建OracleParameter對象。OracleCommand更新適用於插值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

謝謝!這解決了我的問題。我沒有意識到這是默認情況下的綁定。我將通讀Gary發佈的文檔,並將我的參數更改爲新格式。 –

相關問題