Me parece que no puede encontrar esta pregunta en cualquier lugar en Google (o en StackOverflow), que realmente me sorprendió, así que me estoy poniendo aquí para ayudar a otros en la misma situación.

Tengo una consulta SQL que se ejecuta bien en Oracle Sql Developer, pero cuando lo ejecuto a través de C# utilizandoadapter.Fill(table) para obtener los resultados, tengo Specified cast is not valid errores (System.InvalidCastException).

Aquí es la versión reducida de el código de C#:

var resultsTable = new DataTable();

using (var adapter = new OracleDataAdapter(cmd))
{
    var rows = adapter.Fill(resultsTable);  //exception thrown here, but sql runs fine on Sql Dev

    return resultsTable;
}

Y aquí es una versión simplificada de la SQL:

SELECT acct_no, market_value/mv_total
FROM myTable
WHERE NVL(market_value, 0) != 0
AND NVL(mv_total, 0) != 0

Si puedo eliminar la división de la cláusula, que no de error, por lo que es específico para eso. Sin embargo, tanto market_value y mv_total son del tipo de Número(19,4) y puedo ver que el Oráculo adaptador está a la espera de un decimal, así que lo yeso está teniendo lugar? ¿Por qué se hace en SqlDev, pero no en C#?

InformationsquelleAutor namford | 2014-05-29

3 Comentarios

  1. 36

    Responder a mi propia pregunta:

    Por lo que parece que el número de Oracle tipo puede tener muchos más lugares decimales que el de C# tipo decimal y si el Oráculo está tratando de volver más de C# puede sostener, se produce la InvalidCastException.

    Solución?

    En sql, la ronda de los resultados que podría tener demasiados decimales a algo razonable. Así que hice esto:

    SELECT acct_no, ROUND(market_value/mv_total, 8)  -- rounding this division solves the problem
    FROM myTable
    WHERE NVL(market_value, 0) != 0
    AND NVL(mv_total, 0) != 0

    Y funcionó.

    La toma de distancia es: la Incompatibilidad entre Oracle número y tipo de C# decimal. Restringir su Oracle decimales para evitar los emitidos válidos excepciones.

    Espero que esto ayude a alguien más!

    • Gracias por la publicación de una solución a su propio problema. probablemente me salvó un par de horas (y el pelo gris^^). Pero hay una manera que evita el redondeo de números dentro de la consulta?
    • Sé que este post es un poco viejo, pero esto me acaba de suceder, y de redondeo no ayuda. En mi caso, he tenido algunos valores muy altos. Para la integridad (esperemos que no sea necesario para el mercado de valores 🙂 ) escribe: RONDA(MAYOR(MENOS(market_value/mv_total,7.9E28),-7.9E28),8)
    • Usted hermano me salvó el día
    • Me has salvado la vida con esto. Gracias!
  2. 6

    Sé que este hilo es muy viejo.. sin Embargo he tenido un problema similar.

    La mejor solución que tengo que utilizar Oracle método TO_BINARY_DOUBLE en Oracle columna Decimal

  3. 0

    Sé que esto ha sido contestado ya, pero también he encontrado otra alternativa que yo lo uso así. He utilizado un molde en el campo que me estaba dando problemas.

    Basado en la OP del comando SELECT:

    SELECT acct_no, CAST((market_value/mv_total) AS DECIMAL(14,4))  -- CAST to decimal here
    FROM myTable
    WHERE NVL(market_value, 0) != 0
    AND NVL(mv_total, 0) != 0

Dejar respuesta

Please enter your comment!
Please enter your name here