错误的参数数量或类型 - .NET应用程序中的Oracle错误

时间:2015-03-06 20:34:00

标签: .net oracle arguments

我正在调用来自.Net的程序,并且我一直收到一条错误,上面写着"调用initiate_user_priv_app时参数的数量或类型错误。我已经比较了参数,类型,并且我没有看到断开连接的位置。我有相同数量的参数,相同的顺序,相同类型的变量。任何帮助将不胜感激。谢谢!

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

1 个答案:

答案 0 :(得分: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属性强制转换为其运行时类型,则可以使用该属性...

     

if((OracleDecimal)cmd.Parameters [" p1"]。Value)。IsNull){...做点什么...}   否则{......做别的事......}

     

也许是这样的......   十进制p1val =((OracleDecimal)cmd.Parameters [" p1"]。值).IsNull? 0:((OracleDecimal)cmd.Parameters [" AVG_SALARY"]。Value).Value;

相关问题