none
La Conversion Especificada no es válida RRS feed

  • Pregunta

  •  Estoy en un proyecto de WPF, accediendo a una base de datos de SQL mediante un DataReader, y me está marcando un error que no sé cómo resolver:

    SqlDataReader sqlreader = comm.ExecuteReader();
    if (sqlreader.HasRows)
    {
        while (sqlreader.Read())
        {
            MessageBox.Show("Type: " + sqlreader.GetDataTypeName(2));
            lsFacturas.Add(new FacturacionCL
            {
                Codigo = sqlreader.GetInt32(0),
                Descripcion = sqlreader.GetString(1),
                NetoB04 = sqlreader.GetFloat(2) 
    

    puse un MessageBox para ver qué tipo de dato me regresa la columna 2, y me dice que es un float, pero cuando quiero hacerle el GetFloat me marca el error "La Conversion Especificada no es válida"

    El query en esa columna trae un SUM del campo Neto que en la tabla de SQL es un (float, null)

    La propiedad NetoB04 del List lsFacturas, en donde lo quiero poner, es un float

    Las otras 2 columnas (0 - Codigo y 1 - Descripcion) si me las trae correctamente

    Dónde está el problema??


    cyndyrdz

    viernes, 21 de abril de 2017 14:19

Respuestas

  • Cynthia Rodriguez

    Pruébalo como double

    sqlreader.GetDouble()

    Por otro lado, te recomiendo traer con el nombre y no su posición

    sqlreader.dr.Int32(dr.GetOrdinal("campoCodigo"));
    ...
    ..
    Saludos


    Si ayudé a resolver tu consulta, no olvides marcar como respuesta y/o votar como útil.

    viernes, 21 de abril de 2017 14:28
  • {...} El query en esa columna trae un SUM() del campo Neto que en la tabla de SQL es un (float, null). La propiedad NetoB04 del List<lsFacturas>, en donde lo quiero poner, es un float.

    El equivalente del tipo float de SQL Server en el marco de trabajo de .NET es el tipo Double, por tanto tienes dos opciones:

    - Mantienes el tipo float de la propiedad 'NetoB04' y "casteas" el resultado:

    NetoB04 = (float)sqlreader.GetDouble(2) 
    

    - Cambias el tipo de la propiedad 'NetoB04' a double:

    NetoB04 = sqlreader.GetDouble(2) 
    


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    viernes, 21 de abril de 2017 14:43
  • Gracias Bryan, no se que es dr pero seguí tu sugerencia de no usar el índice y quedó así:

    Codigo = Convert.ToInt32(sqlreader["Codigo"].ToString()),
    Descripcion = (sqlreader["Descripcion"].ToString()), 
    NetoB04 = (float)Convert.ToDouble(sqlreader["NetoB04"].ToString()), 
    ToneladasB04 = (float)Convert.ToDouble(sqlreader["ToneladasB04"].ToString()), (3),
    ImporteB04 = Convert.ToDecimal(sqlreader["ImporteB04"].ToString()), 
    
    Saludos y gracias


    cyndyrdz

    viernes, 21 de abril de 2017 16:45

Todas las respuestas

  • Cynthia Rodriguez

    Pruébalo como double

    sqlreader.GetDouble()

    Por otro lado, te recomiendo traer con el nombre y no su posición

    sqlreader.dr.Int32(dr.GetOrdinal("campoCodigo"));
    ...
    ..
    Saludos


    Si ayudé a resolver tu consulta, no olvides marcar como respuesta y/o votar como útil.

    viernes, 21 de abril de 2017 14:28
  • {...} El query en esa columna trae un SUM() del campo Neto que en la tabla de SQL es un (float, null). La propiedad NetoB04 del List<lsFacturas>, en donde lo quiero poner, es un float.

    El equivalente del tipo float de SQL Server en el marco de trabajo de .NET es el tipo Double, por tanto tienes dos opciones:

    - Mantienes el tipo float de la propiedad 'NetoB04' y "casteas" el resultado:

    NetoB04 = (float)sqlreader.GetDouble(2) 
    

    - Cambias el tipo de la propiedad 'NetoB04' a double:

    NetoB04 = sqlreader.GetDouble(2) 
    


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    viernes, 21 de abril de 2017 14:43
  • Muchas gracias Willams, depurando fue lo que observé, al consultar lo que traía me indicaba que era un Double, así que lo traigo con el GetDouble y lo convierto a Float. Gracias

    cyndyrdz

    viernes, 21 de abril de 2017 16:27
  • Gracias Bryan, no se que es dr pero seguí tu sugerencia de no usar el índice y quedó así:

    Codigo = Convert.ToInt32(sqlreader["Codigo"].ToString()),
    Descripcion = (sqlreader["Descripcion"].ToString()), 
    NetoB04 = (float)Convert.ToDouble(sqlreader["NetoB04"].ToString()), 
    ToneladasB04 = (float)Convert.ToDouble(sqlreader["ToneladasB04"].ToString()), (3),
    ImporteB04 = Convert.ToDecimal(sqlreader["ImporteB04"].ToString()), 
    
    Saludos y gracias


    cyndyrdz

    viernes, 21 de abril de 2017 16:45
  • Hola 

    En realidad solo sqlreader.GetInt......

    lo que sucede es que tengo por costumbre llamarlo dr (en este caso tu lo llamaste sqlreader)

    Saludos!


    Si ayudé a resolver tu consulta, no olvides marcar como respuesta y/o votar como útil.


    viernes, 21 de abril de 2017 16:51