2016-04-15 11 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

あなたは名前ではなく位置によってパラメータをバインドしていると思われます。

位置によって、あなたはentitlement_type_seq_idにappIdを先に入れます。 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

BindByNameプロパティのデフォルト値は、パラメータは位置によって拘束されていることを意味する、falseあるので、あなたは

cmd.BindByName = true; 

を設定する必要がありますどちらか。

それとも、彼らはあなたの文に表示されるあなたは、パラメータの同じ順序を使用する必要があり、つまりは

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)を使用すると他のデータ型(例:Date)が失敗することがあります。

+0

ありがとう!これは私の問題を解決しました。私はそれがデフォルトでポジションを縛っていたことに気付かなかった。 Garyが投稿したドキュメントを読んで、パラメータを新しいフォーマットに変更します。 –