Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Atteint de JavaScriptite Aiguë [Cyril Durand]

Expert ASP.net Ajax et WCF, Cyril Durand parle dans son blog de point techniques sur ASP.net, ASP.net Ajax, JavaScript, WCF et .net en général. Cyril est également consultant indépendant, n'hésitez pas à le contacter pour de l'assistance sur vos projets

Actualités

  • Blog de Cyril DURAND, passionné de JavaScript, Ajax, ASP.net et tout ce qui touche au developpement Web Client-Side.

    N'hésitez pas à me contacter pour vos projets .net : architecture, accompagnement, formation, ...

    View Cyril Durand's profile on LinkedIn
    hit counters


    Expertise Commerce server et BizTalk

.net, l’infini et SQL Server

J’ai récemment eu besoin de représenter l’infini dans une base SQL Server. J’ai alors fait quelques recherches et j’ai découvert les constantes PositiveInfinity et NegativeInfinity au niveau des types Single et Double (respectivement float et double).

Ces constantes sont décrites par le standard IEEE 754 (Wikipedia). Il ne s’agit donc pas d’un concept propre à .net mais d’un concept propre à l’informatique en général.

J’ai testé plusieurs opérations avec l’infini, les règles mathématiques semblent respectées. Plusieurs choses sont cependant à noter :

  • Il existe une constante NaN (Not a Number) qui correspond à un nombre qui ne représente pas un nombre.
  • L’infini est égale à elle même
  • NaN n’est pas égale à lui-même (comme en JavaScript)

J’ai alors essayé d’insérer ces constantes dans SQL Server, ADO.net déclenche une exception. Ces constantes ne sont pas définis au niveau de SQL Server !

J’ai cherché sur le net, et ce comportement est apparu à partir de SQL Server 2005, un bug connect a été créé à ce propos : Storing IEEE 754 Floats in SQL Server 2005 (NaN, +/- Infinity)

J’ai fait d’autres tests avec ces constantes. Si l’on sérialise cette valeur en SOAP, la valeur est bien transmise, la spécification SOAP définit les types float et double comme le décrit le standard IEEE 754. Si l’on sérialise en JSon via le JavaScriptSerializer, la valeur est bien transmise, JavaScript définit également ces constantes.

Si l’on souhaite vraiment stocker l’infini dans une base SQL Server, je vois alors plusieurs possibilités.

  • soit on utilise une colonne de type binary(32) et on doit refaire tous les calculs ;
  • soit on utilise une colonne XML et les performances seront dégradées ;
  • soit on rajoute une colonne de type smallint et on traite les cas particuliers (number, NaN, NegativeInfinity, PositiveInfinity). Il s’agit de la solution que j’ai utilisé ;
  • soit on utilise un UDT .net de type float ou double (merci à Christian pour l’astuce).

Et vous, avez-vous eu besoin de stocker l’infini dans une base de donnée ?

Posted: mercredi 31 août 2011 22:02 par cyril
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Commentaires

Danuz a dit :

Pour ma part, ça ne m'est jamais arrivé (de stocker de l'illimité dans quelque chose de fini, limité :D). Sinon, par curiosité, pourquoi stocker des valeurs comme l'infini ?

Je n'en comprends pas vraiment l'utilité :S.

# septembre 1, 2011 08:54

cyril a dit :

Pour ma part, je voulais stocker le stock d'un produit. Je sais que le stock de ce produit est très très grand mais je ne sais pas le quantifier avec précision. Je suis juste capable de savoir s'il y en a beaucoup ou plus du tout.

# septembre 1, 2011 10:33

christian a dit :

Hello

Rajouter des colonnes qui traitent ce cas de type bit serait aussi une solution, certes tu t'embettera côté code à les mettre à jour mais tu restera dans un encodage standard.

Tu peux aussi teste un UDT .net çà devrait marcher.

Christian

# septembre 1, 2011 10:35

cyril a dit :

Merci Christian, je viens de mettre à jour. L'ajout d'une colonne décrivant le comportement de la colonne est la solution que j'ai utilisé, j'ai "juste" oublié de le rajouter.

Quant au UDT .net, je n'y avais pas pensé. Niveau performances, tu as une idée de ce que cela pourrait donner ?

# septembre 1, 2011 12:42

christian a dit :

Faudrait tester, j'avoie que plus on se rapproche d'un type natif SQL Server, plus je doute de l'intérêt de la chose... Le hic c'est que le Garbage Collector fait pas mal de dégat à chaque intentiation. Donc plus c'est simple et moins le SQLCLR tient la route face au SQL :(

# septembre 1, 2011 21:39
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- SharePoint 2013: Préparation de la migration - Création des site Templates dans 2010 et 2013 par Blog Technique de Romelard Fabrice le il y a 11 heures et 39 minutes

- [ #Yammer ] How to change interface language ? Comment changer la langue de l’interface ? par Le blog de Patrick [MVP SharePoint] le il y a 13 heures et 49 minutes

- Onedrive Sync Engine Host : CPU à 100% par Le petit blog de Pierre / Pierre's little blog le 08-06-2014, 22:22

- SharePoint : Bug sur la gestion des permissions et la synchronisation Office par Blog Technique de Romelard Fabrice le 07-10-2014, 11:35

- SharePoint 2007 : La gestion des permissions pour les Workflows par Blog Technique de Romelard Fabrice le 07-08-2014, 11:27

- TypeMock: mock everything! par Fathi Bellahcene le 07-07-2014, 17:06

- Coding is like Read par Aurélien GALTIER le 07-01-2014, 15:30

- Mes vidéos autour des nouveautés VS 2013 par Fathi Bellahcene le 06-30-2014, 20:52

- Recherche un passionné .NET par Tkfé le 06-16-2014, 12:22

- [CodePlex] Projet KISS Workflow Foundation lancé par Blog de Jérémy Jeanson le 06-08-2014, 22:25