2016-04-15 11 views
0

Ich mache einige Wartungsarbeiten an einer Legacy-App, die OracleConnection und OracleCommand zur Verwaltung unserer Daten verwendet. Ich habe ein Problem, bei dem ein bestimmtes Update nicht funktioniert, wenn ich Parameter verwende, aber wenn ich dieselbe Anweisung in eine interpolierte Zeichenfolge umwandle, funktioniert es gut. Ich bekomme keine Ausnahmen, das Update passiert einfach nicht, und gibt eine 0 für Zeilen aktualisiert. Ich mache andere Aktualisierungen mit Parametern, also bin ich neugierig, wenn jemand etwas sieht, das ich mit diesem vielleicht verpasst habe. Ich habe versucht, mit/ohne die Transaktion sowie explizit OracleParameter Objekte ohne Wirkung zu erstellen.OracleCommand Update funktioniert mit interpoliertem SQL, aber nicht mit parametrisierten

Die Methode ist unten. Ich habe die parametrierte Version verlassen und die Parametereinstellung als Referenz auskommentiert.

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; 
      } 
     } 
    } 

Antwort

2

Ich vermute, dass Sie Parameter nach Position und nicht nach Namen verbindlich sind.

Nach Position würden Sie appId zuerst in entity_type_seq_id setzen. Dann BusinessId in last_Updated_By, entityTypeId in app_seq_id und lastUpdatedBy in business_seq_id.

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

+0

Vielen Dank! Das hat mein Problem behoben. Ich war mir nicht bewusst, dass es standardmäßig per Position gebunden war. Ich schätze den Link zu den Dokumenten. –

1

Entweder Sie haben

cmd.BindByName = true; 

zu setzen, da Standardwert für BindByName Eigenschaft false ist, was bedeutet, dass die Parameter, die von Position gebunden sind.

Oder Sie haben die gleiche Reihenfolge der Parameter verwenden, wie sie in Ihrer Aussage erscheinen, dh

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

btw, in der Regel OracleParameter wird wie folgt hinzugefügt:

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; 

ich für einfache Daten übernehmen Bei Typen wie Zeichenketten spielt die Syntax keine Rolle, jedoch kann ein anderer Datentyp (z. B. Datum) fehlschlagen, wenn Sie einfach cmd.Parameters.Add(string name, object val) verwenden.

+0

Danke! Das hat mein Problem behoben. Ich war mir nicht bewusst, dass es standardmäßig per Position gebunden war. Ich werde die von Gary geposteten Dokumente lesen und meine Parameter in das neue Format ändern. –