.NET

2 jun, 2011

C# – Acesso SQL Server com CRUD (ADO .NET)

Publicidade

Programar se aprende programando, certo? E nada melhor para aprender do que ter um protótipo funcional com o código fonte a partir do qual podemos estudar.

Este singelo projeto feito na linguagem C# realiza o acesso e as operações de inclusão, edição e exclusão em uma base de dados SQL Server.

Vamos ao que interessa…

O projeto poderá ser aberto nos seguintes IDEs:

Além disso você deverá instalar os seguintes recursos:

O banco de dados SQL Server

A aplicação acessa a tabela Livros de um banco de dados SQL Server definido como Catalogo. Na figura abaixo temos a estrutura da tabela:


O script para criar o banco de dados, as tabelas e as stored procedures no SQL Server é dado a seguir:

USE [Catalogo]
GO
/****** Object:  Table [dbo].[Autores]    Script Date: 03/28/2011 10:52:09 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Autores](
    [autorid] [int] IDENTITY(1,1) NOT NULL,
    [nome] [nchar](10) NULL,
 CONSTRAINT [PK_Autores] PRIMARY KEY CLUSTERED
(
    [autorid] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON,
ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object:  Table [dbo].[Livros]    Script Date: 03/28/2011 10:52:09 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Livros](
    [livroid] [int] IDENTITY(1,1) NOT NULL,
    [autorid] [int] NOT NULL,
    [titulo] [nvarchar](150) NULL,
    [preco] [money] NULL,
 CONSTRAINT [PK_Livros] PRIMARY KEY CLUSTERED
(
    [livroid] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON,
ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object:  StoredProcedure [dbo].[SelAutores]    Script Date: 03/28/2011 10:52:08 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[SelAutores]
AS
SELECT * FROM Autores
RETURN
GO
/****** Object:  StoredProcedure [dbo].[SchLivros]    Script Date: 03/28/2011 10:52:08 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[SchLivros]
AS
SELECT * FROM Livros
RETURN
GO
/****** Object:  StoredProcedure [dbo].[IncluirAutor]    Script Date: 03/28/2011 10:52:08 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:        <Author,,Name>
-- Create date: <Create Date,,>
-- Description:    <Description,,>
-- =============================================
CREATE PROCEDURE [dbo].[IncluirAutor]
 @nome nvarchar(150)
AS
INSERT INTO Autores (nome)
Values(@nome)
GO

Você pode executar o script acima no SQL Server Management Studio para criar o banco de dados e as tabelas.

A interface da aplicação

A seguir temos a interface da aplicação no formulário form1.cs que utiliza os seguintes controles:

  •     DataGridView – dgvLista;
  •     TextBox – txtPesquisar, txtTitulo e txtPreco;
  •     Button – btnAtualizar, btnSalvar, btnCancelar, btnIncluir, btnDeletar e btnFechar;

O código da aplicação (partes principais)

No início do formulário temos a definição dos namespaces usados no projeto:

using System;
using System.Data;
using System.Drawing;
using System.Windows.Forms;
using System.Data.SqlClient;

Note que estamos referenciando o namespace para acessar as classes ADO .NET para o SQL Server.

A seguir logo após a declaração do formulário temos a definição das variáveis ADO .NET para conexão com o banco de dados SQL Server:

SqlConnection sqlCon = new SqlConnection();
SqlDataAdapter daLivros = new SqlDataAdapter();
DataSet dsLivros = new DataSet();

A string de conexão usada no programa é a seguinte:

sqlCon.ConnectionString = @"Data Source=.SQLEXPRESS;Initial Catalog=Catalogo;Integrated Security=True";

Se você pretende usar outro banco de dados basta alterar os nomes dessas variáveis conforme o provedor pertinente.

1 – Código da rotina SalvaMudancas() – Esta rotina verifica qual a ação a ser realizada : inclusão ou edição dos dados. Para incluir informações é usado os métodos NewRow()/Add  e para atualizar os dados BeginEdit()/EndEdit() e ao final o método Update();

   private void SalvaMudancas()
        {
            try
            {
                SqlCommandBuilder cbLivros = new SqlCommandBuilder(daLivros);

                DataTable dtLivros = dsLivros.Tables["tblLivros"];
                DataRow drLivros;

                if (isIncluirFlag)
                {
                    drLivros = dtLivros.NewRow();

                    drLivros["titulo"] = txtTitulo.Text;
                    drLivros["preco"] = Convert.ToDecimal(txtPreco.Text);
                    dtLivros.Rows.Add(drLivros);
                   
                }
                else if (isEditarFlag)
                {
                    drLivros = dtLivros.Rows.Find(dgvLista.SelectedRows[0].Cells[0].Value);

                    drLivros.BeginEdit();
                    drLivros["titulo"] = txtTitulo.Text;
                    drLivros["preco"] = Convert.ToDecimal(txtPreco.Text);
                    drLivros.EndEdit();
                }

                // envia mensagem ao SQL Server para persistir dados
                daLivros.Update(dsLivros, "tblLivros");
                formataGridView();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message.ToString());
            }

            AtualizaDataSet();

            SetButtons(true);
            SetEnabled(false);
        }

2 – Código do botão Deletar –  O código utiliza o método Find e a seguir o método Delete; ao final para persistir as alterações usa o método Update();

     private void btnDeletar_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("Tem certeza?", "Deletar", MessageBoxButtons.YesNo) == DialogResult.Yes)
            {
                try
                {
                    DataTable dtLivros = dsLivros.Tables["tblLivros"];
                    DataRow drLivros;

                    if (dgvLista.SelectedRows.Count > 0)
                    {
                        // deleta a linha selecionada
                        drLivros = dtLivros.Rows.Find(dgvLista.SelectedRows[0].Cells[0].Value);
                        drLivros.Delete();

                        SqlCommandBuilder cbLivros = new SqlCommandBuilder(daLivros);

                        // envia mudanças ao SQL Server
                        daLivros.Update(dsLivros, "tblLivros");
                        AtualizaDataSet();
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message.ToString());
                }
            }
        }

3 – Código do evento Click do DataGridView

private void dgvLista_CellClick(object sender, DataGridViewCellEventArgs e)
{
 // é um cabeçalho ?
 if (e.RowIndex > -1)
 {
  // não
  txtTitulo.Text = dgvLista.Rows[e.RowIndex].Cells[2].Value.ToString();
  txtPreco.Text = dgvLista.Rows[e.RowIndex].Cells[3].Value.ToString();
 }
}

No evento Click do controle DataGridView estamos obtendo os valores para o titulo e preco do livro e exibindo nos controles de formulário.

Executando o projeto iremos obter:


Enfim uma aplicação simples mas que mostra como você pode realizar a manutenção dos dados acessando um banco de dados SQL Server.

Pegue o projeto completo aqui: AcessoSQLServer_CSharp.zip

Eu sei é apenas C# , mas eu gosto…