none
Como gravar valores decimal no Microsoft Access - C# Windows Form RRS feed

  • Pergunta

  • Pessoal estou criando um aplicação em C# Windows Form applications utilizando o Access como banco de dados por se tratar apenas de uma pequena aplicação, porém estou com um grande problema na hora de gravar valores do tipo Decimal na base de dados. Essa aplicação também tem a necessidade de rodar em computadores que possuem idiomas diferentes, sendo os mais comuns português do Brasil, Inglês (Estados Unidos) e em alguns casos Alemão. Pois bem, no caso o usuário digita o número em um textbox ao qual possui o padrão pt-BR como mascara (125,50) inicialmente eu tentei realizar apenas um:

    valorProduto = Convert.ToDecimal(txtValorProduto.Text);

    porém não funcionou em nenhum dos idiomas.

    Em inglês 125,50 --> 12550

    Em português 125,50 --> 1255

    Pesquisando um pouco na internet eu vi a possibilidade de usar CultureInfo na conversão sendo assim eu tentei da seguinte forma, funcionando apenas em máquinas com idioma em inglês.

    valorProduto = Convert.ToDecimal(txtValorProduto.Text, new CultureInfo("pt-BR"));

    Em inglês 125,50 --> 125.50

    Em português 125,50 --> 1255

    Como eu faço para realizar a gravação desses valores decimais em ambos idiomas sem ter problema?? Lembrando que cada banco de dados Access são individuais.

      
    terça-feira, 2 de junho de 2015 11:55

Respostas

  • Desculpa erro meu só reparei agora que era Access, tente dessa forma:

    INTO Produtos SET nomeProduto=@nomeProduto, valorProduto=CCur(val(@valorProduto)));";


    GTSA vantagem de ser inteligente é que podemos fingir que somos imbecis enquanto ao contrario é completamente impossivel

    terça-feira, 2 de junho de 2015 17:28

