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

- Technofolies, votre évènement numérique de l'année par Le Blog (Vert) d'Arnaud JUND le 09-26-2014, 18:40

- Xamarin : From Zero to Hero par Fathi Bellahcene le 09-24-2014, 17:35

- Conférences d’Automne 2014 par Le blog de Patrick [MVP SharePoint] le 09-24-2014, 14:53

- [TFS] Supprimer un projet de Visual Studio Online par Blog de Jérémy Jeanson le 09-22-2014, 20:42

- Nouveau blog en anglais / New blog in english ! par Le blog de Patrick [MVP SharePoint] le 09-18-2014, 18:42

- [ #Yammer ] From Mailbox to Yammer and back / De votre messagerie vers Yammer et retour ! par Le blog de Patrick [MVP SharePoint] le 09-15-2014, 11:31

- [ #Office 365 ] New service settings panel / Nouveau panneau de paramétrage des services par Le blog de Patrick [MVP SharePoint] le 09-11-2014, 08:50

- Problème de déploiement pour une démo SharePoint/TFS? par Blog de Jérémy Jeanson le 09-10-2014, 21:52

- [ #Office365 ] Delve first impressions / Premières impressions sur Delve par Le blog de Patrick [MVP SharePoint] le 09-09-2014, 16:57

- [ #Office365 ] How to change Administration console language ? / Comment changer la langue de la console d’administration ? par Le blog de Patrick [MVP SharePoint] le 09-09-2014, 08:25