none
Error LINQ: "La conversión especificada no es válida". RRS feed

  • Pregunta

  • Hola, estoy haciendo un select básico a una bd local de Oracle utilizando LINQ, pero al ejecutar la consulta, me arroja "La conversión especificada no es válida". He revisado posibles errores de tipos de datos, pero la verdad no he encontrado nada. Esto ocurre ya sea utilizando los metodos ToList() como tambien FirstOrDefault(). Agardeceria mucho sugerencias al respecto.

    Mi Método 

     public List<SUCURSAL> ListarSusursalesActivas()
            {
                try
                {
                    EntitiesServiexpress con = new EntitiesServiexpress();
                    var _sucursales = (from a in con.SUCURSAL
                                       join b in con.ESTADO_SUCURSAL on a.ESTADO_SUCURSAL_ID equals b.ID
                                       where b.NOMBRE == "Vigente"
                                       select a).ToList();

                    List<SUCURSAL> lista = new List<SUCURSAL>();
                    lista = _sucursales;
                    return lista;
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }

    Propiedades generadas con Entity Data Model (ODP)

            public int ID { get; set; }
            public Nullable<System.DateTime> FECHA_CREACION { get; set; }
            public Nullable<System.DateTime> FECHA_ULTIMO_UPDATE { get; set; }
            public string DIRECCION { get; set; }
            public string NOMBRE { get; set; }
            public Nullable<int> NUMERO_TELEFONO { get; set; }
            public int ESTADO_SUCURSAL_ID { get; set; }
            public int MULTI_EMPRESA_ID { get; set; }

    Tabla en la BD (Columna, tipo dato, nullable)

    ID NUMBER(10,0) No
    FECHA_CREACION DATE Yes
    FECHA_ULTIMO_UPDATE DATE Yes
    DIRECCION VARCHAR2(100 CHAR) Yes
    NOMBRE VARCHAR2(100 CHAR) Yes
    NUMERO_TELEFONO NUMBER(10,0) Yes
    ESTADO_SUCURSAL_ID NUMBER(10,0) No
    MULTI_EMPRESA_ID NUMBER(10,0) No


    martes, 1 de mayo de 2018 18:18

Respuestas

  • Segui dandole vueltas, se me ocurrio que quizas el largo de numeros en la bd hacia conflictos con el tipo de datos en el objeto del modelo. Modifique un registro en donde el campo NUMERO_TELEFONO tenia un numero de 10 digitos.

    NUMERO_TELEFONO NUMBER(10,0) Yes   ==>Base de datos

    public Nullable<int> NUMERO_TELEFONO { get; set; } ==>Objeto del modelo

    Al ser nullable en la base de datos, el modelo hace una conversion (en otro desarrollo tuve que hacer un parse a Int32 para que lo pudiera convertir). Por lo que supuse que el campo NUMERO_TELEFONO era muy largo y esto impedia la conversión. Quizas era así, no lo podría afirmar, pero las excepciones generadas por ODP son bastante genéricas con respecto a lo que acostubro a ver en .NET. Bueno, en fin, modifiqué el numero telefónico del registro en la base de datos que tenia 10 (1234567891) números de largo y lo dejé sólo con 9 (123456789). Posteriormente ejecuté y trajo el listado respectivo.  Agradecería que me pudieran validar para en próximas publicaciones, poder agregar imágenes y fragmentos de código. 

    Gracias por la ayuda de ambos




    martes, 1 de mayo de 2018 23:49

Todas las respuestas

  • Oracle no es lo mío, pero parece en orden.  Verifique el tipo de datos de las columnas de la otra tabla.

    Aparte veo varios detalles:

    1. La variable _sucursales ya es de tipo List<SUCURSAL>.  Puede eliminar todo uso de la variable lista.  Puede hacer return _sucursales.
    2. La variable con es un contexto y por lo tanto implementa IDisposable.  Debe entonces usarse dentro de una sentencia using.
    3. Tener un catch que solamente hace throw no tiene sentido y más bien se cambia el número de línea de código que arrojó la excepción.  Si solamente hará eso, quite el try..catch.

    Jose R. MCP
    Code Samples

    martes, 1 de mayo de 2018 19:06
    Moderador
  • Intenta con esto:

    public List<SUCURSAL> ListarSusursalesActivas()
            {
                try
                {
                    EntitiesServiexpress con = new EntitiesServiexpress();
                 
    
                                      return (from a in con.SUCURSAL
    
                                     where a.ESTADO_SUCURSAL.NOMBRE == "Vigente"
    
                                       select a).ToList();
    
    
                
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
    
    
    
    
    
    


    martes, 1 de mayo de 2018 19:11
  • Agradezco las observaciones realizadas en el codigo. Para descartar los datos de la otra tabla, le quite el "where". Añadiendo el using aún continua con la misma excepcion, incluso si lo retorno directamente. El error cae al ejecutar la sentencia LINQ. Dentro del la expecion, encuentro el mensaje: "La enumeración no produjo ningún resultado". 


     
    martes, 1 de mayo de 2018 19:59
  • Bueno ya ese es un error distinto.  Muéstrenos el código a como lo tiene ahora.  Normalmente ToList() no necesita resultado alguno, así que sospecho que tiene algo más por ahí.

    Jose R. MCP
    Code Samples

    martes, 1 de mayo de 2018 20:12
    Moderador
  • El error se genera al llamar el metodo ToList(). Probe utilizando First() y FirstOrDefault(), pero el error es el mismo.

    public List<SUCURSAL> ListarSusursalesActivas()
            {
                try
                {
                    EntitiesServiexpress con = new EntitiesServiexpress();
                    using (con) {
                        var _sucursales = (from a in con.SUCURSAL
                                           select a);
                        List<SUCURSAL> lista = _sucursales.ToList();
                        return lista;
                    }               

                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }

    martes, 1 de mayo de 2018 22:07
  • Su código básicamente está totalmente reducido que es bueno para encontrar el error.  Lo que tiene ahí es un simple select y no parece contener errores.  ToList() está dentro del using así que la conexión debe ser buena.  Hasta donde sé, ToList() no arroja excepciones si la enumeración está vacía.  ¿100% seguro que es un error y no un mensajito por ahí?

    Jose R. MCP
    Code Samples

    martes, 1 de mayo de 2018 22:58
    Moderador
  • Segui dandole vueltas, se me ocurrio que quizas el largo de numeros en la bd hacia conflictos con el tipo de datos en el objeto del modelo. Modifique un registro en donde el campo NUMERO_TELEFONO tenia un numero de 10 digitos.

    NUMERO_TELEFONO NUMBER(10,0) Yes   ==>Base de datos

    public Nullable<int> NUMERO_TELEFONO { get; set; } ==>Objeto del modelo

    Al ser nullable en la base de datos, el modelo hace una conversion (en otro desarrollo tuve que hacer un parse a Int32 para que lo pudiera convertir). Por lo que supuse que el campo NUMERO_TELEFONO era muy largo y esto impedia la conversión. Quizas era así, no lo podría afirmar, pero las excepciones generadas por ODP son bastante genéricas con respecto a lo que acostubro a ver en .NET. Bueno, en fin, modifiqué el numero telefónico del registro en la base de datos que tenia 10 (1234567891) números de largo y lo dejé sólo con 9 (123456789). Posteriormente ejecuté y trajo el listado respectivo.  Agradecería que me pudieran validar para en próximas publicaciones, poder agregar imágenes y fragmentos de código. 

    Gracias por la ayuda de ambos




    martes, 1 de mayo de 2018 23:49