Usuário com melhor resposta
Como gravar valores decimal no Microsoft Access - C# Windows Form

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.
Respostas
-
Desculpa erro meu só reparei agora que era Access, tente dessa forma:
INTO Produtos SET nomeProduto=@nomeProduto, valorProduto=CCur(val(@valorProduto)));";
A vantagem de ser inteligente é que podemos fingir que somos imbecis enquanto ao contrario é completamente impossivel
- Marcado como Resposta J.AndersonSantos terça-feira, 2 de junho de 2015 19:48
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.
-
-
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.
- Editado Levi DomingosModerator terça-feira, 2 de junho de 2015 12:27
-
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?
-
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"
- Editado Claudinei Nascimento terça-feira, 2 de junho de 2015 13:48
-
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?- Editado J.AndersonSantos terça-feira, 2 de junho de 2015 14:24 Digitação
-
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.
A vantagem de ser inteligente é que podemos fingir que somos imbecis enquanto ao contrario é completamente impossivel
-
Dessa forma Mr. GMSOFT?
string currencyDecimalSeparator = Thread.CurrentThread.CurrentCulture.NumberFormat.CurrencyDecimalSeparator; command.Parameters.AddWithValue("@valorProduto",produto.ValorProduto.ToString().Replace(".", currencyDecimalSeparator));
-
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;
A 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
-
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.
-
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))
A vantagem de ser inteligente é que podemos fingir que somos imbecis enquanto ao contrario é completamente impossivel
-
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.
-
Desculpa erro meu só reparei agora que era Access, tente dessa forma:
INTO Produtos SET nomeProduto=@nomeProduto, valorProduto=CCur(val(@valorProduto)));";
A vantagem de ser inteligente é que podemos fingir que somos imbecis enquanto ao contrario é completamente impossivel
- Marcado como Resposta J.AndersonSantos terça-feira, 2 de junho de 2015 19:48
-
-
-
-
-
-
-
-
-
-
-
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.
-
-
kkkk e ja tinha usado antes e não funcionou
A 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
-