How to store information from a SELECT in variables

Asked

Viewed 7,642 times

1

Good evening community,I have a stock program that I am finalizing and I want to do a validation for him to always check if he has enough of that product before adding to the sale. For this I used a simple mathematical operation, where one variable stores the requested value, another the value that exists in the database and then a third variable stores their subtraction and tests an if. However I’m having difficulty storing the Select result in the variable, is there a command to get the value of a table cell or something? follows below the code

Code:

private void btAddProd_Click(object sender, EventArgs e)
{

    DataTable tabela = new DataTable();
    DALConexao cx = new DALConexao(DadosDaConexao.StringDeConexao);
    var cod = Convert.ToString(txtProCod.Text);
    SqlDataAdapter da = new SqlDataAdapter("Select pro_qtde from produto where pro_cod like '%" + cod + "%' ", cx.StringConexao);
    da.Fill(tabela);

    double testeqtde = 0;
    double estoqueqtde = 0;
    double testetotal = 0;

    testeqtde = Convert.ToDouble(txtQtde.Text);
    estoqueqtde = Convert.ToDouble(tabela.Rows[0]);

    testetotal = estoqueqtde - testeqtde;
    if (testetotal < 0)
    {
        MessageBox.Show("Não há quantidade o bastante no estoque! Quantidade:" + estoqueqtde);
    }
    else
    {
        if ((txtProCod.Text != "") && (txtQtde.Text != "") && (txtValor.Text != ""))
        {
            Double TotalLocal = Convert.ToDouble(txtQtde.Text) * Convert.ToDouble(txtValor.Text);//metodo para calcular o total do produto
            this.totalVenda = this.totalVenda + TotalLocal;//metodo para somar o total da compra
            String[] i = new String[] { txtProCod.Text, lProduto.Text, txtQtde.Text, txtValor.Text, TotalLocal.ToString() };//criado vetor de string
            this.dgvItens.Rows.Add(i);//adicionando o string dentro da datagrid

            txtProCod.Clear();//limpar o campo
            lProduto.Text = "Informe o código do produto ou clique em localizar";
            txtQtde.Clear();//limpar o campo
            txtValor.Clear();//limpar o campo

            txtTotalVenda.Text = this.totalVenda.ToString();//atualizar o total da compra

        }
    }
}

The problem is really there in the stock,I don’t know what command to use to get the only value that has inside the table that is the pro_qtde of the product that is being requested.

2 answers

3


You have to improve your code, if you have the product code, there is no need to use like, and it makes the command much slower, you may not feel with a small test base, but when you grow up, it will complicate. Another thing is to concatenate variable as value in the Where clause, this can add security fragility, the correct is to use the query with parameters. Take a look at these tips that will help you.

As for your problem, change the code as follows:

SqlConnection conn = new SqlConnection(cx.StringConexao);
SqlCommand sqlCommand = new SqlCommand("Select pro_qtde from produto where pro_cod like '%" + cod + "%' ", conn);            
estoqueqtde = Convert.ToDouble(sqlCommand.ExecuteScalar());

This command looks only for a database value and not a collection as is the case for datatable.

  • You’re absolutely right,this solves,Thank you very much for helping Batista, I will try to improve the code as well, even being a small test base it is always ideal to acquire good programming habits like this

2

This link will answer your question.

https://code.msdn.microsoft.com/windowsapps/Realizar-select-e-exibir-8d90084c

I already give you the example code that demonstrates how to do:

    public Form1() 
    { 
        InitializeComponent(); 
    } 

    //classe cliente e suas propriedades 
    public class Cliente 
    { 
        public int IdCliente { get; set; } 
        public string Nome { get; set; } 
        public string Email { get; set; } 
        public DateTime DataNascimento { get; set; } 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
        CarregaListBox(); 
    } 

    private void CarregaListBox() 
    { 
        //instância da conexão 
        SqlCeConnection conn = new SqlCeConnection(@"Data Source=|DataDirectory|\Clientes.sdf"); 

        //string com o comando a ser executado 
        string sql = "SELECT Nome from Cliente"; 

        //instância do comando recebendo como parâmetro 
        //a string com o comando e a conexão 
        SqlCeCommand cmd = new SqlCeCommand(sql, conn); 

        //abro conexão 
        conn.Open(); 

        //instância do leitor 
        SqlCeDataReader leitor = cmd.ExecuteReader(); 

        //enquanto leitor lê 
        while (leitor.Read()) 
        { 
            //para cada iteração adiciono o nome 
            //ao listbox 
            listBox1.Items.Add(leitor["Nome"].ToString()); 
        } 

        //fecha conexão 
        conn.Close(); 
    } 


    //método que faz a consulta no bd e obtém o cliente 
    //cujo o nome é informado pelo parâmetro 
    private Cliente ObterClientePorNome(string nome) 
    { 
        //objeto cliente que será retornado pelo método 
        Cliente cliente = new Cliente(); 

        //instância da conexão 
        SqlCeConnection conn = new SqlCeConnection(@"Data Source=|DataDirectory|\Clientes.sdf"); 

        //string com o comando a ser executado 
        string sql = "SELECT * from Cliente WHERE Nome=@Nome"; 

        //instância do comando recebendo como parâmetro 
        //a string com o comando e a conexão 
        SqlCeCommand cmd = new SqlCeCommand(sql, conn); 

        //informo o parâmetro do comando 
        cmd.Parameters.AddWithValue("@Nome", nome); 

        //abro conexão 
        conn.Open(); 

        //instância do leitor 
        SqlCeDataReader leitor = cmd.ExecuteReader(); 

        //enquanto leitor lê 
        while (leitor.Read()) 
        { 
            //passo os valores para o objeto cliente 
            //que será retornado 
            cliente.IdCliente = Convert.ToInt32(leitor["IdCliente"].ToString()); 
            cliente.Nome = leitor["Nome"].ToString(); 
            cliente.Email = leitor["Email"].ToString(); 
            cliente.DataNascimento = Convert.ToDateTime(leitor["DataNascimento"].ToString()); 
        } 

        //fecha conexão 
        conn.Close(); 

        //Retorno o objeto cliente cujo o  
        //nome é igual ao informado no parâmetro 
        return cliente; 
    } 

    //evento mouseclick do listbox 
    private void listBox1_MouseClick(object sender, MouseEventArgs e) 
    { 
        //variável recebe o objeto cliente retornado pelo método 
        Cliente cliente = ObterClientePorNome(listBox1.SelectedItem.ToString()); 

        //passo os valores para os textbox 
        txtCodigo.Text = cliente.IdCliente.ToString(); 
        txtNome.Text = cliente.Nome; 
        txtEmail.Text = cliente.Email; 
        txtDataNascimento.Text = cliente.DataNascimento.ToShortDateString(); 
    }

Browser other questions tagged

You are not signed in. Login or sign up in order to post.