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

- Festival #SharePoint et #Office 365 à Paris dans moins d’un mois ! par Le blog de Patrick [MVP Office 365] le 04-28-2016, 07:58

- Office 365: Sauvegarder un WorkBook OneNote 2016 depuis OneDrive par Blog Technique de Romelard Fabrice le 04-27-2016, 17:48

- Office 365: Comment ouvrir son OneDrive for Business en Explorateur Windows par Blog Technique de Romelard Fabrice le 04-25-2016, 18:09

- Problème de couplage entre Band 2 et Windows Mobile 10 par Blog de Jérémy Jeanson le 04-23-2016, 09:24

- Office 365: OneDrive for Business–Supprimer dans le bouton Sync du Site Web MySite par Blog Technique de Romelard Fabrice le 04-22-2016, 17:51

- SAM Labs, l'internet des objets, un jeu d'enfants par Le Blog (Vert) d'Arnaud JUND le 04-22-2016, 09:59

- SharePoint 2013: Personaliser le Theme Colors en mode Edit Page par Blog Technique de Romelard Fabrice le 04-21-2016, 18:16

- Office 365: Monter une machine de management pour gérer Office 365 par Blog Technique de Romelard Fabrice le 04-21-2016, 14:49

- Office 365: Comment Gérer SharePoint Online avec Client Side Object Model (CSOM) par Blog Technique de Romelard Fabrice le 04-21-2016, 09:47

- Office 365: la synchronisation (mode Offline) avec OneDrive for Business par Blog Technique de Romelard Fabrice le 04-19-2016, 14:14