2010-06-14 5 views
1

J'ai une valeur correctement stockée dans une propriété d'un objet, mais lorsque j'enregistre les modifications dans la base de données de stockage Azure, la valeur double est stockée dans la base de données en ignorant le point (7.11000000003 est enregistré en tant que 711). En outre, la propriété est modifiée en 711.0.Stockage Azure: le point décimal est ignoré lors de la sauvegarde

Comment résoudre ce problème?

Le champ est déjà défini pour doubler dans la classe et la table de base de données.

Répondre

2

Ce problème semble être dû aux paramètres de culture utilisés par le stockage de stockage. Si vous regardez la table TableRow à l'intérieur de la base de données Dev Storage, les données sont stockées en XML et les valeurs décimales utilisent le point comme séparateur décimal. Ici, au Brésil, le point est le séparateur des milliers. J'ai édité les données directement dans le Dev Storage db, en changeant le point à une virgule (séparateur décimal PT-BR), et la valeur a été lu ok. C'est étrange, car si la valeur est lue correctement lorsque nous utilisons le séparateur décimal PT-BR, il semble que Dev Storage utilise mon paramètre de culture actuel. Mais pourquoi la culture n'est pas appliquée sur la sauvegarde des données? PS: la modification des paramètres régionaux de Windows en EN-US a résolu le problème. Je suppose que c'est pourquoi c'est le seul article que je pourrais trouver à ce sujet.

+0

Ceci est corrigé dans le SDK 1.3 –

+0

Nous utilisons SDK 1.5 et toujours (ou encore) avons ce problème mais ce post montre que notre code est correct et c'est un problème dans le stockage Dev. –

3

Votre double valeur est-elle dans son propre champ ou est-ce dans le champ partitionkey ou rowkey? PartitionKey et RowKey sont toujours des chaînes.

Je viens de créer un test simple qui écrit et lit une ligne avec un double champ, et les valeurs sont très bien conservées. J'ai modifié la classe échantillon SmsMessage à partir du code SMS Bill Lodin via msdev.com formation (je pris le int champ Délai et changé pour un flotteur, et retitré à MyDouble des éclaircissements):

public class SmsMessage: TableServiceEntity 
{ 
    public double MyDouble { get; set; } 
    public SmsMessage(string destination, string message, double myDouble) 
    { 
     PartitionKey = destination; 
     RowKey = message; 
     MyDouble = myDouble; 
    } 
    public SmsMessage() 
     : base("", string.Format("{0:d10}", DateTime.Now.Ticks)) 
    { 
    } 
} 

je puis écrire à le SmsMessageTable:

smsTable.AddObject("SmsMessages", new SmsMessage(destination, message, myDouble)); 
smsTable.SaveChanges(); 

J'y vois dans l'explorateur de stockage de table, et mes doubles sont comme je les ai inscrits (par exemple 1,2345).

je récupère puis avec une simple requête LINQ, un nom d'utilisateur donné dans la clé de partition:

var results = from m in smsTable.SmsMessages 
         where m.PartitionKey.Equals(txtDestination.Text.Trim()) 
         select m; 

Mes doubles valeurs sont toutes conservées et fortement typés comme doubles.

+0

Oui, cela semble être correct! La méthode SaveChanges() ne devrait pas altérer les valeurs des propriétés, mais de toute façon elle me fait croire qu'il pourrait y avoir une contrainte qui ne permette pas d'enregistrer le double en tant que tel. David, avez-vous des suggestions à propos de ce problème? –

+1

Salut Fabio - Je ne connais pas de restriction sur le double. L'exemple que j'ai donné me permet d'enregistrer et de récupérer des doublons sans aucun problème.Avez-vous essayé de créer une classe dérivée de TableServiceEntity très simple comme celle ci-dessus? En outre: après avoir écrit sur le stockage, essayez de visualiser vos données avec un explorateur de stockage (tel que celui intégré dans VS2010). Si vous ne voyez pas de doubles, cela signifie qu'il y a probablement un problème avec votre TableServiceEntity. –

+0

Nous utilisons une classe BaseEntity équivalente à votre TableServiceEntity et le problème doit être présent. Et personne dans cette entreprise ne semble le comprendre. Je vais essayer votre code juste pour vous assurer que ce problème est dans notre classe BaseEntity et ensuite le vérifier. Merci David! –

1

Comment vérifiez-vous la valeur? Le stockage de développement local utilise SQL Express sous le capot, ce qui vous permet d'ouvrir SQL et de faire des recherches. Je voudrais éviter cela et lire à la place la valeur en utilisant la bibliothèque du client de stockage .NET. Je soupçonne que la valeur reviendra correctement.

(Peut-être dans le magasin local SQL soutenu, la valeur est stockée dans la notation scientifique?)

+0

Je sais que le stockage de développement local utilise SQL Server Express et je comprends ce que vous voulez dire, mais c'est très étrange, car la valeur elle-même est modifiée immédiatement après l'enregistrement des données dans la base de données. O Oubliez la valeur stockée dans la base de données. La propriété double perd le point décimal. Par exemple, ce 7.11000003 devient 711.0 dans l'application! Ce n'est pas en notation scientifique. Avez-vous d'autres suggestions? C'est toujours le bienvenu! :) –

+1

Je vois. Je ne sais pas pourquoi cela arriverait ... avez-vous essayé le code de David? Est-ce que ça marche pour toi? – smarx

+0

Non, mais je le ferai. Je suspecte maintenant que notre problème est dans notre baseEntity parce que d'autres membres dans l'entreprise ont le même problème et n'ont pas pu le résoudre encore. Merci smarx! –

0

Bien que j'apprécie l'effort et probablement que je ne l'ai pas exposer le cas assez bien, rien de tout cela vraiment répondu à ma question . Cette réponse est juste de ne pas attribuer la prime injustement. La prime ne doit pas être attribuée automatiquement à la meilleure réponse avec> = 2 upvotes.

+1

Vous pourriez envisager de publier votre code pour inspection. Sans voir ce que vous avez réellement codé, c'est vraiment difficile à diagnostiquer, d'autant plus qu'aucun d'entre nous n'a été capable de recréer le problème. –

+0

Merci, mais j'ai trouvé que le problème n'est pas dans le code. Ça a toujours été correct. Il ne fonctionne pas sur le stockage local, mais fonctionne parfaitement sur le stockage distant Azure. La raison pour laquelle est quelque chose que je ne sais pas encore, mais pas très préoccupé. –

Questions connexes