Pergunta

Eu tenho um valor que é armazenado corretamente em uma propriedade de um objeto, mas quando salvo as alterações no banco de dados de armazenamento do Azure, o valor duplo é armazenado no banco de dados Ignorando o ponto (7.11000000003 é salvo como 711). Além disso, a propriedade é alterada para 711.0.

Como eu resolvo este problema?

O campo já está definido para dobrar na classe e na tabela de banco de dados.

Foi útil?

Solução

Esse problema parece ser devido às configurações da cultura que o armazenamento de desenvolvimento está usando. Se você dar uma olhada na tabela de tablerow dentro do banco de dados de armazenamento de desenvolvimento, os dados serão armazenados como XML e os valores decimais usarão o ponto como separador decimal. Aqui no Brasil, o ponto é o separador de milhares. Editei os dados diretamente no DB de armazenamento de desenvolvimento, alterando o ponto para uma vírgula (separador decimal PT-BR) e o valor foi lido OK. Isso é estranho, porque se o valor for lido OK quando usamos o separador decimal PT-BR, parece que o armazenamento de dev está usando minha configuração de cultura atual. Mas por que a cultura não é aplicada para salvar os dados?

PS: Alterar o local do Windows para EN-USs resolveu o problema. Eu acho que é por isso que este é o único post que pude encontrar sobre isso.

Outras dicas

O seu duplo valor é em seu próprio campo, ou está no campo PartionKey ou RowKey? PartitionKey e Rowkey são sempre cordas.

Acabei de criar um teste simples que grava e lê uma linha com um campo duplo, e os valores são preservados muito bem. Modifiquei a aula de smsmessage da amostra do código SMS de Bill Lodin via treinamento MSDEV.com (peguei o campo de atraso e mudei para um flutuador e o renomeei para MyDouble para esclarecimentos):

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))
    {
    }
}

Eu então escrevo para o smsmessageTable:

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

Vejo isso no Table Storage Explorer, e minhas duplas são como eu entrei neles (por exemplo, 1.2345).

Eu recupero então com uma consulta LINQ simples, para um determinado nome de usuário na chave da partição:

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

Meus valores duplos são todos preservados e digitados fortemente como duplos.

Como você está verificando o valor? O armazenamento de desenvolvimento local usa o SQL Express sob o capô, então você pode estar abrindo o SQL e cutucando por lá. Eu evitaria isso e, em vez disso, leria o valor usando a biblioteca do cliente .NET Storage. Eu suspeito que o valor voltará corretamente.

(Talvez na loja local apoiada por SQL, o valor seja armazenado na notação científica?)

Embora eu aprecie o esforço e provavelmente não exponha o caso o suficiente, nada disso realmente responde à minha pergunta. Esta resposta não é apenas atribuir a recompensa injustamente. A recompensa não deve ser atribuída automaticamente à melhor resposta com> = 2 upvotes.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top