C#
     ADO.NET
Leonardo Melo Santos
http://about.me/leonardomelosantos
Conteúdo programático
● Data Providers
  ○   SQL Server .NET Data Provider
  ○   OLEDB e ODBC
  ○   Oracle Data Provider
  ○   Objetos essenciais
● Executando comandos e consultas
  ○ XxxxDataReader, XxxxCommand, XxxxDataAdapter
  ○ Procedures
  ○ Transações
Data providers
● Camada intermediária que permite acesso
  ao banco. Código .NET utiliza provedores
  para manipular dados;
● Quatro diferentes implementados pela
  Microsoft:
  ○   SQL Server .NET Data Provider
  ○   OLEDB .NET Data Provider
  ○   ODBC .NET Data Provider
  ○   Oracle .NET Data Provider
● Diferentes implementados por terceiros.
  ○ MySQL, SQLite, etc.
SQL Server Data Provider
● Acesso a Banco de Dados SQL Server 7.0 ou
  superior
  ○ SQL Server 6.5 utiliza OLEDB
● Namespace System.Data.SqlClient
● Nativo, acesso direto a base
  ○ Maior performance de todos
Outros providers
● OLEDB .NET Data Provider
  ○ Acesso a bases de dados OLEDB
  ○ Access, Oracle...
  ○ System.Data.OleDb
● ODBC .NET Data Provider
  ○ Acesso a bases de dados ODBC
  ○ System.Data.Odbc
Objetos essenciais
● Os provedores de dados contém objetos essenciais
   para o ADO .NET
   ○ XxxxConnection
   ○ XxxxCommand
   ○ XxxxDataReader
   ○ XxxxDataAdapter

   SQL Server       Oracle              ODBC              OleDB

   SqlConnection    OracleConnection    ODBCConnection    OleDBConnection

   SqlCommand       OracleCommand       ODBCCommand       OleDBCommand

   SqlDataReader    OracleDataReader    ODBCDataReader    OleDBDataReader

   SqlDataAdapter   OracleDataAdapter   ODBCDataAdapter   OleDBDataAdapter
Classes XxxxConnection
● Forma de acesso a uma base de dados
● Utilizaremos SqlConnection
● Necessita saber qual a base e de que forma
  será o acesso
  ○ String de conexão
XxxxConnection - Propriedades
● ConnectionTimeout
  ○ Tempo de tentativa para conectar ao banco de
    dados caso não esteja respondendo
  ○ Igual ao que foi informado na string de conexão
● DataBase
  ○ Base de dados conectada
  ○ Igual ao que foi informado na string de conexão
● DataSource
  ○ Banco de dados conectado
  ○ Igual ao que foi informado na string de conexão
XxxxConnection - Propriedade State
● Define o estado atual da conexão Utiliza
  enumeração ConnectionState
● Pode ser:
  ○   Open
  ○   Closed
  ○   Fetching
  ○   Connecting
  ○   Broken
  ○   Executing
XxxxConnection - Métodos
● Open() abre a conexão com o banco
  ○ Segue o caminho definido pela string de conexão
  ○ Muda o estado da conexão para ConnectionState.
    Open
  ○ Pode lançar SqlException
● Close() fecha a conexão
  ○ Ideal de ser chamado no bloco finally de
    tratamento de erros
  ○ Conexão será fechada de qualquer forma
  ○ Chamar o método mesmo com a conexão já
    fechada não causa erro
Exercício
● Criar uma tentativa de conexão com banco
  de dados usando SqlConnection, e só fechar
  a conexão se a mesma estiver no estado
  aberta.
Executando comandos
        SQL
Executando comandos SQL
● Três tipos de comandos a serem executados
  no banco de dados:
  ○ Comandos que não fazem busca
  ○ Comandos que retornam um valor
  ○ Comandos que retornam coleção de valores
Classe XxxxCommand
● Caminho para execução de comandos no
  banco de dados
● Necessitam de uma conexão aberta para
  executar
● Propriedade Connection mantém referência
  ao objeto do tipo SqlConnection
● Criado de duas formas:
  ○ Construtor
  ○ Método CreateCommand() de uma conexão
XxxxCommand - Propriedades essenciais

● CommandText
  ○ Contém o texto SQL a ser enviado ao banco ou
    nome do stored procedure a ser executado
● Connection
  ○ Contém referência a um objeto SqlConnection que
    usará para acessar o banco
