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;
zeigen Sie Ihre Prozedur ... –
können Sie bitte das, was hier ist 'Execute Immediate queryToExecute In DocumentsNumber, DocumentsSize Mit YearDoc, MonthDoc, Lower_SystemID, Higher_SystemID;' –
, welchen Wert dieses Teils ist: queryToExecute: =. .. –