Ce qui est une bonne cartographie des .NET décimal à SQL Server décimal?
Je vais avoir à l'interface d'un code C#, SQL Server et je veux avoir exactement autant de précision lors de stocker une valeur dans la base de données comme je le fais avec mon code C#. J'en utilise un de .NET decimal
type d'une valeur. Quel type de données/de précision aurais-je utiliser pour cette valeur dans SQL Server?
Je suis conscient que le Serveur SQL decimal
type est le type le plus probable correspond à mes besoins pour cette. Ma question est bien ce que l'échelle et la précision dois-je utiliser afin qu'il corresponde .NET decimal
type?
- +1 Belle question! J'allais poser la même question sur SI il y a 8 mois, mais j'ai complètement oublié!
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser SQL Server
decimal
type (la documentation ici). Qui vous permet de spécifier une précision et l'échelle pour les numéros dans la base de données, vous pouvez définir le même que dans votre code C#.Votre question, cependant, semble être sur la cartographie de la .NET type décimal vers le Serveur SQL de type decimal. Et malheureusement, ce n'est pas simple. Le Serveur SQL décimal, à un maximum de précision, couvre la gamme de -1038+1 pour 1038-1. Dans .NET, cependant, il peut couvrir n'importe où à partir de ±10-28 de ±7.9×1028, selon le nombre.
La raison en est que, en interne, .NET traite décimales très similaire à flotteurs—il le stocke sous forme d'une paire de nombres, une mantisse et un exposant. Si vous avez une grande mantisse, vous allez perdre de la précision. Essentiellement, .NET vous permet de combiner des nombres qui ont à la fois un haut et un bas de l'échelle; SQL Server vous oblige à opter pour une colonne donnée à l'avance.
En bref, vous allez avoir besoin de décider ce que l'intervalle de validité des valeurs décimales sont, pour vos besoins, et assurer à la fois votre programme et de la base de données peut s'en occuper. Vous avez besoin de le faire de toute façon pour votre programme (si vous êtes de mélange des valeurs comme l'10-28 avec 7,9×1028, vous ne pouvez pas compter sur le type décimal de toute façon).
precision
etscale
sorte qu'il est tout aussi précis .NETdecimal
? (note de 1,25 et 1.250 question n'est pas pertinente pour nous)Couramment nHibernate Système de cartes.Virgule comme
Ce tableau peut vous aider.
Un Maximum de précision pour les objets numériques et des décimales dans SQL Server est de 38 (voir ici).
decimal
pour SQL Server si? Il semble que le défaut est(18,0)
qui n'est certainement pas ce que je voulais.Ou vous pouvez également envisager l'
MONEY
type de données:La réponse courte est que C# décimal est une 128 bits à virgule flottante de précision nombre et il n'a pas d'équivalent exact dans Sql Server.
Peut-être dans une future version de Sql Server, Microsoft va correspondre à la fois ses produits et de soutenir tout droit vers l'avant [clr /c# équivalent décimal] de 128 bits à virgule flottante de précision nombre, directement persistent sur son Serveur de Base de données.
J'ai eu ce problème lors de l'analyse face à de très grandes et très petites quantités. Dans mon cas, tout en comparant les quantités à l'intérieur de mes solutions sont à l'intérieur de la 64 bits de large que [c# double /float sql] peut gérer. Donc, j'ai choisi d'utiliser [c# double /float sql] lorsque vous traitez avec les quantités, et [c# décimal /sql argent] lorsque vous traitez avec la partie financière de mes solutions.
Le C#'s décimal type de taille est de 128 bits (16 octets). Dans SQL Server si vous spécifiez une précision entre 20-28, il va utiliser le 13 octets pour le stockage. Si vous spécifiez la précision entre 29-38, il utilisera 17 octets pour le stockage. Pour votre base de données pour être en mesure de stocker l'ensemble de la gamme de valeurs pour les .NET décimal de type, vous devez utiliser le Serveur SQL est décimal type avec une précision minimale de 29. Parce que toute la précision entre 29 et 38 utiliser la même quantité d'octets pour le stockage (17), il est dans votre intérêt de sélectionner 38 de précision.
Le C#de type decimal vous permet de l'utiliser sans l'accord préalable de la spécification exactement quelle partie de la précision que vous allez utiliser avant et après le séparateur décimal. Vous n'avez pas ce luxe dans SQL Server. La décision de l'échelle dépend entièrement de vos besoins, mais vous devez prendre cette décision parce que si vous ne spécifiez pas une échelle, il sera 0 par défaut et vous ne serez pas en mesure de stocker des nombres à virgule flottante à tous.
Précède est vrai, dans le cas où vous devez être sûr que vous serez en mesure de stocker l'ensemble .NET décimal gamme.
Si vous utilisez de C#décimales en vue de l'argent dans votre application, je pense que la Virgule(19, 4) sera suffisante.