none
Problema OracleCommand con el metodo Parameters.Add RRS feed

  • Pregunta

  • Buenos dias,

    Estoy migrando una aplicacion de vb a c# y uso oracle como bd, pero estoy teniendo un error en el metodo add, les muestro lo que hice en vb y luego donde se ubica el error en c#

    vb:

     Public Function Tamanio() As Integer
                Dim IntTamanio As Integer = 0
                Select Case IntTipo
                    Case OracleType.DateTime Or OracleType.Double Or _
                         OracleType.Float Or OracleType.Int16 Or _
                         OracleType.Int32 Or OracleType.Number : IntTamanio = 0
                    Case Else : IntTamanio = StrValor.Length
                End Select
                Return IntTamanio
            End Function

     Private Sub CrearParametros(ByVal PSqlCmd As OracleCommand, ByVal Parametros As List(Of TParametro))
            Try
                For Each Parametro As TParametro In Parametros
                    PSqlCmd.Parameters.Add(Parametro.Nombre, Parametro.TipoDato, Parametro.Tamanio).Value = Parametro.Valor
                        PSqlCmd.CreateParameter()
                Next
                PSqlCmd.Parameters.Add("PCodigo", OracleType.Int16, 0, 1).Direction = ParameterDirection.Output
                PSqlCmd.CreateParameter()
                PSqlCmd.Parameters.Add("PMensaje", OracleType.VarChar, 250, Nothing).Direction = ParameterDirection.Output
                PSqlCmd.CreateParameter()
                PSqlCmd.Parameters.Add("PRs", OracleType.Cursor, 0, Nothing).Direction = ParameterDirection.Output
                PSqlCmd.CreateParameter()
            Catch ex As Exception
                Throw ex
            End Try
        End Sub

    C#: 

     public int Tamanio()
                {
                    int IntTamanio = 0;
                    switch (IntTipo)
                    {
                        case OracleType.DateTime | OracleType.Double | OracleType.Float | OracleType.Int16 | OracleType.Int32 | OracleType.Number:
                            IntTamanio = 0;
                            break;
                        default:
                            IntTamanio = StrValor.Length;
                            break;
                    }
                    return IntTamanio;
                }

    private void CrearParametros(OracleCommand PSqlCmd, List<TParametro> Parametros)
            {
                try
                {
                    foreach (TParametro Parametro in Parametros)
                    {
                        PSqlCmd.Parameters.Add(Parametro.Nombre,Parametro.TipoDato, Parametro.Tamanio).Value = Parametro.Valor; -> En la linea con negrita me da ese error que describo abajo
                        PSqlCmd.CreateParameter();
                    }
                    PSqlCmd.Parameters.Add("PCodigo", OracleType.Int16, 0, null).Direction = System.Data.ParameterDirection.Output;
                    PSqlCmd.CreateParameter();
                    PSqlCmd.Parameters.Add("PMensaje", OracleType.VarChar, 250, null).Direction = System.Data.ParameterDirection.Output;
                    PSqlCmd.CreateParameter();
                    PSqlCmd.Parameters.Add("PRs", OracleType.Cursor, 0, null).Direction = System.Data.ParameterDirection.Output;
                    PSqlCmd.CreateParameter();
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }

    el error dice:  La mejor coincidencia de metodos sobrecargados para  "System.Data.OracleClient.OracleParameterCollection.Add(string,System.Data.OracleClient,int)" tiene algunos argumentos no validos

    Alguna idea de que podria estar sucediendo?

    Gracias


    miércoles, 10 de diciembre de 2014 14:57

Respuestas

  • Tamanio() es un método.  El problema viene de eso.  Debe ser una propiedad o reescribir la línea así:

    PSqlCmd.Parameters.Add(Parametro.Nombre,Parametro.TipoDato, Parametro.Tamanio()).Value = Parametro.Valor


    Jose R. MCP
    Code Samples

    • Marcado como respuesta alexander ocampo miércoles, 10 de diciembre de 2014 15:41
    miércoles, 10 de diciembre de 2014 15:32

Todas las respuestas

  • Hola Alexander.  Este es un foro en español así que siéntase en libertad de postear en español.

    El problema radica probablemente en el tipo de dato de la propiedad TParametro.Tamanio.  ¿Qué tipo es?

    Mejor aún:   Muéstrenos la clase TParametro completa.


    Jose R. MCP
    Code Samples


    • Editado webJose miércoles, 10 de diciembre de 2014 15:11
    miércoles, 10 de diciembre de 2014 15:11
  • aqui esta la clase

     Public Class TParametro
            Private StrNombre As String
            Public Property Nombre() As String
                Get
                    Return StrNombre
                End Get
                Set(ByVal value As String)
                    StrNombre = value
                End Set
            End Property

            Private IntTipo As OracleType
            Public Property TipoDato() As TipoDato
                Get
                    Return IntTipo
                End Get
                Set(ByVal value As TipoDato)
                    IntTipo = value
                End Set
            End Property

            Private StrValor As String
            Public Property Valor() As String
                Get
                    Return StrValor
                End Get
                Set(ByVal value As String)
                    StrValor = value
                End Set
            End Property

            Public Function Tamanio() As Integer
                Dim IntTamanio As Integer = 0
                Select Case IntTipo
                    Case OracleType.DateTime Or OracleType.Double Or _
                         OracleType.Float Or OracleType.Int16 Or _
                         OracleType.Int32 Or OracleType.Number : IntTamanio = 0
                    Case Else : IntTamanio = StrValor.Length
                End Select
                Return IntTamanio
            End Function
        End Class

    c#:

     public class  TParametro
            {
                private string StrNombre;
                public string Nombre
                {
                    get { return StrNombre; }
                    set { StrNombre = value; }
                }

                private OracleType IntTipo;
                public TipoDato TipoDato
                {
                    get { return (TipoDato) IntTipo ; }
                    set { IntTipo = (OracleType) value; }
                }

                private string StrValor;
                public string Valor
                {
                    get { return StrValor; }
                    set { StrValor = value; }
                }

                public int Tamanio()
                {
                    int IntTamanio = 0;
                    switch (IntTipo)
                    {
                        case OracleType.DateTime | OracleType.Double | OracleType.Float | OracleType.Int16 | OracleType.Int32 | OracleType.Number:
                            IntTamanio = 0;
                            break;
                        default:
                            IntTamanio = StrValor.Length;
                            break;
                    }
                    return IntTamanio;
                }
            }

    Ahi esta la clase TParametro

    miércoles, 10 de diciembre de 2014 15:20
  • hola

    estas seguro que el problema es con ese parameto de "Tamanio" ? no sera el de TipoDato el que causa el problema

    referencias a la dll de Oracle brinda o a la de .net ?

    imagino instalaste el ODAC

    Build a .NET Application on the Oracle Database with Visual Studio 2005 or 2008

    porque deberias referenciar la dll que instala el ODAC, no se usa la que expone .net porque ya esta obsoleta

    -----

    revisa que TipoDato sera declarado como System.Data.OracleClient

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    miércoles, 10 de diciembre de 2014 15:22
  • ademas hay algo raro, alli veo que en c# defines a Tamanio como metodo, pero despues lo usa scomo propiedad, como se explicaria eso

    si el paramtro es metodo deberias usar Parametro.Tamanio() con los parantesis al final

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    miércoles, 10 de diciembre de 2014 15:24
  • Tamanio() es un método.  El problema viene de eso.  Debe ser una propiedad o reescribir la línea así:

    PSqlCmd.Parameters.Add(Parametro.Nombre,Parametro.TipoDato, Parametro.Tamanio()).Value = Parametro.Valor


    Jose R. MCP
    Code Samples

    • Marcado como respuesta alexander ocampo miércoles, 10 de diciembre de 2014 15:41
    miércoles, 10 de diciembre de 2014 15:32
  • Por el momento estoy utilizando la libreria System.Data.OracleClient se que esta obsoleta por los mensajes que arroja el visual pero de momento me iba bien hasta que estoy pasando la aplicacion a c#

    importe la libreria que mencionas pero me da problemas en TipoDato que es un enum

    Clase de AccesoDatos:

    public class ClsAccesoDatos
        {
            public enum TipoDato
            {
                TDateTime = OracleType.DateTime,
                TDouble = OracleType.Double,
                TFloat = OracleType.Float,
                TInt16 = OracleType.Int16,
                TInt32 = OracleType.Int32,
                TNumber = OracleType.Number,
                TVarchar = OracleType.VarChar,
                TChar = OracleType.Char
            }

            public class  TParametro
            {
                private string StrNombre;
                public string Nombre
                {
                    get { return StrNombre; }
                    set { StrNombre = value; }
                }

                private OracleType IntTipo;
                public TipoDato TipoDato
                {
                    get { return (TipoDato) IntTipo ; }
                    set { IntTipo = (OracleType) value; }
                }

                private string StrValor;
                public string Valor
                {
                    get { return StrValor; }
                    set { StrValor = value; }
                }

                public int Tamanio()
                {
                    int IntTamanio = 0;
                    switch (IntTipo)
                    {
                        case OracleType.DateTime | OracleType.Double | OracleType.Float | OracleType.Int16 | OracleType.Int32 | OracleType.Number:
                            IntTamanio = 0;
                            break;
                        default:
                            IntTamanio = StrValor.Length;
                            break;
                    }
                    return IntTamanio;
                }
            }

            public ClsBDRespuesta EjecutaProcedimiento(string PStrNombreProcedimiento, List<TParametro> Parametros)
            {
                using (OracleConnection cn = new OracleConnection(ConfigurationManager.ConnectionStrings["ordenes"].ToString()))
                {
                    OracleDataAdapter Da = new OracleDataAdapter();
                    OracleCommand Cmd = new OracleCommand(PStrNombreProcedimiento, cn);
                    ClsBDRespuesta ObjBDRespuesta = new ClsBDRespuesta();
                    try
                    {
                        Cmd.CommandType = System.Data.CommandType.StoredProcedure;
                        CrearParametros(Cmd, Parametros);
                        Da.SelectCommand = Cmd;
                        Da.Fill(ObjBDRespuesta.Resultado);
                        ObjBDRespuesta.Estado = true;
                        ObjBDRespuesta.Codigo = Convert.ToInt32(Da.SelectCommand.Parameters["PCodigo"].Value);
                        ObjBDRespuesta.Descripcion = Convert.ToString(Da.SelectCommand.Parameters["PMensaje"].Value);
                    }
                    catch (OracleException ex)
                    {
                        ObjBDRespuesta.Estado = false;
                        ObjBDRespuesta.Codigo = Convert.ToInt32(Da.SelectCommand.Parameters["PCodigo"].Value);
                        ObjBDRespuesta.Descripcion = Convert.ToString(Da.SelectCommand.Parameters["PMensaje"].Value);
                        if (ObjBDRespuesta.Codigo == 0 & ObjBDRespuesta.Descripcion == null)
                        {
                            ObjBDRespuesta.Codigo = ex.Code;
                            ObjBDRespuesta.Descripcion = ex.Message;
                        }
                        else
                        {
                            ObjBDRespuesta.Codigo =Convert.ToInt32( Da.SelectCommand.Parameters["PCodigo"].Value);
                            ObjBDRespuesta.Descripcion = Convert.ToString(Da.SelectCommand.Parameters["PMensaje"].Value);
                        }
                    }
                    return ObjBDRespuesta;
                }
            }

            private void CrearParametros(OracleCommand PSqlCmd, List<TParametro> Parametros)
            {
                try
                {
                    foreach (TParametro Parametro in Parametros)
                    {
                        PSqlCmd.Parameters.Add(Parametro.Nombre, Parametro.TipoDato, Parametro.Tamanio).Value = Parametro.Valor;
                        PSqlCmd.CreateParameter();
                    }
                    PSqlCmd.Parameters.Add("PCodigo", OracleType.Int16, 0, null).Direction = System.Data.ParameterDirection.Output;
                    PSqlCmd.CreateParameter();
                    PSqlCmd.Parameters.Add("PMensaje", OracleType.VarChar, 250, null).Direction = System.Data.ParameterDirection.Output;
                    PSqlCmd.CreateParameter();
                    PSqlCmd.Parameters.Add("PRs", OracleType.Cursor, 0, null).Direction = System.Data.ParameterDirection.Output;
                    PSqlCmd.CreateParameter();
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }

            public void EmpaquetaDetalle(string PStrValor, string PStrCadena)
            {
                PStrCadena = PStrCadena.Length > 0 ? "" : "|" + PStrCadena + PStrValor + "|";
            }
        }

    miércoles, 10 de diciembre de 2014 15:37
  • Casi estoy seguro que el problema es el metodo tamanio porque cuando realizo la siguiente instruccion no arroja error:

    PSqlCmd.Parameters.Add(Parametro.Nombre, (OracleType)Parametro.TipoDato).Value = Parametro.Valor;

    o

    PSqlCmd.Parameters.Add(Parametro.Nombre, (TipoDato)Parametro.TipoDato).Value = Parametro.Valor;

    pero al agregar Parametro.Tamanio salta el mismo error

    miércoles, 10 de diciembre de 2014 15:39
  • Muchas gracias por el apoyo brindado a los dos, logre solucionar el tema con la ayuda de Jose.
    miércoles, 10 de diciembre de 2014 15:42