● CommandType
  ○ Tipo de execução de comando
  ○ Utiliza enumeração CommandType
  ○ Padrão é CommandType.Text (texto SQL)
Criando XxxxCommand
● Utilizando o construtor
SqlCommand cmd = new SqlCommand(“SELECT * FROM
Cliente”, conexao);

● Construtor vazio e propriedades
SqlCommand cmd = new SqlCommand();
cmd.CommandText = “SELECT * FROM Cliente”;
cmd.Connection = conexao; //previamente criada

● Usando o CreateCommand da conexão
SqlCommand cmd = conexao.CreateCommand();
cmd.CommandText = “SELECT * FROM Cliente”;
Comandos sem busca
● Usada para manutenção de dados
   ○ INSERT, UPDATE, DELETE
● Método ExecuteNonQuery()
   ○ Necessita de conexão aberta
   ○ Retorna quantidade de linhas afetadas

comando.CommandText =
"UPDATE Cliente SET nome='José da Silva' where idade=23";
conexao.Open();
int linhas = comando.ExecuteNonQuery();
if (linhas == 0) {
   throw new Exception("Cliente não encontrado!");
}
Comandos para retornar um valor
● Busca por apenas uma informação
● Retorna a primeira coluna do primeiro
  registro retornado
● Não retorna todo o registro, e sim um valor
● ExecuteScalar
  ○ Retorna object (conversão é necessária)
  ○ Conexão deve estar aberta
Comandos para retornar um valor
● Busca pode ser genérica (retorno só será o
  primeiro valor)
comando.CommandText = "SELECT * FROM Cliente";
conexao.Open();
// Primeira coluna do banco é string. Deve-se fazer
conversão // se o retorno for null, exceção será levantada
na conversão
string nome = (string) comando.ExecuteScalar();


● Busca pode ser específica
comando.CommandText =
"SELECT nome FROM Cliente where cpf=„05482542127‟";
Exercício
1. Executar um comando para realizar uma
   inserção numa tabela;
2. Executar um comando para retornar um
   valor escalar;
Retornando uma coleção de dados
Pode ser através de dois recursos:
● SqlDataReader
  ○ Read-only : não modifica os dados
  ○ Forward-only: segue a ordem crescente
● ExecuteReader
  ○ Cria uma instância do SqlDataReader
  ○ Leitor de dados para dados retornados pelo select
Lendo retorno de consulta com
DataReader
● Criado pelo método ExecuteReader
● Método Read() do SqlDataReader
  ○ Testa se há dados para ler, se houver retorna true,
    se não, false
  ○ Havendo dados, lê os próximos dados
● Recuperando as informações
  ○ Indexadas pela ordem ou pelo nome das colunas
     ■ nomeDataReader[“nomeColuna”]
     ■ nomeDataReader[numeroColuna]
Lendo retorno de consulta com
DataReader
SqlCommand cmd = new SqlCommand("SELECT *
FROM Customers", conexao);
SqlDataReader dr = cmd.ExecuteReader();
while(dr.Read()) {
    string nome = (string) dr["nome"];
    int idade = (int) dr["idade"];
    Console.WriteLine(nome);
}
Exercício
1. Consultar uma tabela do SQL Server e
   mostrar os campos no Console, usando o
   recurso SqlDataReader;
Consultando com XxxxDataAdapter
● Modo desconectado
● Alguns cenários de aplicações requerem
  acesso a dados offline
  ○ Não há possibilidade de conexão com a fonte de
    dados
  ○ É necessário economizar recursos
● Uma cópia dos dados é armazenada em
  memória
  ○ Manutenção é feita na memória
  ○ Buscas,Inserção, atualização, remoção
  ○ Dados retornam para a fonte de dados quando
    possível
DataSet
● Reside no Namespace System.Data
● Dados são armazenados em um DataSet
● Conjunto de dados que contém:
  ○   Tabelas (DataTable)
  ○   Linhas (DataRow)
  ○   Colunas (DataColumn)
  ○   Relacionamentos (DataRelation)
  ○   ...
● Pode conter várias tabelas
● Independente de base de dados
● Não sabe a origem dos dados
XxxxDataAdapter
● Adicionar dados programaticamente não é
  produtivo
● DataSet não sabe um caminho para buscar
  dados do Banco de Dados
  ○ Para isso seria necessária uma conexão
  ○ DataSet é independente de banco
● SqlDataAdapter
  ○ Ponte entre banco de dados e DataSet
  ○ Preenche os dados no DataSet
  ○ Recupera modificações no DataSet e atualiza banco
XxxxDataAdapter
● Possui quatro comandos SqlCommand
  ● SelectCommand: Utilizado para
    preencher os dados no DataSet através
    do método Fill
  ● InsertCommand: Inserção de dados
  ● UpdateCommand: Atualização de
    registros
  ● DeleteCommand: Exclusão de registros
Usando SqlDataAdapter
● Construtor recebe
  ○ Comando SQL a ser executado no SelectCommand
  ○ SqlConnection que será utilizada pelo
    SelectCommand


SqlDataAdapter dap = new SqlDataAdapter(
"SELECT * FROM Customers",conexao);
Usando SqlDataAdapter para DataSet
● Método Fill()
  ○ DataSet a ser preenchido
  ○ Nome da tabela que vai receber os valores (Caso
    um nome não seja indicado, a tabela Table será
    criada)
  ○ SelectCommand deve estar preenchido

DataSet ds = new DataSet();
SqlDataAdapter dap = new SqlDataAdapter(
       "SELECT * FROM Customers",conexao);
dap.Fill(ds);
Consultando os registros de um DataSet
DataSet meuDataSet = new DataSet();
SqlDataAdapter meuDataAdpater = new SqlDataAdapter(
                    "SELECT * FROM CLIENTES", minhaConexao);
meuDataAdpater.Fill(meuDataSet);
minhaConexao.Close(); // Fechando a conexão
if (meuDataSet.Tables[0].Rows.Count > 0) {
   for (int i = 0; i < meuDataSet.Tables[0].Rows.Count; i++)
{
       DataRow linhaAtual = meuDataSet.Tables[0].Rows[i];
       int idFilial = (int)linhaAtual["ID_IN_FILIAL_CIEE"];
       Console.WriteLine(" Filial "+ idFilial + " = " +
                         linhaAtual["DSC_VC_FILIAL_CIEE"] );
   }
} else {
   Console.WriteLine("Nenhum registro encontrado!");
}
Exercício
1. Consultar uma tabela do SQL Server e
   mostrar os campos no Console, usando o
   recurso SqlDataAdapter populando um
   DataSet;
Dúvidas

Curso de OO com C# - Parte 06 - ADO.NET

  • 1.
    C# ADO.NET Leonardo Melo Santos http://about.me/leonardomelosantos
  • 2.
    Conteúdo programático ● DataProviders ○ SQL Server .NET Data Provider ○ OLEDB e ODBC ○ Oracle Data Provider ○ Objetos essenciais ● Executando comandos e consultas ○ XxxxDataReader, XxxxCommand, XxxxDataAdapter ○ Procedures ○ Transações
  • 3.
    Data providers ● Camadaintermediária que permite acesso ao banco. Código .NET utiliza provedores para manipular dados; ● Quatro diferentes implementados pela Microsoft: ○ SQL Server .NET Data Provider ○ OLEDB .NET Data Provider ○ ODBC .NET Data Provider ○ Oracle .NET Data Provider ● Diferentes implementados por terceiros. ○ MySQL, SQLite, etc.
  • 4.
    SQL Server DataProvider ● Acesso a Banco de Dados SQL Server 7.0 ou superior ○ SQL Server 6.5 utiliza OLEDB ● Namespace System.Data.SqlClient ● Nativo, acesso direto a base ○ Maior performance de todos
  • 5.
    Outros providers ● OLEDB.NET Data Provider ○ Acesso a bases de dados OLEDB ○ Access, Oracle... ○ System.Data.OleDb ● ODBC .NET Data Provider ○ Acesso a bases de dados ODBC ○ System.Data.Odbc
  • 6.
    Objetos essenciais ● Osprovedores de dados contém objetos essenciais para o ADO .NET ○ XxxxConnection ○ XxxxCommand ○ XxxxDataReader ○ XxxxDataAdapter SQL Server Oracle ODBC OleDB SqlConnection OracleConnection ODBCConnection OleDBConnection SqlCommand OracleCommand ODBCCommand OleDBCommand SqlDataReader OracleDataReader ODBCDataReader OleDBDataReader SqlDataAdapter OracleDataAdapter ODBCDataAdapter OleDBDataAdapter
  • 7.
    Classes XxxxConnection ● Formade acesso a uma base de dados ● Utilizaremos SqlConnection ● Necessita saber qual a base e de que forma será o acesso ○ String de conexão
  • 8.
    XxxxConnection - Propriedades ●ConnectionTimeout ○ Tempo de tentativa para conectar ao banco de dados caso não esteja respondendo ○ Igual ao que foi informado na string de conexão ● DataBase ○ Base de dados conectada ○ Igual ao que foi informado na string de conexão ● DataSource ○ Banco de dados conectado ○ Igual ao que foi informado na string de conexão
  • 9.
    XxxxConnection - PropriedadeState ● Define o estado atual da conexão Utiliza enumeração ConnectionState ● Pode ser: ○ Open ○ Closed ○ Fetching ○ Connecting ○ Broken ○ Executing
  • 10.
    XxxxConnection - Métodos ●Open() abre a conexão com o banco ○ Segue o caminho definido pela string de conexão ○ Muda o estado da conexão para ConnectionState. Open ○ Pode lançar SqlException ● Close() fecha a conexão ○ Ideal de ser chamado no bloco finally de tratamento de erros ○ Conexão será fechada de qualquer forma ○ Chamar o método mesmo com a conexão já fechada não causa erro
  • 11.
    Exercício ● Criar umatentativa de conexão com banco de dados usando SqlConnection, e só fechar a conexão se a mesma estiver no estado aberta.
  • 12.
  • 13.
    Executando comandos SQL ●Três tipos de comandos a serem executados no banco de dados: ○ Comandos que não fazem busca ○ Comandos que retornam um valor ○ Comandos que retornam coleção de valores
  • 14.
    Classe XxxxCommand ● Caminhopara execução de comandos no banco de dados ● Necessitam de uma conexão aberta para executar ● Propriedade Connection mantém referência ao objeto do tipo SqlConnection ● Criado de duas formas: ○ Construtor ○ Método CreateCommand() de uma conexão
  • 15.
    XxxxCommand - Propriedadesessenciais ● CommandText ○ Contém o texto SQL a ser enviado ao banco ou nome do stored procedure a ser executado ● Connection ○ Contém referência a um objeto SqlConnection que usará para acessar o banco ● CommandType ○ Tipo de execução de comando ○ Utiliza enumeração CommandType ○ Padrão é CommandType.Text (texto SQL)
  • 16.
    Criando XxxxCommand ● Utilizandoo construtor SqlCommand cmd = new SqlCommand(“SELECT * FROM Cliente”, conexao); ● Construtor vazio e propriedades SqlCommand cmd = new SqlCommand(); cmd.CommandText = “SELECT * FROM Cliente”; cmd.Connection = conexao; //previamente criada ● Usando o CreateCommand da conexão SqlCommand cmd = conexao.CreateCommand(); cmd.CommandText = “SELECT * FROM Cliente”;
  • 17.
    Comandos sem busca ●Usada para manutenção de dados ○ INSERT, UPDATE, DELETE ● Método ExecuteNonQuery() ○ Necessita de conexão aberta ○ Retorna quantidade de linhas afetadas comando.CommandText = "UPDATE Cliente SET nome='José da Silva' where idade=23"; conexao.Open(); int linhas = comando.ExecuteNonQuery(); if (linhas == 0) { throw new Exception("Cliente não encontrado!"); }
  • 18.
    Comandos para retornarum valor ● Busca por apenas uma informação ● Retorna a primeira coluna do primeiro registro retornado ● Não retorna todo o registro, e sim um valor ● ExecuteScalar ○ Retorna object (conversão é necessária) ○ Conexão deve estar aberta
  • 19.
    Comandos para retornarum valor ● Busca pode ser genérica (retorno só será o primeiro valor) comando.CommandText = "SELECT * FROM Cliente"; conexao.Open(); // Primeira coluna do banco é string. Deve-se fazer conversão // se o retorno for null, exceção será levantada na conversão string nome = (string) comando.ExecuteScalar(); ● Busca pode ser específica comando.CommandText = "SELECT nome FROM Cliente where cpf=„05482542127‟";
  • 20.
    Exercício 1. Executar umcomando para realizar uma inserção numa tabela; 2. Executar um comando para retornar um valor escalar;
  • 21.
    Retornando uma coleçãode dados Pode ser através de dois recursos: ● SqlDataReader ○ Read-only : não modifica os dados ○ Forward-only: segue a ordem crescente ● ExecuteReader ○ Cria uma instância do SqlDataReader ○ Leitor de dados para dados retornados pelo select
  • 22.
    Lendo retorno deconsulta com DataReader ● Criado pelo método ExecuteReader ● Método Read() do SqlDataReader ○ Testa se há dados para ler, se houver retorna true, se não, false ○ Havendo dados, lê os próximos dados ● Recuperando as informações ○ Indexadas pela ordem ou pelo nome das colunas ■ nomeDataReader[“nomeColuna”] ■ nomeDataReader[numeroColuna]
  • 23.
    Lendo retorno deconsulta com DataReader SqlCommand cmd = new SqlCommand("SELECT * FROM Customers", conexao); SqlDataReader dr = cmd.ExecuteReader(); while(dr.Read()) { string nome = (string) dr["nome"]; int idade = (int) dr["idade"]; Console.WriteLine(nome); }
  • 24.
    Exercício 1. Consultar umatabela do SQL Server e mostrar os campos no Console, usando o recurso SqlDataReader;
  • 25.
    Consultando com XxxxDataAdapter ●Modo desconectado ● Alguns cenários de aplicações requerem acesso a dados offline ○ Não há possibilidade de conexão com a fonte de dados ○ É necessário economizar recursos ● Uma cópia dos dados é armazenada em memória ○ Manutenção é feita na memória ○ Buscas,Inserção, atualização, remoção ○ Dados retornam para a fonte de dados quando possível
  • 26.
    DataSet ● Reside noNamespace System.Data ● Dados são armazenados em um DataSet ● Conjunto de dados que contém: ○ Tabelas (DataTable) ○ Linhas (DataRow) ○ Colunas (DataColumn) ○ Relacionamentos (DataRelation) ○ ... ● Pode conter várias tabelas ● Independente de base de dados ● Não sabe a origem dos dados
  • 27.
    XxxxDataAdapter ● Adicionar dadosprogramaticamente não é produtivo ● DataSet não sabe um caminho para buscar dados do Banco de Dados ○ Para isso seria necessária uma conexão ○ DataSet é independente de banco ● SqlDataAdapter ○ Ponte entre banco de dados e DataSet ○ Preenche os dados no DataSet ○ Recupera modificações no DataSet e atualiza banco
  • 28.
    XxxxDataAdapter ● Possui quatrocomandos SqlCommand ● SelectCommand: Utilizado para preencher os dados no DataSet através do método Fill ● InsertCommand: Inserção de dados ● UpdateCommand: Atualização de registros ● DeleteCommand: Exclusão de registros
  • 29.
    Usando SqlDataAdapter ● Construtorrecebe ○ Comando SQL a ser executado no SelectCommand ○ SqlConnection que será utilizada pelo SelectCommand SqlDataAdapter dap = new SqlDataAdapter( "SELECT * FROM Customers",conexao);
  • 30.
    Usando SqlDataAdapter paraDataSet ● Método Fill() ○ DataSet a ser preenchido ○ Nome da tabela que vai receber os valores (Caso um nome não seja indicado, a tabela Table será criada) ○ SelectCommand deve estar preenchido DataSet ds = new DataSet(); SqlDataAdapter dap = new SqlDataAdapter( "SELECT * FROM Customers",conexao); dap.Fill(ds);
  • 31.
    Consultando os registrosde um DataSet DataSet meuDataSet = new DataSet(); SqlDataAdapter meuDataAdpater = new SqlDataAdapter( "SELECT * FROM CLIENTES", minhaConexao); meuDataAdpater.Fill(meuDataSet); minhaConexao.Close(); // Fechando a conexão if (meuDataSet.Tables[0].Rows.Count > 0) { for (int i = 0; i < meuDataSet.Tables[0].Rows.Count; i++) { DataRow linhaAtual = meuDataSet.Tables[0].Rows[i]; int idFilial = (int)linhaAtual["ID_IN_FILIAL_CIEE"]; Console.WriteLine(" Filial "+ idFilial + " = " + linhaAtual["DSC_VC_FILIAL_CIEE"] ); } } else { Console.WriteLine("Nenhum registro encontrado!"); }
  • 32.
    Exercício 1. Consultar umatabela do SQL Server e mostrar os campos no Console, usando o recurso SqlDataAdapter populando um DataSet;
  • 33.