错误的参数数量或类型 - .NET 应用程序中的 Oracle 错误
Wrong number or types of arguments - Oracle Error in .NET application
我正在从 .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;
}
此代码块是多余的,并且是您收到异常参数数量错误的原因:
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 and OracleString (and some other types like OracleDate, etc.) have an "IsNull" property you can use if you cast the Value property to its runtime type...
if ((OracleDecimal)cmd.Parameters["p1"].Value).IsNull) { …do something… }
else { …do something else… }
Or maybe something like this...
Decimal p1val = ((OracleDecimal)cmd.Parameters["p1"].Value).IsNull ? 0 : ((OracleDecimal)cmd.Parameters["AVG_SALARY"].Value).Value;
我正在从 .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;
}
此代码块是多余的,并且是您收到异常参数数量错误的原因:
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 and OracleString (and some other types like OracleDate, etc.) have an "IsNull" property you can use if you cast the Value property to its runtime type...
if ((OracleDecimal)cmd.Parameters["p1"].Value).IsNull) { …do something… } else { …do something else… }
Or maybe something like this... Decimal p1val = ((OracleDecimal)cmd.Parameters["p1"].Value).IsNull ? 0 : ((OracleDecimal)cmd.Parameters["AVG_SALARY"].Value).Value;