2017-12-13 2 views
1

Ich habe eine gespeicherte Prozedur, die mehrere Eingabeparameter und zwei Nummer Ausgabeparameter dauert. Wenn ich die gespeicherte Prozedur von SQL-Entwickler ausführe, druckt es die korrekten Werte der zwei Ausgangsparameter. Wenn die gespeicherte Prozedur von C# aufgerufen wird, sind die beiden Ausgangsparameter immer 0.Oracle Nummer OUT Parameter sind immer 0

Hier zeige ich den Code:

public int ExecuteStore(string storeToExecute, CountDocumentsData storeResultDataObject, int old_systemid, int current_systemid, params SearchFilter[] searchFilters) 
    { 
     using (OracleConnection connection = new OracleConnection(this.ConnectionString)) 
     { 
      try 
      { 
       OracleCommand objCmd = new OracleCommand(); 
       objCmd.Connection = connection; 
       connection.Open(); 
       objCmd.CommandText = storeToExecute; 
       objCmd.CommandType = CommandType.StoredProcedure; 

       foreach (var filter in searchFilters) 
       { 
        OracleDbType type = OracleDbType.Varchar2; 

        if (filter.GetType() == typeof(YearFilter) || filter.GetType() == typeof(MonthFilter) 
          || filter.GetType() == typeof(ApplicationFilter) || filter.GetType() == typeof(DocumentTypeFilter)) 
        { 
         type = OracleDbType.Varchar2; 
         objCmd.Parameters.Add(filter.FilterName, type, 200).Value = filter.Value; 
        } 
        else 
        { 
         type = OracleDbType.Int32; 
         objCmd.Parameters.Add(filter.FilterName, type).Value = filter.Value; 
        }      
       } 

       objCmd.Parameters.Add("Lower_SystemID", OracleDbType.Int32, 200).Value = old_systemid; 
       objCmd.Parameters.Add("Higher_SystemID", OracleDbType.Int32, 200).Value = current_systemid; 

       objCmd.Parameters.Add("DocumentsNumber", OracleDbType.Int32).Direction = ParameterDirection.Output; 
       objCmd.Parameters.Add("DocumentsSize", OracleDbType.Int32).Direction = ParameterDirection.Output; 

       int res = objCmd.ExecuteNonQuery(); 
       Console.WriteLine(Convert.ToDecimal(objCmd.Parameters["DocumentsNumber"].Value.ToString())); 
       Console.WriteLine(Convert.ToDecimal(objCmd.Parameters["DocumentsSize"].Value.ToString())); 

       return res; 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine("Query error.", ex); 
       throw new Exception("Error", ex); 
      } 
     } 
    } 

Stored Procedure:

Procedure CountDocuments 
(
    Application IN VARCHAR2, 

    YearDoc IN VARCHAR2, 

    MonthDoc IN VARCHAR2, 

    UoId IN Integer, 

    SearchOnSubjected IN Integer, 

    DocType IN VARCHAR2, 

    Lower_SystemID IN Integer, 

    Higher_SystemID IN Integer, 

    DocumentsNumber OUT Integer, 

    DocumentsSize OUT Integer 
) Is 

    queryToExecute VarChar2 (2000); 
    Begin 

    queryToExecute := ... 

    Execute Immediate queryToExecute 
      Into DocumentsNumber, DocumentsSize 
      Using YearDoc, MonthDoc, Lower_SystemID, Higher_SystemID; 

    End CountDocuments; 
+0

zeigen Sie Ihre Prozedur ... –

+0

können Sie bitte das, was hier ist 'Execute Immediate queryToExecute In DocumentsNumber, DocumentsSize Mit YearDoc, MonthDoc, Lower_SystemID, Higher_SystemID;' –

+0

, welchen Wert dieses Teils ist: queryToExecute: =. .. –

Antwort

1

Sie scheinen dynamische Parameter zu verwenden, aber Sie binden sie von Position. Das scheint sehr seltsam zu sein. Ich weiß nicht, ob das, was in Ihrem searchFilters zur Laufzeit entspricht Ihre gespeicherten Prozedur genau ist, aber wenn nicht müssen Sie

objCmd.BindByName = true; 

oder Ihre Parameter enden in den falschen Stellen werden aufbrauchen. auch