ADO.NET é a tecnologia da Microsoft responsável pelas principais tarefas de comunicação com o banco de dados, ou seja, com ela conseguiremos criar, recuperar, atualizar e apagar dados (CRUD – Create, Recover, Update and Delete).
É de suma importância possuir conhecimentos de alguns dos seus objetos: Connection, Command, DataReader, and DataAdapter.
Os provedores auxiliam na execução desses objetos. Atualmente existem diversos, os mais conhecidos são: OLEDB, SQL, ODBC e MySQL. Nesse artigo utilizaremos o do MySQL, a única diferença de um provedor para os demais são os prefixos dos nomes dos objetos, por exemplo no SQL Server o Connection é "SqlConnection" e no MySQL é "MySqlConnection".
Connection é o responsável pela Conexão do banco de dados. Você terá de passar as coordenadas (usuário, senha, nome do banco de dados) para ele. Para fazê-lo, basta definir a propriedade "ConnectionString" que deve conter todas essas informações.
Uma boa prática de programação é colocar a "ConnectionString" no arquivo de configuração web (webconfig), para não ter de escrevê-la repentinamente. Confira na Listagem 1:
<connectionStrings>
<add name="nomeDaConnectionString"
connectionString="server=ipDoServidor;UserId=nomeUsuario;
password=senhaUsuario;Persist Security Info=True;
database=nomeBancoDeDados"
providerName="nomeProvider" />
</connectionStrings>
O nome da "ConnectionString" é importante para conseguirmos referenciá-la no código, confira a Listagem 2:
System.Configuration.ConfigurationManager.ConnectionStrings["nomeDaConnectionString"]
Observação: Podemos ter mais de uma "connectionString" em um webconfig, por isso como uma boa prática de programação recomenda-se nomes sugestivos. Não coloque nomes de identificação pessoal como, por exemplo: "connectionStringXYZ".
Command é o responsável pela execução das queries no banco de dados. Queries são os códigos do SQL (Structured Query Language) que são utilizadas para criar, recuperar, atualizar e apagar dados (CRUD – Create, Recover, Update and Delete).
É importante saber 3 métodos desse objeto:
ExecuteReader, ExecuteNonQuery e ExecuteScalar. O primeiro é utilizado para recuperação de diversos dados (Ex: SELECT), o segundo para execução de queries que não retornam dados (Ex: INSERT), e o terceiro para o retorno de um valor único (Ex: AVG).
"SELECT * FROM Arquivos"
Esse código faz a seleção (SELECT) de todos os dados (*) da tabela "Arquivos". É importante termos o conhecimento de que muitos gerenciadores de banco de dados (SGBD) tratam o nome das colunas e tabelas com "Case Sensitive", ou seja, as letras maiúsculas se diferenciam das minúsculas. Nesse caso "Arquivos" será diferente de "arquivos".
DataReader é o responsável pela leitura da execução das queries definidas no objeto anterior (Command). Em muitos casos, ele é uma das maneiras mais rápidas e simples para obtenção de dados, porém só é possível percorrer os registros de maneira linear e sequencial, ou seja, seguindo sempre de um arquivo de uma posição x para outro com posição x + 1. Muitos cientistas afirmam que na maioria dos casos o desempenho do DataReader é muito melhor do que o do DataSet.
Possui um método de suma importância, o "Read" que permite saber se existem valores posteriores. Ele combinado com um laço "while" forma uma combinação perfeita para percorrer todos os dados de uma determinada query de seleção.
Confira a Listagem 4:
MySqlDataReader _dr = _MySqlCommand.ExecuteReader();
while (_dr.Read())
{
Artilheiro _artilheiro = new Artilheiro();
_artilheiro.Nome = _dr["Nome"].ToString();
_artilheiro.Sobrenome = _dr["Sobrenome"].ToString();
_artilheiro.Time = _dr["Time"].ToString()
_artilheiro.Endereco = _dr["Endereco"].ToString();
_lstArtilheiro.Add(_artilheiro);
}
Observação: Nesse caso foi utilizado o provedor MySQL para a recuperação de informações de um banco de dados MySQL, por isso o nome do objeto DataReader e Command estão modificados.
No primeiro passo instanciamos um objeto MySqlDataReader _dr com a execução do método ExecuteReader do objeto MySqlCommand _MySqlCommand.
Logo em seguida codificamos o laço “while” utilizando o método Read citado anteriormente.
Dentro do loop, notamos que sempre será criado um objeto Artilheiro _artilheiro que possuirá as suas propriedades preenchidas pelos valores das colunas dos respectivos _dr.
Observação: Note que foi executado o método ExecuteReader do objeto MySqlCommand _MySqlCommand, pois é uma query que recupera diversas tuplas (linhas do banco de dados).
DataAdapter é o responsável pelo preenchimento do DataSet, que é um objeto responsável pelo armazenamento de inúmeras tabelas que podem ser relacionadas entre si.
O principal método dele é o “Fill”, que executa a query do objeto Command e preenche um DataSet com o resultado.
System.Data.DataSet _DataSet = new System.Data.DataSet("DataSet");
_MySqlCommand.CommandText = "SELECT * FROM PESSOA";
MySqlDataAdapter _MySqlDataAdapter01 = new MySqlDataAdapter(_MySqlCommand);
_MySqlCommand.CommandText = "SELECT * FROM CONCESSIONARIA ";
MySqlDataAdapter _MySqlDataAdapter02 = new MySqlDataAdapter(_MySqlCommand);
_MySqlDataAdapter.Fill(_DataSet, "PESSOA");
_MySqlDataAdapter02.Fill(_DataSet, "CONCESSIONARIA");
No primeiro passo do código, verifica-se a criação do objeto DataSet _DataSet, em seguida mostra a definição da query utilizando o método CommandText do objeto MySqlCommand _MySqlCommand.
No segundo passo é criado o objeto MySqlDataAdapter _MySqlDataAdapter01 utilizando o _MySqlCommand anterior, em seguida é codificado um segundo MySqlDataAdapter chamado _MySqlDataAdapter02 com o CommandText alterado.
No terceiro passo cada objeto MySqlDataAdapter executa o método Fill utilizando o _DataSet criado e passando o nome de cada tabela como atributo: “PESSOA” e “CONESSIONARIA”.
Assim, dominando esses 4 objetos podemos criar uma aplicação que crie, recupere, atualize e apague dados de um determinado banco de dados.
Exercício Prático:
Vamos supor que temos a seguinte situação:
O Gerenciador de bancos de dados é MySQL.
Existe uma tabela chamada "JOGADOR" com as seguintes colunas: "Nome"; "Sobrenome"; "Endereco"; "Email" e "Time";
Requisitos:
- Selecionar todos os jogadores de futebol que possuam o time "Brasi" ou "Japão".
- Remover todos os jogadores de futebol que possuam o sobrenome "Silva".
- Mudar o time dos jogadores de futebol, de "Japão" para "Brasil".
- Necessita-se da inserção de um determinado jogador de futebol que contenha as seguintes informações:
- Nome: "Caio"
- Sobrenome: "Uechi"
- Email: caio_uechi@hotmail.com
- Endereco: "São Paulo"
- Time: "Brasil"
Vamos criar uma aplicação web que atenda essa situação.
1º Passo: Criando o nosso projeto web
Com o Visual Studio aberto selecione File - New – Project ou pressione as teclas Ctrl + Shift + N. Em seguida selecione ASP.NET Empty Web Application, e altere o nome da aplicação para CRUD conforme a Figura 1.
2º Passo: Adicionando o provedor do MySQL no projeto.
Como o provedor do MySQL não é nativo do Visual Studio, em outras palavras, não vem instalado com o Visual Studio, teremos que fazer o download do mesmo e instalá-lo. É um plugin bem fácil se ser achado, basta procurar por Connector MySQL.
Depois de ter baixado e instalado o connector, clique com o botão direito em "References" e depois em "Add Reference". Em seguida selecione o MySql.Data conforme a Figura2:
Com o provedor adicionado, agora nós conseguiremos manipular os 4 objetos estudados anteriormente.
3º Passo – Criando uma página para dispararmos os novos eventos
Para codificarmos de uma maneira organizada, vamos criar uma página possuindo 4 botões, um para cada requisito:
Clique com botão direito no projeto, selecione "Add", depois "New Item" e "Web Form". Em seguida renomeie o nome da página para "Default.aspx" conforme a Figura3:
Com a nova página criada, abra o arquivo "Default.aspx" e dentro da tag "div" insirá 4 botões e 1 GridView conforme a listagem abaixo:
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Button ID="btnSelecionar" runat="server" Text="Seleção" OnClick="btnSelecionar_Click" /><br />
<asp:Button ID="btnRemover" runat="server" Text="Remoção" OnClick="btnRemover_Click" /><br />
<asp:Button ID="btnAtualizar" runat="server" Text="Atualização" OnClick="btnAtualizar_Click" /><br
/>
<asp:Button ID="btnInserir" runat="server" Text="Inserção" OnClick="btnInserir_Click" /><br />
<asp:GridView ID="grdVisualizacao" runat="server">
</asp:GridView>
</div>
</form>
</body>
</html>
Repare que para cada botão existe o seu respectivo método de clique "OnClick". Assim deveremos criar cada método no code behind, abra o arquivo "Default.aspx.cs" e em baixo do método "Page_Load" insira:
protected void Page_Load(object sender, EventArgs e) {}
protected void btnSelecionar_Click(object sender, EventArgs e) {}
protected void btnRemover_Click(object sender, EventArgs e){}
protected void btnAtualizar_Click(object sender, EventArgs e){}
protected void btnInserir_Click(object sender, EventArgs e) {}
O seu código deve estar parecido com a Figura 4.
4º Passo – Selecionando todos os jogadores de futebol que possuam o time "Brasil" ou "Japão":
Dentro do método btnSelecionar_Click codifique o seguinte trecho:
//Instancia o objeto MySqlConnection _MySqlConnection
MySqlConnection _MySqlConnection = new MySqlConnection();
//Define a ConnectionString do objeto _MySqlConnection
_MySqlConnection.ConnectionString =
"server=ipDoServidor;User Id=nomeUsuario;password=senhaUsuario;
Persist Security Info=True;database=nomeBancoDeDados";
//Abre a conexão com o banco de dados
_MySqlConnection.Open();
//Instancia o objeto MySqlCommand _MySqlCommand
MySqlCommand _MySqlCommand = new MySqlCommand();
//Monta a query de seleção de todos os jogadores onde o time seja Brasil
_MySqlCommand.CommandText = " SELECT * FROM JOGADOR WHERE TIME = "Brasil"";
//Mostra a Connection para o objeto _MySqlCommand
_MySqlCommand.Connection = _MySqlConnection;
//Nesse caso percorreremos os dados utilizando um DataReader,
//por isso executamos o método ExecuteReader do objeto MySqlCommand
MySqlDataReader _dr = _MySqlCommand.ExecuteReader();
//Uma lista de Jogador _lstJogador é instanciada,
//nesse caso Jogador é uma classe qualquer que criamos para receber os atributos
List<Jogador> _lstJogador = new List< Jogador >();
//Enquanto _dr possuir mais valor
while (_dr.Read())
{
//É criado uma nova instância Jogador _jogador
Jogador _jogador = new Jogador ();
//Popula-se os atributos do objeto com as colunas do _dr: "Nome";
// "Sobrenome"; "Email"; "Endereco" e "Time".
_jogador.Nome = _dr["Nome"].ToString();
_jogador.Sobrenome = _dr["Sobrenome"].ToString();
_jogador.Email = _dr["Email"].ToString();
_jogador.Endereco = _dr["Endereco"].ToString();
_jogador.Time = _dr["Time"].ToString();
//A lista adiciona cada instância _jogador
_lstJogador.Add(_jogador);
}
//Atualiza-se o dataGrid para a visualização dos dados da lista
grdVisualizacao.DataSource = _lstJogador;
grdVisualizacao.DataBind();
//Fecha a conexão
_MySqlConnection.Close();
5º Passo – Remover todos os jogadores de futebol que possuam o sobrenome "Silva".
Dentro do método btnRemover_Click codifique o seguinte trecho:
//Esses passos são os mesmos que o do método anterior
MySqlConnection _MySqlConnection = new MySqlConnection();
_MySqlConnection.ConnectionString = "server=ipDoServidor;User Id=nomeUsuario;
password=senhaUsuario;Persist Security Info=True;database=nomeBancoDeDados";
_MySqlConnection.Open();
MySqlCommand _MySqlCommand = new MySqlCommand();
//Define a query que remove todos os jogadores que possuam o sobrenome Silva
_MySqlCommand.CommandText = " DELETE FROM JOGADOR WHERE Sobrenome = "Silva"";
//Mostra a Connection para o objeto _MySqlCommand
_MySqlCommand.Connection = _MySqlConnection;
//Note que executamos o método ExecuteNonQuery, pois não precisamos de retorno
_MySqlCommand.ExecuteNonQuery();
//Não se esqueça de fechar a conexão
_MySqlConnection.Close();
6º Passo - Mudar o time dos jogadores de futebol, de "Japão" para "Brasil".
Dentro do método btnAtualizar_Click codifique o seguinte trecho:
//Esses passos são os mesmos que o do método anterior
MySqlConnection _MySqlConnection = new MySqlConnection();
_MySqlConnection.ConnectionString = "server=ipDoServidor;User Id=nomeUsuario;
password=senhaUsuario;Persist Security Info=True;database=nomeBancoDeDados";
_MySqlConnection.Open();
MySqlCommand _MySqlCommand = new MySqlCommand();
//Define a query que atualiza o time de "Japão" para "Brasil"
_MySqlCommand.CommandText = "UPDATE JOGADOR SET Time = "Brasil" where Time = "Japão"";
//Mostra a Connection para o objeto _MySqlCommand
_MySqlCommand.Connection = _MySqlConnection;
_MySqlCommand.ExecuteNonQuery();
_MySqlConnection.Close();
7º Passo Necessita-se da inserção de um determinado jogador de futebol:
Dentro do método btnInserir_Click codifique o seguinte trecho:
//Esses passos são os mesmos que o do método anterior
MySqlConnection _MySqlConnection = new MySqlConnection();
_MySqlConnection.ConnectionString = "server=ipDoServidor;User Id=nomeUsuario;
password=senhaUsuario;Persist Security Info=True;database=nomeBancoDeDados";
_MySqlConnection.Open();
MySqlCommand _MySqlCommand = new MySqlCommand();
//Query de inserção, note que o valor do ID é NULL porque esse campo foi definido
//como autoincremental, ou seja, a cada valor inserido o gerenciador de banco de
//dados se encarregará de preenchê-lo automaticamente somando 1 unidade.
_MySqlCommand.CommandText = " INSERT INTO "ondecomprarums2"."JOGADOR" ("ID", "Nome",
"Sobrenome", "Email", "Endereco", `Time`)VALUES(NULL, "Caio", "Uechi",
"caio_uechi@hotmail.com", "São Paulo", "Brasil");";
//Mostra a Connection para o objeto _MySqlCommand
_MySqlCommand.Connection = _MySqlConnection;
_MySqlCommand.ExecuteNonQuery();
_MySqlConnection.Close();
Com isso finalizo o meu primeiro artigo, espero que tenham gostado!
Um forte abraço do seu colega de programação Caio Uechi. Para qualquer tipo de feedback, utilize a seção de comentários abaixo.