How to store information from a SELECT into variables

1

Good evening community, I have a stock program that I'm finishing and I want to do a validation for it always check if you have enough of that product before adding it to the sale. For this I used a simple math operation, where one variable stores the requested value, another the value that exists in the database and then a third variable stores the subtraction of them and tests an if. However I am having difficulty storing the Select result in the variable, is there any command to get the value of a table cell or something like that? below is 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 really is there in the stockqtde, I do not know which command to use to get the only value that has inside the table that is the pro_qtde of the product being requested.

    
asked by anonymous 07.12.2016 / 00:30

2 answers

2

You have to improve your code, if you have the product code, you do not need to use like, and you leave the command much slower, you may not feel it with a small test database, but when you grow up, complicate. Another thing is to concatenate variable as value in the where clause, this can add security fragility, the correct one 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 searches only for a database value, not a collection like the datatable.

    
07.12.2016 / 11:45
1

This link will answer your question.

link

Already ahead of you is the sample code that demonstrates how to do it:

    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(); 
    }
    
07.12.2016 / 13:38