我正在调用来自.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;
}
答案 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;