2010-06-30 14 views
30

Estoy teniendo que interconectar algunos códigos C# con SQL Server y quiero tener exactamente tanta precisión al almacenar un valor en la base de datos como lo hago con mi código C#. Yo uso uno de los tipos de .NET decimal para un valor. ¿Qué tipo de datos/precisión usaría para este valor en SQL Server?¿Qué es un buen mapeo de .NET decimal a SQL Server decimal?

Soy consciente de que el tipo de SQL Server decimal es el tipo que más se ajusta a mis necesidades para esto. Aunque mi pregunta es: ¿qué escala y precisión uso para que coincida con el tipo de decimal de .NET?

+0

+1 ¡Bonita pregunta! Iba a hacer la misma pregunta en SO hace 8 meses, ¡pero lo olvidé por completo! – spong

Respuesta

10

Puede utilizar el tipo de SQL Server decimal (documentation here). Eso le permite especificar una precisión y una escala para los números en la base de datos, que puede configurar para que sea el mismo que en su código C#.

Su pregunta, sin embargo, parece ser sobre mapear el tipo decimal .NET al tipo decimal de SQL Server. Y desafortunadamente, eso no es sencillo. El decimal de SQL Server, con la máxima precisión, cubre el rango de -10 +1 a 10 -1. En .NET, sin embargo, puede cubrir desde ± 10 -28 hasta ± 7.9 × 10 , dependiendo del número.

La razón es que, internamente, .NET trata los decimales de manera muy similar a los flotantes, lo almacena como un par de números, una mantisa y un exponente. Si tienes una mantisa especialmente grande, vas a perder algo de la precisión. Básicamente, .NET le permite mezclar números que tienen una alta y una baja escala; SQL Server requiere que lo elijas para una columna dada antes de tiempo.

En resumen, tendrá que decidir cuál es el rango válido de valores decimales, para sus propósitos, y asegurarse de que tanto su programa como la base de datos puedan manejarlo. Debe hacer eso de todos modos para su programa (si está mezclando valores como 10 -28 con 7.9 × 10 , no puede confiar en el tipo decimal de todos modos).

+3

Lo que estoy preguntando es por SQL Server, ¿cuáles serían los valores que debería usar para 'precision' y' scale' para que sean tan precisos como .NET 'decimal'? (tenga en cuenta que el problema 1.25 y 1.250 no es relevante para nosotros) – Earlz

4

This chart may help you.

precisión máxima para los valores numéricos y decimales en SQL Server es 38 (see here).

+0

Sí, .NET Decimal a SQL Decimal debe estar bien – Riaan

+0

¿Qué precisión de 'decimal' para SQL Server? Parece que el valor predeterminado es '(18,0)' que definitivamente no es lo que yo quería. – Earlz

20

Fluido mapas Nhibernate System.Decimal como

decimal(19, 5) 
+1

por cierto, el dinero es decimal (19,4) –

0

La respuesta corta es que C# decima l es un número de precisión de coma flotante de 128 bits y no tiene un equivalente exacto en el servidor Sql.

Puede estar en una futura versión de Servidor SQL, Microsoft coincidirá con sus productos y admitirá un número directo [clr/C# decimal equivalente] de número de precisión de punto flotante de 128 bits, para persistir directamente en su Servidor de Base de Datos.

Tuve este problema de análisis cuando se trata de cantidades muy grandes y muy pequeñas.En mi caso, todas las cantidades de comparación dentro de mis soluciones están dentro del rango de 64 bits que [C# double/sql float] puede manejar. Por lo tanto, he elegido usar [C# double/sql float] cuando se trata de cantidades, y [C# decimal/sql money] cuando trato con la parte financiera de mis soluciones.

0

El tamaño de tipo de letra de C# decimal es de 128 bits (16 bytes). En SQL Server, si especifica una precisión entre 20-28, usará 13 bytes para el almacenamiento. Si especifica precisión entre 29-38, usará 17 bytes para el almacenamiento. Para que su base de datos pueda almacenar todo el rango posible de valores para el tipo decimal de .NET, deberá usar el tipo decimal de SQL Server con una precisión mínima de 29. Porque cualquier precisión entre 29 y 38 usará la misma cantidad de bytes para el almacenamiento (17), le conviene seleccionar 38 como una precisión.

El tipo decimal de C# le permite usarlo sin especificación previa, exactamente qué parte de la precisión usará antes y qué parte después del separador decimal. No tienes ese lujo en SQL Server. La decisión de la escala depende totalmente de sus requisitos, pero debe tomar esa decisión porque si no especifica una escala, será 0 por defecto y no podrá almacenar números de punto flotante.

Lo anterior es cierto en caso de que tenga que estar seguro de que podrá almacenar todo el rango decimal de .NET.

Si usa el decimal de C# para ganar dinero en su aplicación, creo que Decimal (19, 4) será suficiente.

Cuestiones relacionadas