Pregunta ¿Qué es un buen mapeo de .NET decimal a SQL Server decimal?


Tengo que interconectar un código 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 .NET decimal escribe para un valor. ¿Qué tipo de datos / precisión usaría para este valor en SQL Server?

Soy consciente de que el Servidor SQL decimal tipo es el tipo que más se ajusta a mis necesidades para esto. Mi pregunta es, sin embargo, qué escala y precisión uso para que coincida con .NET decimal ¿tipo?


32
2018-06-30 18:57


origen


Respuestas:


Puedes usar el Servidor SQL decimal tipo (documentación aquí) 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 la asignación del 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 -1038+1 a 1038-1. En .NET, sin embargo, puede cubrir desde ± 10-28 a ± 7.9 × 1028dependiendo del numero

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 breve, 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 × 1028, no puede confiar en el tipo decimal de todos modos).


10
2018-06-30 19:08



Fluido nHibernate mapas System.Decimal como

decimal(19, 5)

22
2018-04-27 07:34



Esta tabla puede ayudarte.

La precisión máxima para los números y decimales en SQL Server es 38 (mira aquí)


4
2018-06-30 19:00



O quizás también desee considerar el MONEY tipo de datos:


1
2018-06-30 19:12



La respuesta corta es que C # decimal es un número de precisión de punto 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 combinará ambos 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
2017-10-18 19:38



Los C # 's decimal el tamaño del tipo 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, tendría que usar los SQL Server's decimal escriba con una precisión mínima de 29. Como cualquier precisión entre 29 y 38 usará la misma cantidad de bytes para el almacenamiento (17), le conviene seleccionar 38 como 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 completamente 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 coma 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 obtener dinero en su aplicación, creo que Decimal (19, 4) será suficiente.


0
2018-02-14 18:26