Stack Overflow em Português Asked by Raphael Shembek on November 13, 2021
Estou com um problema de formatação de valores do tipo R$ quando envio para o banco de dado 11,50 no banco de dado fica do tipo 1150.
Esse condigo é do botão de enviar para o banco de dado tem uma classe de gestão de banco de dados cl_GestorBD
private void button1_Click(object sender, EventArgs e)
{
cl_GestorBD gestor = new cl_GestorBD(true);
int id_produto = gestor.ID_DISPONIVEL("compras", "id_compra");
List<cl_GestorBD.SQLParametro> parametro = new List<cl_GestorBD.SQLParametro>();
parametro.Add(new cl_GestorBD.SQLParametro("@atualizacao", DateTime.Now));
string PRODUTO;
int QTY;
decimal VALOR_UNID;
decimal VALOR_TOTAL;
try
{
foreach (ListViewItem caixa in listCaixa.Items)
{
PRODUTO = caixa.SubItems[0].Text;
QTY = Convert.ToInt32(caixa.SubItems[1].Text);
VALOR_UNID = Convert.ToDecimal(caixa.SubItems[2].Text);
VALOR_TOTAL = Convert.ToDecimal(caixa.SubItems[3].Text);
query = "INSERT INTO compras VALUES ('" + id_produto + "','" + lblID.Text + "', '" + PRODUTO + "', '" + QTY + "', '" + VALOR_UNID + "', '" + VALOR_TOTAL + "',@atualizacao)";
gestor.EXE_NON_QUERY(query, parametro);
}
MessageBox.Show("Registrado com sucesso!");
}
catch (Exception erro)
{
MessageBox.Show("ERRO " + erro.Message);
}
}
Sem falar nos nomes de variáveis que não seguem o estilo recomendado, o código tem alguns problemas:
Não converta dados que você não tem certeza que estão corretos. O Convert
gerará erro na aplicação quando isso ocorrer. Teste se o dado está correto com TryParse()
.
query = "INSERT INTO compras VALUES ('" + id_produto + "','" + lblID.Text + "', '" + PRODUTO + "', '" + QTY + "', '" + VALOR_UNID + "', '" + VALOR_TOTAL + "',@atualizacao)";
Este código é extremamente inseguro. É mais ou menos assim que se faz.
A forma como está gravando pode violar a atomicidade e consistência do banco de dados, só não garanto porque não sei os requisitos.
Sempre que captura Exception
, exceto quando é muito experiente, está procurando uma solução mágica para os problemas. Escolha que exceção que tratar e faça um tratamento adequado, o que foi feito não é útil.
O tipo correto é Money
mesmo. E precisa indicar o tipo no código, algo assim:
new SqlParameter("@Valor", SqlDbType.Money)
Coloquei no GitHub para referência futura.
Tem algumas coisas que não parecem fazer sentido, mas vai saber... Por exemplo SubItems
me parece esquisito.
Tem outros problemas que não fazem o código ficar errado, mas que não é assim que se costuma fazer.
Pode ter mais algum problema que não está claro no código, inclusive na entrada do texto.
Answered by Maniero on November 13, 2021
Deixe o campo no banco como numeric(18,2) e tente assim:
Obs.: Não estou com C# aqui para testar, talvez você precise mudar alguma coisinha ali na formatação
private void button1_Click(object sender, EventArgs e)
{
cl_GestorBD gestor = new cl_GestorBD(true);
int id_produto = gestor.ID_DISPONIVEL("compras", "id_compra");
List<cl_GestorBD.SQLParametro> parametro = new List<cl_GestorBD.SQLParametro>();
parametro.Add(new cl_GestorBD.SQLParametro("@atualizacao", DateTime.Now));
string PRODUTO;
int QTY;
string VALOR_UNID;
string VALOR_TOTAL;
try
{
foreach (ListViewItem caixa in listCaixa.Items)
{
PRODUTO = caixa.SubItems[0].Text;
QTY = Convert.ToInt32(caixa.SubItems[1].Text);
VALOR_UNID = caixa.SubItems[2].Text.ToString("N2"); /*ou ToString("0.##");*/
VALOR_TOTAL = caixa.SubItems[3].Text.ToString("N2");
query = "INSERT INTO compras VALUES ('" + id_produto + "','" + lblID.Text + "', '" + PRODUTO + "', '" + QTY + "', '" + VALOR_UNID + "', '" + VALOR_TOTAL + "',@atualizacao)";
gestor.EXE_NON_QUERY(query, parametro);
}
MessageBox.Show("Registrado com sucesso!");
}
catch (Exception erro)
{
MessageBox.Show("ERRO " + erro.Message);
}
}
Answered by Matheus Ribeiro on November 13, 2021
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP