C#  - Cadastro Básico com SQL Server Local (SDF) - II


Na primeira parte do artigo criarmos o banco de dados SQL Server Local Vendas.sdf e a tabela Produtos usando o próprio IDE do Visual Studio 2012 Express for windows desktop.

Criamos o projeto Windows Forms e definimos a classe DAL que terá a responsabilidade de acessar e persistir as informações no banco de dados.

Vamos agora implementar as funcionalidades para realizar as operações CRUD a partir da interface do usuário que é o formulário form1.cs.

Antes disso vamos criar a classe Produto que representa um produto e reflete as colunas da tabela Produtos. Essa classe será usada para passar informações da camada de interface com a classe DAL responsável pelo acesso aos dados.

No menu PROJECT clique em Add New Item e selecione o template Class e informe o nome Produto.cs. A seguir coloque o código abaixo nesta classe:

public class Produto
{
        public int Id { get; set; }
        public string nome { get; set; }
        public int estoque { get; set; }
        public decimal custo { get; set; }
        public string descricao { get; set; }
}

Agora podemos iniciar a implementação das funcionalidades para incluir, alterar, excluir e exibir dados no formulário form1.cs.

1- Selecionado e carregando dados da tabela Produtos e exibindo no DataGridView

Ao carregar o formulário form1.cs vamos acessar os dados da tabela Produtos e exibi-los no DataGridView.

Vamos usar o evento Load do formulário e incluir o código abaixo neste evento:

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

Este código chama a rotina exibirDados() cujo código vemos a seguir:

private void exibirDados()
 {
       DAL _dal = new DAL();
       dgvProdutos.DataSource = _dal.Load("Select * from Produtos");
}

No código estamos criando uma instância da classe DAL e chamando o método Load() que retorna um DataTable() que será exibido no DataGridView:

Aqui cabe um ressalva.

Como eu não criei uma camada de negócios estou definindo as instruções SQL tipo texto no formulário o que não é recomendado em uma aplicação de produção. O correto seria eu chamar um método da camada de negócio que teria a responsabilidade de definir a instrução SQL.

2- Clicando em uma linha e exibindo os valores das células do DataGridView nos TextBox do formulário

Para facilitar a seleção dos registros vamos permitir que o usuário ao clicar em uma linha do DataGridView os valores de cada célula sejam exibidos nos controles TextBox do formulário.

Para isso vamos usar o evento CellClick do controle DataGridView definindo o código a seguir:

private void dgvProdutos_CellClick(object sender, DataGridViewCellEventArgs e)
 {
            if (dgvProdutos.Rows[e.RowIndex].Cells[e.ColumnIndex].Value != null)
            {
                txtId.Text = dgvProdutos.Rows[e.RowIndex].Cells[0].Value.ToString();
                txtNome.Text = dgvProdutos.Rows[e.RowIndex].Cells[1].Value.ToString();
                txtEstoque.Text = dgvProdutos.Rows[e.RowIndex].Cells[2].Value.ToString();
                txtCusto.Text = dgvProdutos.Rows[e.RowIndex].Cells[3].Value.ToString();
                txtDescricao.Text = dgvProdutos.Rows[e.RowIndex].Cells[4].Value.ToString();
            }
 }

3- Localizando um registro a partir do código do produto

O usuário poderá localizar um registro da tabela Produtos informando o código na caixa de Texto (txtId) Código. A informação será retornada preenchendo cada um dos TextBox do formulário com seu respectivo valor.