Todas as Respostas

  • @J.AndersonSantos

    Pra revolver esta situacao vai ter de trabalhar com a class colture.

    Tens de criar uma funcao, antes de instalar vai vereficar a colture primeiro, depois formata o campo de acordo com a coltura.

    a outra solucao seria criar uma funcao, sempre que voce invocar o metedo decimal, ela vai vereficar a coltura depois formatar decimal de-acordo com a coltura...


    A flower cannot blossom without sunshine, and man cannot live without love.

    terça-feira, 2 de junho de 2015 12:02
    Moderador
  • Teria como postar um exemplo de como eu poderia criar essa função Levi Domingos?
    terça-feira, 2 de junho de 2015 12:08
  • https://msdn.microsoft.com/en-us/library/syy068tk%28v=vs.90%29.aspx?f=255&MSPPError=-2147217396

    https://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo.createspecificculture%28v=vs.110%29.aspx


    A flower cannot blossom without sunshine, and man cannot live without love.


    terça-feira, 2 de junho de 2015 12:26
    Moderador
  • Pessoal debugando eu percebi que por mais que eu formate o meu valor, levando sempre em conta a Culture, na hora de inserir no banco de dados o valor sempre grava errado quando o pc está em português segue exemplo.

    OleDbCommand command = new OleDbCommand(stringSql, connection);
    
    command.Parameters.AddWithValue("@nomeProduto", nomeProduto);
    command.Parameters.AddWithValue("@valorProduto", 125.50M)

    No PC que está rodando em inglês funciona, porém nos que rodam em português não funciona.

    Abrindo o banco de dados em ambos computadores observei que os PC em inglês o separador decimal é o '.' o mesmo passado pelo tipo de dados Decimal, em contra partida o separador decimal dos PCs em português é a ',' será que é por isso que não funciona? Como posso fazer para contornar tal situação? 

    terça-feira, 2 de junho de 2015 13:38
  • Você pode fazer um replace antes de inserir

    string valorProduto = txtValorProduto.Text.Replace(".","").Replace(",",".");

    command.Parameters.AddWithValue("@valorProduto",valorProduto);



    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"


    terça-feira, 2 de junho de 2015 13:47
  • Fazendo um Replace funciona porém essa é a única maneira?

    No caso eu estou trabalhando em camadas, e possuo uma classe Produtos ao qual tem uma propriedade ValorProduto do tipo Decimal, ao qual na camada de apresentação faço a conversão e a atribuição para a mesma. No caso eu teria que na hora de adicionar o parâmetros converter esse decimal para string e depois fazer o Replace?

    command.Parameters.AddWithValue("@valorProduto",produto.ValorProduto.ToString().Replace(".", CurrencyDecimalSeparator));

     Ficaria assim então? Existe apenas essa maneira?
    terça-feira, 2 de junho de 2015 14:24
  • O replace fará funcionar quando for em português somente e na versão em inglês dará o mesmo erro, o correto é você fazer p getCultureInfo para pegar a atual ou converter no script sql antes de inserir.

    GTSA vantagem de ser inteligente é que podemos fingir que somos imbecis enquanto ao contrario é completamente impossivel

    terça-feira, 2 de junho de 2015 14:27
  • Dessa forma Mr. GMSOFT?

    string currencyDecimalSeparator = Thread.CurrentThread.CurrentCulture.NumberFormat.CurrencyDecimalSeparator;
    
    command.Parameters.AddWithValue("@valorProduto",produto.ValorProduto.ToString().Replace(".", currencyDecimalSeparator));

    terça-feira, 2 de junho de 2015 14:40
  • Não, veja aqui nesse artigo como pegar e setar a CultureInfo

    Ou pode tentar dessa forma:

    Informando a CultureInfo:

    System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo("pt-BR");
    OU
    Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.InvariantCulture;

    GTSA vantagem de ser inteligente é que podemos fingir que somos imbecis enquanto ao contrario é completamente impossivel


    • Editado Mr. GMSOFT terça-feira, 2 de junho de 2015 15:33
    terça-feira, 2 de junho de 2015 14:46
  • Mr. GMSOFT eu apenas não entendi uma coisa, eu devo setar a CultureInfo no momento que eu vá inserir os parâmetros? E como ficaria isso? Pois como eu descrevi assim, estou convertendo o valor do TextBox para a propriedade ValorProduto da minha Classe Produtos, está passa a possuir por exemplo 150.5 com o separador decimal inglês, funcionando perfeitamente em PCs com este idioma, pois o Access também passa a possuir esse separador, porém minha dúvida está justamente aonde devo setar a CultureInfo e também como fazer isso para a minha propriedade. 
    terça-feira, 2 de junho de 2015 15:47
  • Não é para inserir nos parâmetros, tem as duas opções que dei nos artigos acima, dá uma olhadinha o exemplo é funcional nos dois artigos.

    A conversão que mencionei seria direto no parâmetro em seu Script SQL.
    Exemplo:
    Script:
    INSERT INTO SUA_TABELA SET VALOR=Cast(@parametro as Decimal(18,2))


    GTSA vantagem de ser inteligente é que podemos fingir que somos imbecis enquanto ao contrario é completamente impossivel

    terça-feira, 2 de junho de 2015 15:55
  • Mr. GMSOFT desculpa a ignorância é que eu nunca trabalhei com esse tipo de script SQL no caso ficaria assim? 

    string sql = "INSERT INTO Produtos SET nomeProduto=@nomeProduto, valorProduto=Cast(@valorProduto as Decimal(10,2));";

    Tentei dessa forma mais deu o seguinte erro: Syntax error in INSERT INTO statement

    Essa função Cast é suportada pelo MS Access, pois como informei no titulo o banco de dados é Access.

    terça-feira, 2 de junho de 2015 16:58
  • Desculpa erro meu só reparei agora que era Access, tente dessa forma:

    INTO Produtos SET nomeProduto=@nomeProduto, valorProduto=CCur(val(@valorProduto)));";


    GTSA vantagem de ser inteligente é que podemos fingir que somos imbecis enquanto ao contrario é completamente impossivel

    terça-feira, 2 de junho de 2015 17:28
  • Não funcionou também Mr. GMSOFT deu o mesmo erro, tentei usar CCur e CDec mais ambos não funcionou mais alguma dica?
    terça-feira, 2 de junho de 2015 17:38
  • Hummm, tente esse:

    CDbl(@valorProduto)


    GTSA vantagem de ser inteligente é que podemos fingir que somos imbecis enquanto ao contrario é completamente impossivel

    terça-feira, 2 de junho de 2015 17:56
  • Também não deu certo... ;(

    string sql = "INSERT INTO Produtos SET nomeProduto=@nomeProduto, valorProduto=CDbl(@valorProduto);";

    terça-feira, 2 de junho de 2015 18:01
  • Dessa forma gravou pelo menos, porém no idioma português ainda está gravando errado 58.90 --> 589

    string sql = "INSERT INTO Produtos (nomeProduto, valorProduto) values (@nomeProduto, CDbl(@valorProduto))";

    terça-feira, 2 de junho de 2015 18:09
  • Como esta definido esse campo na tabela, era para funcionar

    GTSA vantagem de ser inteligente é que podemos fingir que somos imbecis enquanto ao contrario é completamente impossivel

    terça-feira, 2 de junho de 2015 18:24
  • Está definido dessa forma Mr. GMSOFT


    terça-feira, 2 de junho de 2015 18:37
  • Veja se tem currency, ja que se trata de valores

    GTSA vantagem de ser inteligente é que podemos fingir que somos imbecis enquanto ao contrario é completamente impossivel

    terça-feira, 2 de junho de 2015 18:39
  • Não possui, e também em algumas outras tabelas eu tenho a necessidade de trabalhar com decimal e também estou tendo o mesmo problema.
    terça-feira, 2 de junho de 2015 18:52
  • Eu alterei o CDbl que trata-se de um Double para CDec e agora dá o seguinte erro.

    Wrong number of arguments used with function in query expression

    terça-feira, 2 de junho de 2015 19:08
  • Mais com certeza deve ter money.

    ta faltando o val()

    CDec(val(@valorProduto))


    GTSA vantagem de ser inteligente é que podemos fingir que somos imbecis enquanto ao contrario é completamente impossivel

    terça-feira, 2 de junho de 2015 19:14
  • Mesmo colocando o CDec(val@valorProduto)) continua dando errado, o mesmo erro Wrong number of arguments used with function in query expression.

    para mim seria mais útil se eu conseguisse usar como decimal por possuir outros campos aos quais precisam ser decimal.

    terça-feira, 2 de junho de 2015 19:24
  • Funcionou agora Mr. GMSOFT até que fim kkkk segue o código

    string sql = "INSERT INTO Produtos (nomeProduto, valorProduto) values (@nomeProduto, CCur(val(@valorProduto)));";

    Usei dessa vez o CCur

    terça-feira, 2 de junho de 2015 19:47
  • kkkk e ja tinha usado antes e não funcionou

    GTSA vantagem de ser inteligente é que podemos fingir que somos imbecis enquanto ao contrario é completamente impossivel


    • Editado Mr. GMSOFT terça-feira, 2 de junho de 2015 19:53
    terça-feira, 2 de junho de 2015 19:48
  • Antes eu tinha tentado como INSERT INTO PRODUTOS SET nomeProduto= @nomeProduto.... Essa foi a única diferença, mais que bom que deu certo... Valeu pela a sua ajuda
    terça-feira, 2 de junho de 2015 20:11