Neste artigo irei abordar um dos tópicos mais usados no desenvolvimento de softwares, que é o acesso a dados. Vou ilustrar o conceito de banco, entidades, relacionamento entre entidades e o famoso CRUD (Create, Read, Update e Delete), que para nós brasileiros é o criar, ler, atualizar e excluir dados.
Quando falamos em banco de dados pensamos num conjunto de informações armazenadas em algum repositório, de forma que se possam manipular tais informações. O mais conhecido da Microsoft é o SQL Server, e no artigo faremos acesso a ele.
Outro ponto importante de comentar é que o acesso a dados será feito usando o ADO.NET e suas classes, ou seja, será direto nas entidades, não irei usar nenhuma tecnologia de modelagem de objeto relacional, como por exemplo, o fantástico Entity Framework 4.
O que é um banco de dados?
Costumo definir que banco de dados é um repositório de informações organizadas. No SQL Server organizamos estas informações de forma relacional, permitindo fazer consultas envolvendo diversas entidades.
O que é uma entidade?
Entidade é o local onde as informações relacionadas a um conjunto são armazenadas. Por exemplo, se pensarmos em uma entidade de pessoas, teremos todas as informações sobre a pessoa como nome, e-mail, telefone, endereço, etc.
No entanto é comum ter diversas entidades no banco. Algumas aplicações grandes de ERP chegam a ter cerca de 600 entidades.
E como que uma entidade se relaciona a outra? Em primeiro lugar, sim, é possível relacionar diversas entidades entre si. Segundo, o tipo de relacionamento define a maneira que serão armazenados os dados. Temos os seguintes tipos:
* Um para Muitos – um registro na entidade A contém diversos registros na entidade B. Por exemplo, um cliente de vários pedidos, um clube tem diversos jogadores.
* Um para Um – um registro na entidade A contém apenas um registro na entidade B. Por exemplo, um cliente na entidade A contém as informações sobre aspectos comerciais na entidade B e também informações sobre informações de créditos na entidade C.
* Muitos para Muitos – o mesmo registro pode estar relacionado várias vezes nas entidades A e B. Por exemplo, uma mulher pode ter diversos homens, e um homem pode ter diversas mulheres.
Tipos de Campos
Todo banco de dados dispõe os tipos de campos para informações específicas. Isto tudo para facilitar o uso, acesso, conversões na programação, compartilhamento com outros bancos e aplicações. Veja alguns tipos de dados: string (texto), integer (inteiro), double (duplo), money (monetário), data (data), dateTime (data e hora), binário, image (imagem). Claro que cada tipo de banco de dados tem tipos diferentes, mas em linhas gerais estes são os mais comuns.
Ler Dados do Banco
Vamos aos códigos. Primeiramente utilizarei o banco de dados northwind, que é o mais conhecido no mundo, o qual você pode fazer download no link http://northwinddatabase.codeplex.com/ e instalar no SQL Server.
Na programação o primeiro passo definir a string de conexão, sendo necessário definir o Data Source (servidor), o Initial Catalog (nome do banco de dados), Integrated Security (segurança integrada), user id (usuário) e password (senha). Claro que cada string de conexão depende de onde está instalado e os dados podem ser diferentes.
Por exemplo, a linha a seguir representa a string de conexão na minha máquina, o qual MARTE é o nome da minha máquina (pode ser o número IP, . (ponto) ou localhost). O nome do banco é o Northwind e uso segurança integrada.
string conexao = "Data Source=MARTE;Initial Catalog=Northwind;Integrated Security=True";
Como usarei o SQL Server, é preciso declarar o namespace a ser usado que contém todos os métodos e propriedades da classe de acesso a dados. Portanto, o código a seguir deverá ser declarado na lista de using.
using System.Data.SqlClient;
Em seguida, no formulário da aplicação desktop, adicionei um botão e um gridView. O seguinte código irá ler todos os dados da tabela Produtcs (produtos) e mostrará no controle dataGridView1.
//O try e catch controla se houve ou não erros na execução do código
try
{
//Esta é a instrução T-SQL (Transact SQL) para ler todos (*)
//os registros da entidade Products.
string sql = "Select * From Products";
//Aqui é definido o objeto SqlConnection responsável em realizar a conexão
//com o banco de dados localizado na variável conexao.
using (SqlConnection conn = new SqlConnection(conexao))
{
//Em seguida é feita a abertura da conexão com o Open.
conn.Open();
//O objeto DataTable criará uma tabela na memória, mas será usado logo a seguir.
DataTable dt = new DataTable();
//Agora é preciso executar a consulta no banco, ou seja, o SqlCommand é o comando
//que pega a instrução T-SQL definida na variável sql e executa na respectiva
//conexão definido no objeto conn.
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
//Uma vez executado o SqlCommand, o objeto SqlDataReader irá efetivamente
//carregar os dados definidos no comando cmd.
SqlDataReader reader = cmd.ExecuteReader();
//Uso o método Load do DataTable o qual lê o DataReader declarado em reader.
//É exatamente agora que os dados vão pra memória na tabela dt (DataTable).
dt.Load(reader);
//Uma vez lidos os registros, os comandos Close fecham tanto o
//DataReader quanto a conexão.
reader.Close();
}
conn.Close();
//Como os dados estão na memória e devem ser mostrados no objeto dataGridView1,
//usamos a propriedade DataSource e atribuímos o dt (DataTable). Pronto, os dados
//são mostrados ao usuário.
dataGridView1.DataSource = dt;
}
}
//Caso ocorrem algum erro no caminho, é exibida a mensagem a seguir para o usuário.
catch (Exception)
{
MessageBox.Show("Ocorreu algum erro na leitura do banco");
}
Veja no artigo como filtrar, atualizar, e inserir valores no banco de dados.
