TransWikia.com

Problema para enviar valores do tipo 11,50 para banco de dados SQL Server

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

2 Answers

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

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP