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:

Listagem 1: Visualização de uma connectionString no webconfig.

        <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:

Listagem 2: Acesso de uma ConnectionString através do code behind
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).

Listagem 3: Query de seleção de todos os dados da tabela Arquivos
"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:

Listagem 4: Combinação do método Read dentro de um laço "while"
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.

Listagem 5: Preenchimento de duas tabelas diferentes em um DataSet

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:

  1. Selecionar todos os jogadores de futebol que possuam o time "Brasi" ou "Japão".
  2. Remover todos os jogadores de futebol que possuam o sobrenome "Silva".
  3. Mudar o time dos jogadores de futebol, de "Japão" para "Brasil".
  4. 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.

 Criando um novo projeto Web no Visual Studio 2010
Figura 1: Criando um novo projeto Web no Visual Studio 2010

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:

Adicionando o provedor do MySql como referência no projeto
Figura 2: Adicionando o provedor do MySql como referência no projeto

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:

Criando uma nova página aspx
Figura 3: Criando uma nova página aspx

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:

Listagem 6: Inserção de 4 botões e 1 GridView

<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:

Listagem 7: Criação dos métodos dos botões

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.

Criando eventos dos botões
Figura 4: Criando eventos dos botões

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:

Listagem 8: Criação do método de seleção.
//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:

Listagem 9: Criação do método de remoção.
//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:

Listagem 10: Criação do método de atualização.
//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:

Listagem 11: Criação do método de inserção.
//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.

Confira também