O documento resume os principais conceitos e objetos do ADO.NET para acesso a dados, incluindo provedores de dados como SQL Server e Oracle, e classes como SqlConnection, SqlCommand, SqlDataReader e SqlDataAdapter para executar comandos, consultas e manipular dados.
2. 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
3. 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.
4. 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
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
● 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
7. 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
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 - Propriedade State
● 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 uma tentativa de conexão com banco
de dados usando SqlConnection, e só fechar
a conexão se a mesma estiver no estado
aberta.
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
● 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
15. 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)
16. 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”;
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 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
19. 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‟";
20. Exercício
1. Executar um comando para realizar uma
inserção numa tabela;
2. Executar um comando para retornar um
valor escalar;
21. 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
22. 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]
23. 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);
}
24. Exercício
1. Consultar uma tabela 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 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
27. 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
28. 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
29. 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);
30. 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);
31. 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!");
}
32. Exercício
1. Consultar uma tabela do SQL Server e
mostrar os campos no Console, usando o
recurso SqlDataAdapter populando um
DataSet;