C# - CRUD com ADO .NET e Stored Procedures usando uma DAL
Este artigo é essencialmente prático e mostra como realizar as operações CRUD (Create, Upate, Delete) em um banco de dados SQL Server usando ADO .NET e Stored Procedures em uma aplicação ASP .NET usando uma camada de acesso a dados ou Data Access Layer (DAL). |
Ferramentas usadas:
Eu criei o banco de dados Escola.mdf e a tabela Contatos
no SQL Server 2005.A estrutura da tabela é mostrada ao lado:
1- codigo
2- nome
3- email
4- idadeonde codigo é chave primária do tipo Identity.
Criando o projeto
Inicie o VWD e crie um novo web site (File -> New WebSite), selecionando a linguagem Visual C# e o modelo ASP.NET Empty Web Site informando o nome CRUD_DAL_ADONET;
Criando as Stored Procedures
No SQL Server vamos expandir o nó Stored Procedures e criar 4 stored procedures:
Conforme o código abaixo:
1- AtualizarDados
2- CarregarDados
CREATE PROCEDURE dbo.CarregarDados AS select * from contatos RETURN |
3- DeletarDados
CREATE PROCEDURE dbo.DeletarDados ( @codigo int ) AS DELETE FROM dbo.Contatos WHERE codigo = @codigo RETURN |
4- InserirDados
CREATE PROCEDURE dbo.InserirDados ( @nome nvarchar(50), @email nvarchar(100), @idade int ) AS Insert into Contatos(nome,email,idade) values (@nome,@email,@idade) RETURN |
5- getContato
CREATE PROCEDURE dbo.getContato ( @codigo int ) AS select * from Contatos Where codigo = @codigo RETURN |
Definindo o código do projeto
Vamos agora definir o código do projeto começando pela definição da string de conexão no arquivo web.Config conforme mostrada a seguir:
<?xml version="1.0"?> <!-- For more information on how to configure your ASP.NET application, please visit http://go.microsoft.com/fwlink/?LinkId=169433 --> <configuration> <system.web> <compilation debug="false" targetFramework="4.0" /> </system.web> <connectionStrings> <add name="Macoratti" connectionString="Data Source=.\SQLEXPRESS;Catalog=Escola;Integrated Security=True;User Instance=True" providerName="System.Data.SqlClient"/> </connectionStrings> </configuration> |
Vamos agora incluir uma classe ao projeto via menu Project -> Add New Item, selecionando o modelo Class com o nome AcessoDAL.cs:
Confirme a inclusão deste arquivo na pasta App_Code e inclua o código abaixo na classe AcessoDB que esta no arquivo AcessoDAL.cs:
using System; using System.Configuration; using System.Web.Configuration; public class AcessoDB { static public String ConnectionString { get { // pega a string de conexão do web.config return WebConfigurationManager.ConnectionStrings["Macoratti"].ConnectionString; } } } |
Note que o método ConnectionString da classe AcessoDB é estático (static) o que indica que não precisaremos instanciar a classe AcessoDB para usar o método.
Vamos agora incluir outra classe chamada Contato no projeto para representar um Contato com o código abaixo:
/// <summary> /// Summary description for Contato /// </summary> public class Contato { public int Codigo { get; set; } public string Nome { get; set; } public string Email { get; set; } public int Idade { get; set; } } |
Vamos incluir outra classe no projeto chamada contatoDAL que irá conter os métodos de acesso aos dados:
Na classe contatoDAL temos os seguintes métodos:
O código é visto abaixo:
using System; using System.Data.SqlClient; using System.Data; public class BooksDAL { public static DataSet GetContatos() { SqlConnection con = new SqlConnection(Database.ConnectionString); SqlDataAdapter da = new SqlDataAdapter("CarregarDados", con); da.SelectCommand.CommandType = CommandType.StoredProcedure; DataSet ds = new DataSet(); da.Fill(ds, "contatos"); return ds; } public static Contato GetContato(int codigo) { SqlConnection con = new SqlConnection(Database.ConnectionString); try { con.Open(); SqlCommand cmd = new SqlCommand("getContato", con); cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.AddWithValue("@codigo", codigo); SqlDataReader dr = cmd.ExecuteReader(); if (dr.Read()) { Contato ct = new Contato(); ct.Nome = dr["nome"].ToString(); ct.Email = dr["email"].ToString(); ct.Idade = Int32.Parse(dr["idade"].ToString()); return ct; } else return null; } catch (Exception ex) { throw ex; } finally { con.Close(); } } public void incluirContato(Contato contato) { SqlConnection con = new SqlConnection(Database.ConnectionString); try { con.Open(); SqlCommand cmd = new SqlCommand("InserirDados", con); cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.AddWithValue("@nome", contato.Nome); cmd.Parameters.AddWithValue("@email", contato.Email); cmd.Parameters.AddWithValue("@idade", contato.Idade); cmd.ExecuteNonQuery(); } catch (Exception ex) { throw ex; // retorna mensagem de erro } finally { con.Close(); } } public static string deletarContato(int codigo) { SqlConnection con = new SqlConnection(Database.ConnectionString); try { con.Open(); SqlCommand cmd = new SqlCommand("DeletarDados", con); cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.AddWithValue("@codigo", codigo); cmd.ExecuteNonQuery(); return null; // success } catch (Exception ex) { throw ex; // retorna mensagem de erro } finally { con.Close(); } } public static string atualizarContato(Contato contato) { SqlConnection con = new SqlConnection(Database.ConnectionString); try { con.Open(); SqlCommand cmd = new SqlCommand("AtualizarDados", con); cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.AddWithValue("@codigo", contato.Codigo); cmd.Parameters.AddWithValue("@nome", contato.Nome); cmd.Parameters.AddWithValue("@email", contato.Email); cmd.Parameters.AddWithValue("@idade", contato.Idade); cmd.ExecuteNonQuery(); return null; // success } catch (Exception ex) { throw ex; // retorna mensagem de erro } finally { con.Close(); } } } |
Criando a Interface
Vamos incluir no projeto uma Web Form via menu WebSiste-> Add New Item -> Web Form com o nome Default.aspx;
A seguir vamos incluir uma tabela com 8 colunas e 1 linha e incluir 5 controles LinkButton conforme o leiaute da figura abaixo:
Após isso inclua 4 novas páginas web (Web Form) com os seguintes nomes:
Agora vamos atribuir a cada propriedade PostbackUrl de cada um dos controles LinkButtons, o caminho e nome dada respectiva página:
O código completo da página Default.aspx é o seguinte:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> <style type="text/css"> .style1 { width: 90%; } .style2 { font-family: "Trebuchet MS"; color: #3333FF; } .style3 { height: 27px; text-align: center; } .style4 { height: 19px; } </style> </head> <body> <form id="form1" runat="server"> <div> <table class="style1"> <tr> <td class="style2"> <strong>Macoratti.net - CRUD com ADO .NET usando a camada DAL</strong></td> </tr> <tr> <td bgcolor="#33CCFF"> </td> </tr> <tr> <td style="text-align: center"> <asp:LinkButton ID="LinkButton1" runat="server" PostBackUrl="~/Incluir.aspx" style="font-family: 'Trebuchet MS'">1 - Incluir novo Contato </asp:LinkButton> </td> </tr> <tr> <td style="text-align: center"> <asp:LinkButton ID="LinkButton2" runat="server" PostBackUrl="~/Atualizar.aspx" style="font-family: 'Trebuchet MS'">2- Atualizar Contato</asp:LinkButton> </td> </tr> <tr> <td class="style3"> <asp:LinkButton ID="LinkButton3" runat="server" PostBackUrl="~/Deletar.aspx" style="font-family: 'Trebuchet MS'">3- Deletar Contato</asp:LinkButton> </td> </tr> <tr> <td style="text-align: center"> <asp:LinkButton ID="LinkButton4" runat="server" PostBackUrl="~/Listar.aspx" style="font-family: 'Trebuchet MS'">4- Listar Contatos</asp:LinkButton> </td> </tr> <tr> <td bgcolor="#33CCFF" class="style4"> </td> </tr> <tr> <td> </td> </tr> </table> </div> </form> </body> </html> |
Vamos agora definir o leiaute de cada uma das páginas usadas no projeto:
1- página Incluir.aspx :
leiaute :
código do arquivo code-behind Incluir.aspx.cs :
using System; public partial class Incluir : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } protected void btnIncluir_Click(object sender, EventArgs e) { ContatoDAL ctDal = new ContatoDAL(); Contato _contato = new Contato(); _contato.Nome = txtNome.Text; _contato.Email = txtEmail.Text; _contato.Idade = Int32.Parse( txtIdade.Text); try { ctDal.incluirContato(_contato); lblMsg.Text = "Contato incluído com sucesso!"; } catch (Exception ex) { lblMsg.Text = "Error -> " + ex.Message; } } } |
2- página Deletar.aspx
Código do arquivo code-behind Deletar.aspx.cs:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; public partial class Deletar : System.Web.UI.Page { protected void btnDeletar_Click(object sender, EventArgs e) { try { ContatoDAL.deletarContato(Int32.Parse(txtCodigo.Text)); lblmsg.Text = "Contato excluído com sucesso!"; } catch (Exception ex) { lblmsg.Text = "Error -> " + ex.Message; } } } |
3- página Atualizar.aspx
Código do arquivo code-behind Atualizar.aspx.cs
using System; public partial class Atualizar : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } protected void btnGetDetalhes_Click(object sender, EventArgs e) { if (txtCodigo.Text == string.Empty) { lblmsg.Text = "Código inválido"; return; } Contato c = ContatoDAL.GetContato(Int32.Parse(txtCodigo.Text)); if (c != null) { txtNome.Text = c.Nome; txtEmail.Text = c.Email; txtIdade.Text = c.Idade.ToString(); btnAtualiza.Enabled = true; } else { lblmsg.Text = "Contato não encontrado"; btnAtualiza.Enabled = false; } } protected void btnAtualizar_Click(object sender, EventArgs e) { Contato _contato = new Contato(); _contato.Nome = txtNome.Text; _contato.Email = txtEmail.Text; _contato.Idade = Int32.Parse(txtIdade.Text); try { ContatoDAL.atualizarContato(_contato); lblmsg.Text = "Contato excluído com sucesso!"; } catch (Exception ex) { lblmsg.Text = "Error -> " + ex.Message; } } |
3- página da página Listar.aspx
Código do arquivo code-behind Listar.aspx.cs
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; public partial class Listar : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { GridView1.DataSource = ContatoDAL.GetContatos(); GridView1.DataBind(); } } |
Agora é só alegria...
Vamos executar a aplicação ASP .NET e ver se tudo esta funcionando corretamente:
1- Página principal Default.aspx
2- Página para exibir a lista de contatos Listar.aspx
4- Página para incluir um novo contato Incluir.aspx
5- Página para atualizar um contato Atualizar.aspx
a- Obtendo detalhes do último registro que incluímos que deverá possuir o código 9:
b- Atualizando a idade e o email do contato:
6- Página para excluir um contato Excluir.aspx
E assim terminamos essa pequena revisão sobre como usar stored procedures e uma camada de acesso a dados em uma aplicação ASP .NET usando Web Forms.
Pegue o projeto completo com os exemplos aqui : CRUD_DAL_ADONET.zip
1Pedro 1:24
Porque: Toda a carne é como a erva, e toda a sua glória como a flor da erva. Secou-se a erva, e caiu a sua flor;Referências: