ASP .NET
- Agenda de Contatos com Microsoft Access (C#)
Algumas vezes não precisamos usar um canhão para matar uma mosca basta um simples inseticida.
No desenvolvimento de software isso também se aplica afinal é sempre que precisamos usar todo o arsenal que a plataforma .NET nos oferece para realizar uma tarefa bem simples.
Manter as coisas simples é ter bom senso afinal para que complicar.
Neste artigo eu mostro um exemplo de uma aplicação bem simples: uma aplicação ASP .NET que funciona como uma agenda de contatos para uso pessoal.
Ela é bem simples e permite armazenar informações de contatos e realizar a manutenção dessa informações através das operações CRUD: inclui, alterar e excluir.
Neste cenário vamos usar os recursos básicos da plataforma .NET oferecidos na ferramenta Visual Web Developer 2010 Express Edition usando a linguagem C# (eu já publiquei artigos sobre a criação de agenda usando a linguagem VB .NET e VBA)
O banco de dados usado será o Microsoft Access pois a aplicação é de uso pessoal e possuirá um número pequeno de registros.
Criando o banco de dados da aplicação
Podemos criar o banco de dados usando o Microsoft Access. Para isso abra o MS Access e clique no botão Novo e escolha criar um banco de dados vazio informando o nome ContatosDB.mdb;
A seguir vamos criar a tabela Agenda com a seguinte estrutura:
![]() |
Temos assim um banco de dados com uma tabela bem simples para uso na aplicação ASP .NET.
Criando uma agenda de contatos bem simples
Abra o Visual Web Developer 2010 Express Edition e no menu File clique em New Web Site e selecione o template ASP .NET Empty Web Site informando o nome AgendaMDB e clicando no botão OK;
![]() |
Como nosso projeto esta vazio vamos incluir um novo Web Form através do menu WebSite -> Add New Item selecionando o template Web Form e aceitando o nome padrão para o arquivo : Default.aspx;
A seguir vamos incluir uma pasta no projeto através do menu Web Site -> Add ASP .NET Folder -> App_Data;
A pasta App_Data é essencialmente um ponto de armazenamento para armazenamentos de dados baseado em arquivo, como o Microsoft Access. Podemos também incluir arquivos do SQL Server nesta pasta. Estes arquivos terão a anexação automática:
|
Anexação automática de banco de dados (Auto-Attached DataBases) Um problema com o ambiente de desenvolvimento que usa banco de dados é a necessidade de ter o SQL Server instalado, onde você precisa anexar o banco de dados , criar um login para o SQL Server e incluir o login no banco de dados. E isto precisa ser feito geralmente em cada máquina de desenvolvimento.(Ou você vai querer que todo mundo esteja logado como Administrador do sistema ?) O SSE Edition suporta a anexação automática de banco de dados pela inclusão da seguinte string de conexão: AttacheDbFilename=db.mdf Com esta string de conexão , o SSE irá automaticamente anexar ao banco de dados quando a aplicação iniciar. Você pode evitar ter que colocar o caminho completo para o banco de dados no seu código usando o novo diretório App_Data e uma característica especial para apontar para ele. Como exemplo se você estiver usando a seguinte string de conexão: Data Source=.\SQLEXPRESS; AttachDbFilename=|DataDirectory|db.mdf A string |DataDirectory| será substituída pelo caminho para o diretório App_Data, evitando assim que você tenha que incluir o caminho completo no seu código. |
Nesta pasta será colocado o banco de dados ContatosDB.mdb.
Para fazer isto clique com o botão direito do mouse sobre a pasta e selecione a opção Add Existing Item, selecionando a seguir o banco de dados ContatosDB.mdb. Quando o arquivo é incluído na pasta App_Data ele é também automaticamente incluído no DataBase Explorer.
Nota : Uma dica legal sobre a pasta App_Data que encontrei em : http://www.bufaloinfo.com.br/dicas.aspx?cod=874
|
Um problema recorrente em muitos fóruns é um problema com o
diretório
App_Data
utilizado em aplicações windows. A pasta App_Data tem uso típico em aplicações web, mas seu uso não é muito recomendável em aplicações windows. Uma aplicação windows, quando é executada pelo Visual Studio, é compilada e seu executável copiado para a pasta bin (podendo variar em uma sub pasta debug ou release). Ocorre que o banco de dados utilizado na pasta App_Data também é copiado para dentro da pasta bin. Consequencia : Todos os dados que você alterar, incluir,deletar enquanto está usando a aplicação serão perdidos na execução seguinte, pois todas as alterações são feitas no banco que está abaixo do Bin, enquanto que na execução seguinte o banco do App_Data será novamente copiado para a pasta abaixo do Bin, apagando os dados. Isso se tornou uma pergunta muito comum em fóruns, "minha aplicação não está gravando nada !". Todo esse equívoco tem uma causa e uma solução : As versões express que desenvolvem para windows (VB.NET Express, C# Express, etc.) não fazem acesso direto a um servidor SQL. As versões Express apenas permitem o acesso (usando os wizards, por código tudo pode) a arquivos de dados do SQL Server (arquivos .MDF) sem vínculo (não attachados) com um servidor. Para contornar este problema, após criar o arquivo de banco de dados na pasta App_Data, copie-o para outro local, fora da pasta do projeto. Faça um vínculo direto ao caminho onde o arquivo estiver. Fazendo isso o VB irá perguntar se você deseja copiar o arquivo para dentro da sua aplicação (e ainda avisa, em letras miúdas, que isso tem consequencias), basta dizer não para não mais sofrer com este problema com o arquivo de dados. |
Dessa forma já temos tudo o que precisamos para criar nossa aplicação ASP .NET : Uma página e um banco de dados.
Definindo o leiaute da página Default.aspx
Vamos definir o leiaute da página Default.aspx conforme a figura abaixo usando os controles:
Textbox, Button, GridView e AccessDataSource
![]() |
Devemos configurar o controle AccessDataSource clicando sobre o controle e selecionando a opção Configure Data Source;
![]() |
No assistente vamos selecionar o banco de dados ContatosDB.mdb e clicando em Next>;
![]() |
A seguir vamos selecionar a tabela Agenda e marcar todos os campos;
![]() |
Clique no botão Advanced e marque a opção : Generate INSERT, UPDATE e DELETE statements;
![]() |
Ao final o código da página será o seguinte:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="AcessoDB.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>Inserindo dados em um banco de dados Access</title>
<style type="text/css">
.style1
{
font-family: "Trebuchet MS";
}
</style>
</head>
<body>
<form id="form1" runat="server">
<div>
<script type="text/javascript">
function toggle(o) {
var e = document.getElementById(o);
e.style.display = e.style.display == 'block' ? 'none' : 'block';
}
onload = function () {
var e, i = 0;
while (e = document.getElementById(['list1'][i++])) {
e.style.display = 'none';
}
}
</script>
<div class="tabledata1">
<span class="style1">
<a href="#" onclick="toggle('list1');"><strong>Inserir Novo Registro</strong></a></span>
</div>
<div id="list1" style="font-family:Verdana; font-size:11px; background-color:#cccccc; padding:10px;">
<table>
<tr>
<td>
<hr />
<table>
<tr>
<td>Nome</td>
<td>Celular</td>
<td>Residencia</td>
<td>Companhia</td>
<td>Email</td>
<td>Empresa</td>
<td>Fax</td>
<td>Nascimento</td>
</tr>
<tr>
<td><asp:TextBox ID="nome" runat="server" Width="105px"></asp:TextBox></td>
<td><asp:TextBox ID="celular" runat="server" Width="105px"></asp:TextBox></td>
<td><asp:TextBox ID="residencia" runat="server" Width="105px"></asp:TextBox></td>
<td><asp:TextBox ID="companhia" runat="server" Width="105px"></asp:TextBox></td>
<td><asp:TextBox ID="email" runat="server" Width="105px"></asp:TextBox></td>
<td><asp:TextBox ID="empresa" runat="server" Width="105px"></asp:TextBox></td>
<td><asp:TextBox ID="fax" runat="server" Width="105px"></asp:TextBox></td>
<td><asp:TextBox ID="nascimento" runat="server" Width="105px"></asp:TextBox></td>
</tr>
</table>
<div style="text-align: right">
<asp:Button ID="btnSubmit" runat="server" Text="Inserir" onclick="btnSubmit_Click" />
</div>
<hr />
</td>
</tr>
</table>
</div>
</div>
<br />
<div style="font-family:Verdana; font-size:11px; background-color:#c0c0c0; padding:10px;">
Procurar por
<asp:DropDownList ID="DropDownList1" runat="server">
<asp:ListItem>Nome</asp:ListItem>
<asp:ListItem>Celular</asp:ListItem>
<asp:ListItem>Residencia</asp:ListItem>
<asp:ListItem>Companhia</asp:ListItem>
<asp:ListItem>Email</asp:ListItem>
<asp:ListItem>Empresa</asp:ListItem>
<asp:ListItem>Fax</asp:ListItem>
<asp:ListItem>Nascimento</asp:ListItem>
</asp:DropDownList>
where like
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:Button ID="Button1" runat="server" Text="Filtrar"
onclick="Button1_Click" />
<asp:Button ID="Button2" runat="server" Text="Limpar Filtro"
OnClick="Button2_Click" />
<br />
<br />
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
BackColor="White" BorderColor="White" BorderStyle="Ridge" BorderWidth="2px"
CellPadding="3" CellSpacing="1" DataKeyNames="ID"
DataSourceID="AccessDataSource1"
EmptyDataText="There are no data records to display." GridLines="None"
Width="871px" AllowSorting="True">
<Columns>
<asp:CommandField ShowDeleteButton="True" ShowEditButton="True"
ShowSelectButton="True" CancelText="Cancela" DeleteText="Deleta"
EditText="Edita" InsertText="Inserir" NewText="Novo" SelectText="Seleciona"
UpdateText="Atualiza" />
<asp:BoundField DataField="Nome" HeaderText="Nome"
SortExpression="Nome" />
<asp:BoundField DataField="Celular" HeaderText="Celular"
SortExpression="Celular" />
<asp:BoundField DataField="Residencia" HeaderText="Residencia" SortExpression="Residencia" />
<asp:BoundField DataField="Companhia" HeaderText="Companhia"
SortExpression="Companhia" />
<asp:BoundField DataField="Email" HeaderText="Email" SortExpression="Email" />
<asp:BoundField DataField="Empresa" HeaderText="Empresa"
SortExpression="Empresa" />
<asp:BoundField DataField="Fax" HeaderText="Fax" SortExpression="Fax" />
<asp:BoundField DataField="Nascimento" HeaderText="Nascimento"
SortExpression="Nascimento" />
</Columns>
<FooterStyle BackColor="#C6C3C6" ForeColor="Black" />
<HeaderStyle BackColor="#4A3C8C" Font-Bold="True" ForeColor="#E7E7FF" />
<PagerStyle BackColor="#C6C3C6" ForeColor="Black" HorizontalAlign="Right" />
<RowStyle BackColor="#DEDFDE" ForeColor="Black" />
<SelectedRowStyle BackColor="#9471DE" Font-Bold="True" ForeColor="White" />
<SortedAscendingCellStyle BackColor="#F1F1F1" />
<SortedAscendingHeaderStyle BackColor="#594B9C" />
<SortedDescendingCellStyle BackColor="#CAC9C9" />
<SortedDescendingHeaderStyle BackColor="#33276A" />
</asp:GridView>
<asp:AccessDataSource ID="AccessDataSource1" runat="server"
DataFile="App_Data\ContatosDB.mdb"
DeleteCommand="DELETE FROM `Agenda` WHERE `ID` = ?"
InsertCommand="INSERT INTO `Agenda` (`ID`, `Nome`, `Celular`, `Residencia`, `Companhia`, `Email`, `Empresa`, `Fax`, `Nascimento`)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)"
SelectCommand="SELECT `ID`, `Nome`, `Celular`, `Residencia`, `Companhia`, `Email`, `Empresa`, `Fax`, `Nascimento` FROM `Agenda`"
UpdateCommand="UPDATE `Agenda` SET `Nome` = ?, `Celular` = ?, `Residencia` = ?, `Companhia` = ?, `Email` = ?, `Empresa` = ?, `Fax` = ?,
`Nascimento` = ? WHERE `ID` = ?">
<DeleteParameters>
<asp:Parameter Name="ID" Type="Int32" />
</DeleteParameters>
<InsertParameters>
<asp:Parameter Name="ID" Type="Int32" />
<asp:Parameter Name="Nome" Type="String" />
<asp:Parameter Name="Celular" Type="String" />
<asp:Parameter Name="Residencia" Type="String" />
<asp:Parameter Name="Companhia" Type="String" />
<asp:Parameter Name="Email" Type="String" />
<asp:Parameter Name="Empresa" Type="String" />
<asp:Parameter Name="Fax" Type="String" />
<asp:Parameter Name="Nascimento" Type="String" />
</InsertParameters>
<UpdateParameters>
<asp:Parameter Name="Nome" Type="String" />
<asp:Parameter Name="Celular" Type="String" />
<asp:Parameter Name="Residencia" Type="String" />
<asp:Parameter Name="Companhia" Type="String" />
<asp:Parameter Name="Email" Type="String" />
<asp:Parameter Name="Empresa" Type="String" />
<asp:Parameter Name="Fax" Type="String" />
<asp:Parameter Name="Nascimento" Type="String" />
<asp:Parameter Name="ID" Type="Int32" />
</UpdateParameters>
</asp:AccessDataSource>
</div>
</form>
</body>
</html>
|
Estou usando código JavaScript para esconder e exibir a div do link - Inserir Novo Registro.
<script type="text/javascript">
function toggle(o) {
var e = document.getElementById(o);
e.style.display = e.style.display == 'block' ? 'none' : 'block';
}
onload = function () {
var e, i = 0;
while (e = document.getElementById(['list1'][i++])) {
e.style.display = 'none';
}
}
</script>
Finalmente o código do arquivo code-behind Default.aspx.cs é mostrado abaixo:
using System; using System.Web.UI.WebControls; using System.Data.OleDb; public partial class _Default : System.Web.UI.Page
{
protected void Button1_Click(object sender, EventArgs e)
{
string FilterExpression = string.Concat(DropDownList1.SelectedValue, " LIKE '%{0}%'");
AccessDataSource1.FilterParameters.Clear();
AccessDataSource1.FilterParameters.Add(new ControlParameter(DropDownList1.SelectedValue, "TextBox1", "Text"));
AccessDataSource1.FilterExpression = FilterExpression;
}
protected void Button2_Click(object sender, EventArgs e)
{
AccessDataSource1.SelectParameters.Clear();
}
protected void btnSubmit_Click(object sender, EventArgs e)
{
Executar(Convert.ToString(nome.Text), Convert.ToString(celular.Text), Convert.ToString(residencia.Text), Convert.ToString(companhia.Text),
Convert.ToString(email.Text), Convert.ToString(empresa.Text), Convert.ToString(fax.Text), Convert.ToString(nascimento.Text));
Response.Redirect("~/AcessoDB.aspx");
}
private void Executar(string nome, string celular, string residencia, string companhia , string email, string empresa, string fax, string nascimento)
{
try
{
string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPath("App_Data\\ContatosDB.mdb") + ";";
OleDbConnection conn = new OleDbConnection(connectionString);
conn.Open();
OleDbCommand cmd = new OleDbCommand();
cmd.Connection = conn;
cmd.CommandText = "INSERT INTO Agenda (Nome, Celular, Residencia, Companhia, Email, Empresa, Fax, Nascimento) VALUES (@nome, @celular,
@residencia, @companhia, @email, @empresa, @fax, @nascimento)";
cmd.Parameters.Add("@nome", OleDbType.VarChar).Value = nome;
cmd.Parameters.Add("@celular", OleDbType.VarChar).Value = celular;
cmd.Parameters.Add("@residencia", OleDbType.VarChar).Value = residencia;
cmd.Parameters.Add("@companhia", OleDbType.VarChar).Value = companhia;
cmd.Parameters.Add("@email", OleDbType.VarChar).Value = email;
cmd.Parameters.Add("@empresa", OleDbType.VarChar).Value = empresa;
cmd.Parameters.Add("@fax", OleDbType.VarChar).Value = fax;
cmd.Parameters.Add("@nascimento", OleDbType.VarChar).Value = nascimento;
cmd.ExecuteNonQuery();
conn.Close();
}
catch (System.Data.SqlClient.SqlException ex_msg)
{
string msg = "Ocorreu um erro durante a inclusão dos dados.";
msg += ex_msg.Message;
throw new Exception(msg);
}
}
}
|
No código a expressão de filtro é montada com base na seleção do controle Dropdownlist usando a cláusula LIKE:
string FilterExpression = string.Concat(DropDownList1.SelectedValue, " LIKE '%{0}%'");
A função Executar utiliza a instrução SQL INSERT INTO para incluir as informações na tabela Agenda usando os parâmetros obtidos no formulário:
private void
Executar(string nome, string celular, string residencia, string companhia ,
string email, string empresa, string fax, string nascimento)
{
try
{
string
connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPath("App_Data\\ContatosDB.mdb")
+ ";";
OleDbConnection conn = new OleDbConnection(connectionString);
conn.Open();
OleDbCommand
cmd = new OleDbCommand();
cmd.Connection = conn;
cmd.CommandText
= "INSERT
INTO Agenda (Nome, Celular, Residencia, Companhia, Email, Empresa, Fax,
Nascimento) VALUES (@nome, @celular,
@residencia, @companhia, @email, @empresa, @fax, @nascimento)";
cmd.Parameters.Add("@nome",
OleDbType.VarChar).Value = nome;
cmd.Parameters.Add("@celular",
OleDbType.VarChar).Value = celular;
cmd.Parameters.Add("@residencia",
OleDbType.VarChar).Value = residencia;
cmd.Parameters.Add("@companhia",
OleDbType.VarChar).Value = companhia;
cmd.Parameters.Add("@email",
OleDbType.VarChar).Value = email;
cmd.Parameters.Add("@empresa",
OleDbType.VarChar).Value = empresa;
cmd.Parameters.Add("@fax",
OleDbType.VarChar).Value = fax;
cmd.Parameters.Add("@nascimento",
OleDbType.VarChar).Value = nascimento;
cmd.ExecuteNonQuery();
conn.Close();
}
catch (System.Data.SqlClient.SqlException
ex_msg)
{
string msg =
"Ocorreu um erro durante a inclusão dos dados.";
msg += ex_msg.Message;
throw new
Exception(msg);
}
}
Executando a aplicação teremos:
1- Execução de filtro pela letra M
![]() |
2 - Preparação para inclusão de registros e ordenação pela coluna Nome:
![]() |
E assim para um cenário simples criamos uma solução simples da maneira mais simples possível segundo princípio : KISS - kept it simple stupid.
O projeto completo esta no Super DVD .NET e Super CD .NET.
"E por isso também gememos, desejando ser revestidos da nossa habitação, que é do céu; Se, todavia, estando vestidos, não formos achados nus." II Coríntios 5:2-3
Referências: