C# Oracle错误的号码或类型错误
大家早上好,我来了好几天,试图使这项工作,但找不到方法。我得到以下错误C# Oracle错误的号码或类型错误,c#,oracle,C#,Oracle,大家早上好,我来了好几天,试图使这项工作,但找不到方法。我得到以下错误 ORA-06550: line 1, column 7: PLS-00306: wrong number or types of arguments in call to 'ALTA_SOCIO' ORA-06550: line 1, column 7: PL/SQL: Statement ignored 我还不能发布图片,如果不完全清楚
ORA-06550: line 1, column 7: PLS-00306: wrong number or types
of arguments in call to 'ALTA_SOCIO'
ORA-06550: line 1, column 7: PL/SQL: Statement ignored
我还不能发布图片,如果不完全清楚,请原谅
这是密码
protectedoverride void EjecutarConcreto()
{
int returnonrosocio=(int)returno.ObjetoGenerico;
oracleparameternickname=新的OracleParameter(“p_昵称”,OracleType.VarChar,32767);
parameterNickname.Direction=ParameterDirection.Input;
parameterNickname.Value=昵称;
ora_cmd.Parameters.Add(parameterNickname);
OracleParameterNombre=新的OracleParameter(“p_nombre”,OracleType.VarChar,32767);
parameterNombre.Direction=ParameterDirection.Input;
参数ombre.Value=nombre;
ora_cmd.Parameters.Add(parameterNombre);
OracleParameterApellido=新的OracleParameter(“p_apellido”,OracleType.VarChar,32767);
parameterNombre.Direction=ParameterDirection.Input;
参数ombre.Value=apellido;
ora_cmd.Parameters.Add(parameterApellido);
OracleParameter parameterTipoDocumento=新的OracleParameter(“p_cod_tipo_documento”,OracleType.VarChar,32767);
ParameterTipodDocumento.Direction=ParameterDirection.Input;
参数tipoDocumento.Value=tipoDocumento;
ora_cmd.Parameters.Add(parameterTipoDocumento);
OracleParameterRodDocumento=新的OracleParameter(“p_numero_documento”,OracleType.Number);
ParameterNodeDocumento.Direction=ParameterDirection.Input;
parameterNroDocumento.Value=数字文档;
ora_cmd.Parameters.Add(parameterrodocumento);
OracleParameter parameterFechaNacimiento=新的OracleParameter(“p_fecha_nacimiento”,OracleType.DateTime);
parameterFechaNacimiento.Direction=ParameterDirection.Input;
参数fechaNacimiento.Value=fechaNacimiento;
ora_cmd.Parameters.Add(parameterFechaNacimiento);
oracleparametersexo=新的OracleParameter(“p_sexo”,OracleType.VarChar,32767);
ParametersXeo.Direction=ParameterDirection.Input;
参数sexo.Value=sexo;
ora_cmd.Parameters.Add(parameterSexo);
OracleParameterCodCategoria=新的OracleParameter(“p_cod_categoria”,OracleType.VarChar,32767);
parameterCodCategoria.Direction=ParameterDirection.Input;
参数codCategoria.Value=codCategoria;
ora_cmd.Parameters.Add(parameterCodCategoria);
ora_cmd.Parameters.Add(“p_numero_social”,OracleType.Number).Direction=ParameterDirection.Output;
ora_cmd.Parameters.Add(“p_codigo_error”,OracleType.Number).Direction=ParameterDirection.Output;
//埃杰库托埃尔科曼多酒店
ora_cmd.ExecuteNonQuery();
这是桌子
NUMERO_SOCIO NUMBER(7) NOT NULL,
NICKNAME VARCHAR2(25) NOT NULL,
APELLIDO VARCHAR2(30) NOT NULL,
NOMBRE VARCHAR2(30) NOT NULL,
COD_TIPO_DOCUMENTO VARCHAR2(10) NOT NULL,
NRO_DOCUMENTO NUMBER(8) NOT NULL,
COD_CATEGORIA VARCHAR2(10) NOT NULL,
FECHA_NACIMIENTO DATE,
SEXO VARCHAR2(1)
程序如下:
PROCEDURE alta_socio(
p_nickname IN VARCHAR2,
p_nombre IN VARCHAR2,
p_apellido IN VARCHAR2,
p_cod_tipo_documento IN VARCHAR2,
p_numero_documento IN NUMBER,
p_fecha_nacimiento IN DATE,
p_sexo IN VARCHAR2,
p_cod_categoria IN VARCHAR2,
p_numero_socio OUT NUMBER,
p_codigo_error OUT NUMBER);
[WebGet(ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest)]
public RetornoNroSocio AltaSocio(string codUsuario, string claveUsuario, string establecimiento, string nick, string nombre, string apellido, int documento, DateTime fechaNacimiento, char sexo, string codCategoria)
{
RetornoNroSocio rn = new RetornoNroSocio() { NroSocio = 0 };
if (codUsuario != null && claveUsuario != null && establecimiento != null && nick != null && codUsuario != null && nombre != null && apellido != null && (sexo == 'M' || sexo == 'F') && codCategoria != null)
{
//Verifico que si el documento es una cedula sea valido
if (PUtiles.CedulaUruguaya.validarCedula(documento.ToString()))//REVISAR ESTA VALIDACION
{
//Verifico que el usuario tenga permisos
RetornoBool rb = new SeguridadAccesoClub().TienePermiso(codUsuario, claveUsuario, Globales.ACC_VERIFICAR_SOCIO, Globales.MODO_INGRESO);
//En caso de que no ocurra ningun error y el usuario tenga permisos
if (!rb.Error && rb.Resultado)
{
//Verifico que el usuario no exista
int NumeroSocioSiExiste = ValidarSocio(establecimiento, codUsuario, claveUsuario, Globales.CODIGO_DATOS_DNI, documento.ToString()).NroSocio;
if (NumeroSocioSiExiste == 0)
{
//Creo y realizo la peticion a la API
PeticionAPI p = new AltaSocio(establecimiento, nick, nombre, apellido, Globales.DOCUMENTO_CI, documento, fechaNacimiento, sexo, codCategoria);
RetornoGenerico r = p.Ejecutar();
if (!r.Error)//si no hay error
{
rn.Codigo = 0;
rn.Mensaje = "Socio creado OK";
rn.NroSocio = (int)r.ObjetoGenerico;//El numero de socio
}
else//si hay error
{
rn.Codigo = -99;
rn.Mensaje = "Se produjo un error inesperado ";
rn.NroSocio = 0;
var _logger = log4net.LogManager.GetLogger("log4Net");
_logger.Error("Error al dar de alta un usuario " +
r.MensajeError + " Datos: CodUsuario: "+ codUsuario +" ClaveUsuario: "+ claveUsuario
+" Establecimiento: " + establecimiento + " Nick: " + nick + " Nombre: "+ nombre +
" Apellido " + apellido + " Documento: " + documento + " FechaNacimiento: "+ fechaNacimiento +
" Sexo: " + sexo + " CodCategoria: " + codCategoria);
}
}
else
{
rn.Codigo = -1;
rn.Mensaje = "Este socio ya existe";
rn.NroSocio = NumeroSocioSiExiste;
}
}
else
{
if (rb.Error)
{
rn.Codigo = -3;
rn.Mensaje = "Error al obtener los permisos del usuario";
rn.NroSocio = 0;
var _logger = log4net.LogManager.GetLogger("log4Net");
_logger.Error("rror al obtener los permisos del usuario " +
rb.MensajeError + " Datos: CodUsuario: " + codUsuario + " ClaveUsuario: " + claveUsuario
+ " Establecimiento: " + establecimiento);
}
else
{
rn.Codigo = -4;
rn.Mensaje = "El usuario no tiene los permisos de acceso necesarios para realizar la consulta.";
rn.NroSocio = 0;
}
}
}
else
{
rn.Codigo = -2;
rn.Mensaje = "Numero de cedula no es valido ";
rn.NroSocio = 0;
}
}
else
{
rn.Codigo = -5;
rn.Mensaje = "Alguno de los campos es vacio";
rn.NroSocio = 0;
}
return rn;
}
命名空间wcfserviceoaccesocasclub.PConsumoAPIs{
公共抽象类PeticionAPI{
private OracleConnection ora_conn;
protected OracleCommand ora_cmd;
protected string codEstablecimiento;
protected string connectionString;
protected string nombreProcedimiento;
protected string nombreProcedimientoReal;
protected CommandType tipoComando = CommandType.StoredProcedure;
protected RetornoGenerico retorno;
public RetornoGenerico Ejecutar() {
InicializarRetorno();
try {
if (!string.IsNullOrEmpty(codEstablecimiento)) {
connectionString = ObtenerConnectionString(codEstablecimiento);
RetornoGenerico rg = OperacionPrevia();
if (!rg.Error) {
ora_conn = new OracleConnection(connectionString);
ora_conn.Open();
CrearComando();
EjecutarConcreto();
} else {
retorno.Error = true;
retorno.MensajeError = rg.MensajeError;
}
}else{
retorno.Error = true;
retorno.MensajeError = "No se recibio un establecimiento válido.";
}
} catch (Exception ex) {
retorno.Error = true;
retorno.MensajeError = string.Format("Error al ejecutar el comando {0}. \nDescripcion del error: {1}", nombreProcedimiento, ex.Message);
} finally {
if (ora_conn != null && ora_conn.State == ConnectionState.Open) {
ora_conn.Close();
}
}
return retorno;
}
protected virtual RetornoGenerico OperacionPrevia() {
return new RetornoGenerico() { Error = false, MensajeError = string.Empty, ObjetoGenerico = null };
}
protected void CrearComando() {
ora_cmd = new OracleCommand(nombreProcedimiento, ora_conn);
ora_cmd.CommandType = tipoComando;
}
protected abstract void EjecutarConcreto();
protected abstract void InicializarRetorno();
protected string ObtenerConnectionString(string codEstablecimientoIn) {
return GeneradorConnectionString.Instance.ObtenerConnectionString(codEstablecimientoIn);
}
protected string MensajeError(int nroError) {
string mensajeError = string.Empty;
ora_cmd = null;
ora_cmd = new OracleCommand("cj_boldt.utl_terminales.obtener_error", ora_conn);
ora_cmd.CommandType = CommandType.StoredProcedure;
OracleParameter parameterNroSocio = new OracleParameter("p_codigo_error", OracleType.Number);
parameterNroSocio.Direction = ParameterDirection.Input;
parameterNroSocio.Value = nroError;
ora_cmd.Parameters.Add(parameterNroSocio);
OracleParameter parameterNombre = new OracleParameter("p_nombre_procedimiento", OracleType.VarChar, 32767);
parameterNombre.Direction = ParameterDirection.Input;
parameterNombre.Value = nombreProcedimientoReal;
ora_cmd.Parameters.Add(parameterNombre);
ora_cmd.Parameters.Add("p_mensaje_error", OracleType.VarChar, 32767).Direction = ParameterDirection.Output;
//Ejecuto el comando
ora_cmd.ExecuteNonQuery();
//Obtengo los valores recibidos por parametro
try {
mensajeError = ora_cmd.Parameters["p_mensaje_error"].Value.ToString();
} catch (Exception ex) {
mensajeError = "Ocurrio un error en la conexión";
}
return mensajeError;
}
}
}
谢谢你的帮助,非常感谢
您正在使用存储过程吗?如果是,请显示其签名(参数)并显示ora_cmd syntax抱歉,这里是过程alta_(VARCHAR2中的p_昵称,VARCHAR2中的p_nombre,VARCHAR2中的p_apellido,VARCHAR2中的p_cod_tipo_documento,数字中的p_numero_documento,日期中的p_fecha_Nacimento,日期中的p_sexo,VARCHAR2中的p_cod_categoria,社会输出数字,错误输出数字);请注意,在EjecutarConcreto调用之前执行的所有ora_cmd行。您的代码看起来正确,问题可能在于ora_cmd的使用。实际调用中可能有更多参数,因为之前添加了一些其他参数(例如,如果您调用此方法两次)。不要忘记在新呼叫之前清除参数。我会将其复制到应答中,以便在有帮助的情况下您可以接受:)您可以尝试忽略VARCHAR参数的参数大小。更新后,我可以看到您清除参数。因此,请尝试选项#1,并确保您的值长度不超过正确的长度sizes@GabrielNu尼兹让我知道这是否有帮助。非常有趣的案例。非常感谢我会尝试,我需要多一点声誉来接受答案。但是当我有了它就接受它。非常感谢much@GabrielNuñez我会寻找一种方法来查看实际发送到Ora服务器的内容。不幸的是,我主要使用MS SQL,而不是Ora,但我确信有一些工具可以监视服务器请求,所以尝试找到它。另一种方法是在Ora_cmd.ExecuteNonQuery()上设置断点;并查看发送到服务器的确切值甚至SQL语句。