2015-03-06 9 views
0

Я вызываю процедуру из .Net, и я продолжаю получать сообщение об ошибке «неправильное количество или типы аргументов при вызове initiate_user_priv_app. параметры, типы, и я не вижу, где разъединение есть. у меня есть такое же количество параметров, одного порядка, так же типа переменных. Любая помощь будет высоко оценен. Спасибо!Неверное количество или типы аргументов - Ошибка Oracle в приложении .NET

Procedure Initate_User_Priv_App 
(
P_Cred_Provider_Id   In Cred_Provider.Cred_Provider_Id%Type, 
P_Cred_Assignment_Id  In Cred_Assignment.Cred_Assignment_Id%Type, 
P_Priv_Application_Mtf_Id In Priv_Application.Priv_Application_Mtf_Id%Type, 
P_Priv_Application_Type_Id In Priv_Application.Priv_Application_Type_Id%Type, 
P_Person_Email_Txt   In Sys_Person_Email.Person_Email_Txt%Type, 
P_Communication_Type_Id In Sys_Person_Communication.Communication_Type_Id%Type, 
P_Person_Communication_Txt In Sys_Person_Communication.Person_Communication_Txt%Type, 
P_Audit_User_Id   In Sys_User.User_Id%Type, 
P_Audit_User_Mtf_Id  In Mtf.Mtf_Id%Type, 
P_Audit_Predecessor_Id  In Priv_Application.Audit_Predecessor_Id%Type, 
P_Priv_Application_Id  Out Priv_Application.Priv_Application_Id%Type, 
P_Result     Out Varchar2, 
P_Return_Code    Out Number 


using (OracleConnection conn = new OracleConnection(this.connString)) 
     { 
      cmd.CommandType = CommandType.StoredProcedure; 
      cmd.CommandText = "sql_privileging_functions.initate_user_priv_app"; 

      #region Parameterization 
      OracleParameter outputApplicationId = new OracleParameter("p_priv_application_id", OracleDbType.Decimal, 18, null, ParameterDirection.Output); 
      OracleParameter outputResult = new OracleParameter("p_result", OracleDbType.Varchar2, 1000, null, ParameterDirection.Output); 
      OracleParameter outputResultCode = new OracleParameter("p_return_code", OracleDbType.Decimal, 18, null, ParameterDirection.Output); 

      cmd.Parameters.Add(new OracleParameter("p_cred_provider_id", credAssignment.CredProviderId)); 
      cmd.Parameters.Add(new OracleParameter("p_cred_assignment_id", credAssignment.CredAssignmentId)); 
      cmd.Parameters.Add(new OracleParameter("p_priv_application_mtf_id", credAssignment.AssignmentMtf)); 
      cmd.Parameters.Add(new OracleParameter("p_priv_application_type_id", credAssignment.PrivApplicationTypeId)); 
      cmd.Parameters.Add(new OracleParameter("p_person_email_txt", credAssignment.Email)); 
      cmd.Parameters.Add(new OracleParameter("p_communication_type_id", credAssignment.PhoneTypeId)); 
      cmd.Parameters.Add(new OracleParameter("p_person_communication_txt", credAssignment.Phone)); 
      cmd.Parameters.Add(new OracleParameter("p_audit_user_id", credAssignment.AuditUserId)); 
      cmd.Parameters.Add(new OracleParameter("p_audit_user_mtf_id", credAssignment.AuditUserMTFId)); 
      cmd.Parameters.Add(new OracleParameter("p_audit_user_predecessor_id", credAssignment.AuditUserId)); 
      cmd.Parameters.Add(new OracleParameter("p_priv_application_id", OracleDbType.Decimal, ParameterDirection.Output)); 
      cmd.Parameters.Add(new OracleParameter("p_result", OracleDbType.Varchar2, ParameterDirection.Output)); 
      cmd.Parameters.Add(new OracleParameter("p_return_code", OracleDbType.Decimal, ParameterDirection.Output)); 
      cmd.Parameters.Add(outputApplicationId); 
      cmd.Parameters.Add(outputResult); 
      cmd.Parameters.Add(outputResultCode); 

      #endregion Parameterization 

      cmd.Connection = conn; 
      conn.Open(); 

      cmd.ExecuteReader(); 

      applicationId = outputApplicationId.Value == DBNull.Value ? 0 : (long)(OracleDecimal)outputApplicationId.Value; 
      result = outputResult.Value == DBNull.Value ? "" : (string)(OracleString)outputResult.Value; 
      resultCode = outputResultCode.Value == DBNull.Value ? 0 : (long)(OracleDecimal)outputResultCode.Value; 

      credAssignment.PrivApplicationId = applicationId; 
      credAssignment.Result = result; 
      credAssignment.ReturnCode = resultCode; 
     } 
+0

Это так, но мне нужны эти выходные параметры для заполнения трех переменных applicationId, result и resultCode. Есть ли другой способ? – JTRookie86

+0

Если я это сделаю, я получаю ошибку Oracle.ManagedDataAccess.Types.OracleNullValueException, когда точка отладки попадает в applicationId = outputApplicationId.Value == DBNull.Value? 0: (long) (OracleDecimal) outputApplicationId.Value; – JTRookie86

+0

Не могли бы вы написать свой ответ в разделе «Ответ», чтобы я мог отметить его как правильный ответ? Ваш ответ помог мне достичь резолюции, и это избавило меня от головной боли и времени. Если бы не ты, я бы не понял, что мои выходные параметры выписаны дважды – JTRookie86

ответ

0

Этот блок кода является избыточным и причиной неправильного количества исключений аргументов, которые вы принимаете:

cmd.Parameters.Add(new OracleParameter("p_priv_application_id", OracleDbType.Decimal, ParameterDirection.Output)); 
cmd.Parameters.Add(new OracleParameter("p_result", OracleDbType.Varchar2, ParameterDirection.Output)); 
cmd.Parameters.Add(new OracleParameter("p_return_code", OracleDbType.Decimal, ParameterDirection.Output)); 

как ваши выходные параметры будут добавлены сразу после них:

cmd.Parameters.Add(outputApplicationId); 
cmd.Parameters.Add(outputResult); 
cmd.Parameters.Add(outputResultCode); 

Кроме того, вы можете бросить outputApplicationId в OracleDecimal и использовать его свойство IsNull для назначения, в настоящее время вы получите OracleNullValueException при попытке получить доступ к null значение (см this thread):

OracleDecimal и OracleString (и некоторые другие виды, такие как OracleDate и т.д.) имеет свойство «IsNull» вы можете использовать, если вы накладываете свойство Value своего типа исполнения. ..

если ((OracleDecimal) cmd.Parameters [ "p1"]. Value) .IsNull) {... сделать что-то ...} еще {... делать что-то еще ...}

Или, может быть что-то вроде этого. .. Десятичный p1val = ((OracleDecimal) cmd.Parameters ["p1"]. Значение) .IsNull? 0: ((OracleDecimal) cmd.Parameters ["AVG_SALARY"]. Значение) .Value;

Смежные вопросы