Para isso vamos incluir o código abaixo no evento Click do botão btnLocalizar:

 private void btnLocalizar_Click(object sender, EventArgs e)
 {
            try
            {
                DAL _dal = new DAL();
                int codigo = Convert.ToInt32(txtId.Text);
                string sql = "Select * from Produtos Where Id=" + codigo;
                DataTable dtProdutos = new DataTable();
                dtProdutos = _dal.Load(sql);
                txtId.Text = dtProdutos.Rows[0][0].ToString();
                txtNome.Text = dtProdutos.Rows[0][1].ToString();
                txtEstoque.Text = dtProdutos.Rows[0][2].ToString();
                txtCusto.Text = dtProdutos.Rows[0][3].ToString();
                txtDescricao.Text = dtProdutos.Rows[0][4].ToString();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
 }

No código, após criar um instância da classe DAL, obtemos o valor do código informado na caixa de texto txtId e definimos uma instrução SQL para selecionar todos os registros da tabela Produtos para este código.

A seguir criamos um DataTable e obtemos o resultado retornado pelo método Load(sql). Como o retorno é um DataTable obtemos o valor de cada uma das colunas da primeira linha do DataTable retornado.

Note que usamos a sintaxe : dtProdutos.Rows[número da linha][número da coluna]

Onde o valor zero para Rows é fixo pois teremos apenas um único registro. O valor de cada coluna é indicado pelo índice iniciando na primeira coluna (0) até a última (4). Ex: dtProdutos.Rows[0][4].ToString();

3- Incluindo registros

 private void btnIncluir_Click(object sender, EventArgs e)
 {
            try
            {
                DAL _dal = new DAL();
                Produto prod = new Produto();
                prod.nome = txtNome.Text;
                prod.estoque = Convert.ToInt32(txtEstoque.Text);
                prod.custo = Convert.ToDecimal(txtEstoque.Text);
                prod.descricao = txtDescricao.Text;

                _dal.Insert(prod,"Insert Into Produtos(Nome,Estoque,Custo,Descricao) values(@nome,@estq,@cust,@desc)");
                exibirDados();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
 }

Para incluir registros criamos uma instância da classe Produto e atribuímos os valores informados nos TextBox a cada propriedade do objeto prod :

               Produto prod = new Produto();
                prod.nome = txtNome.Text;
                prod.estoque = Convert.ToInt32(txtEstoque.Text);
                prod.custo = Convert.ToDecimal(txtEstoque.Text);
                prod.descricao = txtDescricao.Text;

A seguir chamamos o método Insert() passando o objeto Produto(prod) e a string SQL para inclusão dos valores:

Insert Into Produtos(Nome,Estoque,Custo,Descricao) values(@nome,@estq,@cust,@desc)

4- Alterando registros

  private void btnAtualizar_Click(object sender, EventArgs e)
  {
            try
            {
                DAL _dal = new DAL();
                Produto prod = new Produto();
                prod.Id = Convert.ToInt32(txtId.Text);
                prod.nome = txtNome.Text;
                prod.estoque = Convert.ToInt32(txtEstoque.Text);
                prod.custo = Convert.ToDecimal(txtCusto.Text);
                prod.descricao = txtDescricao.Text;

                _dal.Update(prod, "Update Produtos set Nome=@nome, Estoque=@estq , Custo=@cust ,Descricao=@desc Where Id=@codigo");
                exibirDados();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
 }

A lógica para atualizar registros é a mesma que a usada para incluir. Criamos uma instância da classe Produto e atribuímos os valores informados nos TextBox a cada propriedade do objeto prod :

               Produto prod = new Produto();
                prod.nome = txtNome.Text;
                prod.estoque = Convert.ToInt32(txtEstoque.Text);
                prod.custo = Convert.ToDecimal(txtEstoque.Text);
                prod.descricao = txtDescricao.Text;

A seguir chamamos o método Update() passando o objeto Produto(prod) e a string SQL para inclusão dos valores:

Update Produtos set Nome=@nome, Estoque=@estq , Custo=@cust ,Descricao=@desc Where Id=@codigo

5- Excluindo registros

 private void btnExcluir_Click(object sender, EventArgs e)
 {
            try
            {
                DAL _dal = new DAL();
                int codigo = Convert.ToInt32(txtId.Text);
                _dal.Delete(codigo,"Delete from Produtos where Id=@codigo");
                exibirDados();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
 }

Na exclusão de registros obtemos o código do Produto na caixa de texto txtId e chamamos o método Delete() passando o código a instrução SQL:

"Delete from Produtos where Id=@codigo

6- Limpar as caixas de Texto

 public static void LimparTextBox(Control parent)
 {
            foreach (Control c in parent.Controls)
            {
                if (c.GetType() == typeof(TextBox))
                {
                    ((TextBox)(c)).Text = string.Empty;
                }
            }
 }

No botão Limpar temos a chamada da rotina LimparTextBox() que percorre os controles TextBox do formulário e limpa os seus valores.

Temos dessa forma a implementação das funcionalidades CRUD usando ADO .NET e um banco de dados SQL Server Compact 4.0.

Você pode melhorar o projeto criando a camada de negócios e removendo as strings SQL e os objetos ADO .NET que usamos na interface.

Pegue o projeto completo aqui: BancodeDadosLocal.zip

    João 8:45 Mas porque eu digo a verdade, não me credes.

    João 8:46 Quem dentre vós me convence de pecado? Se digo a verdade, por que não me credes?

    João 8:47 Quem é de Deus ouve as palavras de Deus; por isso vós não as ouvis, porque não sois de Deus.

 

Referências:


José Carlos Macoratti