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

}
}

谢谢你的帮助,非常感谢

  • 存储的过程和应用程序代码参数中的Varchar长度不同。请设置适当的长度
  • 一般来说,代码看起来是正确的,问题可能出在ora_cmd的使用上。实际调用中可能有更多的参数,因为之前添加了一些其他参数(例如,如果调用此方法两次)。不要忘记在新调用之前清除参数

  • 您正在使用存储过程吗?如果是,请显示其签名(参数)并显示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语句。