2009-06-25 11 views
13

Estoy trabajando en C# .net 2 (Visual Studio 2005 SP1) intentando llenando un conjunto de datos con los resultados de una selección * de la tabla de una base de datos Oracle10g. El .NET Framework, IDE y la base de datos no pueden cambiarse en este sitio del cliente.ODP.net Oracle Decimal Número de problema de precisión al llenar un conjunto de datos. Excepción: la operación aritmética resultó en un desbordamiento

Estoy conectando con el proveedor de ODP.net la versión DLL es 2.102.2.20

Cuando ejecuto el comando de llenado obtengo una excepción:

operación aritmética dio lugar a una desbordamiento

También si intento ver la columna ofensiva en el diseñador de Visual Studio (Mostrar datos de tabla) obtengo para ev ery fila para esta columna en la tabla. El código funciona perfectamente si mi consulta selecciona otras columnas con enteros, por ejemplo, omitiendo esta columna.

La columna en cuestión se ve bien cuando veo que en la base de datos de sapo, los datos se parece a:

919,742866695572

necesito el precisión ya que es necesario para una simulación de Monte Carlo.

Si en lugar de usar un adaptador de datos para llenar la tabla de datos utilizo un lector de datos y llamo dataReader.getValue (columnIndex) obtengo el mismo error pero si llamo a dataReader.GetOracleDecimal (columnIndex) entonces obtengo el resultado que estoy buscando para, no hay error

Preferiría usar el adaptador de datos y llenar un conjunto de datos (tenga en cuenta que estos son conjuntos de datos no tipados, ya que no pude obtener datasets fuertemente autodefinidos para trabajar desde un oráculo db). No quiero usar datareader y recorrer los resultados (seleccionar los valores de columna) ya que estoy tratando de escribir esto como un método genérico para trabajar en muchos escenarios, independientemente del número de columnas, el índice de columnas decimales que requeriría una especificación específica. recibe llamadas por tipo de datos.

¿Alguien puede ayudar? ¿Puedo usar las nuevas versiones de los DLL de ODP.net para conectarme a la base de datos Oracle10g anterior? Me pregunto si esto ayudará.

Gracias

+0

Cambiar la versión de ODP.net a 11g (Oracle.DataAccess.dll 2.111.6.20) no ayudó Aún obtengo la operación aritmética como resultado una excepción de desbordamiento. Una solución aunque no ideal es que al hacer esto: SELECT TO_CHAR (offendingColumn) DE Tabla Pero ahora mis tipos DataColumn son diferentes, escribo estos datos a Excel, así que estoy seguro si esto afectará el formato de celda también. – m3ntat

+0

También significa que necesito saber acerca de cada columna en la Tabla. No puedo simplemente hacer una cobija. Seleccionar * De la Tabla – m3ntat

Respuesta

0

You can try the latest version of ODP.Net (11g). Es retrocompatible. Lo uso para conectarme a una base de datos 10g bien. Creo que debería funcionar con VS 2005 también. Para la implementación de clickonce, simplemente agregue los dlls a los que hace referencia esta pregunta: What is the minimum client footprint required to connect C# to an Oracle database? Una nota importante es que si tiene la última versión de odp.net, todos los dlls están incluidos en el directorio de instalación. No necesita descargar el cliente instantáneo por separado. Solo búscalos.

+0

Estupendo intentar esto en mi computadora le permitirá saber cómo me llevo. En la máquina desplegada, ¿necesito instalar esto también? o simplemente puedo implementar mi aplicación de consola con una versión más nueva de Oracle.DataAccess.Dll? No prefiero simplemente implementar esta aplicación con todos los archivos DLL requeridos para Oracle en mi carpeta bin de aplicaciones y no la instalación en el equipo implementado (un servidor), qué implica esto y qué archivos son necesarios. Gracias – m3ntat

+0

Querrá utilizar Oracle Developer Tools para Visual Studio e incluye todas las dlls que necesita. La única forma de instalarlo en la máquina cliente es instalando Oracle Client completo o usando el cliente instantáneo (que recomiendo). Para un cliente instantáneo, solo necesita encontrar los .dlls (vea http://stackoverflow.com/questions/70602/what-is-the-minimum-client-footprint-required-to-connect-c-to-an- oráculo-base de datos) para más información y añádalos para copiar como contenido. Esto asegurará que se implementen correctamente. – jle

1

El problema es que la precisión del valor del resultado es demasiado alta para convertirla a System.Decimal sin pérdida de datos. Olvidé la cantidad exacta de dígitos permitidos, pero es alrededor de 18 o así. ¿Es aceptable redondear() el valor del resultado a tantos dígitos? En el ejemplo que proporcionó, un round(MyColumn, 15) más o menos debería ser suficiente ...

Cuestiones relacionadas