Acesso a Dados com ADO.NET

Propaganda
Programação
Orientada à
Objetos
Aula 15 -ADO.NET
Conteúdo

Visão Geral do ADO.NET

O Namespace System.Data

Arquitetura do ADO.NET

Tipos de Acesso a Bancos de Dados no ADO.NET

Conexões e Transações

Execução de Comandos SQL e Stored Procedures

Acesso a dados com DataReader

Acesso a dados com DataAdapter
Visão Geral do ADO.NET

ADO.NET é a família de classes do framework .NET projetada para
o acesso a dados

É uma evolução da biblioteca ADO (ActiveX Data Objects) componentes COM de acesso a dados da plataforma Windows

Provê o acesso orientado a conexões: Execução de comandos
SQL e recuperação de dados com a classe DataReader

Provê o acesso desconectado: Realização de operações
desconectadas, mapeando um banco de dados relacional em
um objeto da classe DataSet
Visão Geral do ADO.NET

Disponibiliza as classes necessárias para acesso e
manipulação em BD e arquivos XML.

Uma das vantagens do ADO .NET é a possibilidade de
trabalharmos de forma desconectada do BD.

As classes estão no namespace System.Data.

Ainda será necessário um dos seguintes:



System.Data.SqlClient
System.Data.OleDb
System.Data.OracleClient
Visão Geral do ADO.NET

O SqlClient é usado para acessar BDs SQL Server a partir da
versão 7.0.

O OleDb para Access e SQL Server anterior a versão 7.0.

O OracleClient para BDs Oracle.

Podem ser acessador outros BDs a partir de outros
namespaces, mas estes devem ser instalados
separadamente.

Acesse os sites dos fabricantes para obter o namespace.
Visão Geral do ADO.NET
A
Oracle disponibiliza classes para acesso
ao BD que tem performance superior as
da Microsoft.
Provedores de Dados

Quatro provedores são disponíveis para realizar o acesso
a dados no ADO.NET

SQLServer, Oracle, OLEDB e ODBC Provider
ADO.NET
ADO.NET
SQLServer
Oracle
ODBC
OLEDB
SQL-data
Non-SQL-data
MS SQL Server, Oracle,
Jet, Foxpro, ...
Directory Services, Mail,
Text, Video, ...
Namespaces do ADO.NET

System.Data


System.Data.Common


Classes compartilhadas pelos provedores de dados: DataAdapter,
DBCommand, DBConnection, DBTransaction
System.Data.SqlClient, System.Data.Oracle, System.Data.ODBC,
System.Data.OleDB


Classes genéricas de acesso a dados: DataSet, DataTable, DataRow,
DataColumn, DataRelation, Constraint
Namespaces dos provedores de dados
System.Data.SqlTypes

Tipos de dados do Sql Server
Arquitetura do ADO.NET
ADO.NET Content Components
DataSet
Tables
DataTable
Fill
ADO.NET Managed Providers
DataReader
Transaction
Data
Adapter
Command
Relations
DataRelation
DataTable
Connection
Database
ReadXml
WriteXml
Connection-oriented
data flow
XML file
Connectionless data flow
Update
Tipos de Acesso


Acesso orientado a conexão

Mantém a conexão ativa com o banco de dados

Os dados permanecem atualizados (up-to-date)

Ideal para aplicações com pequenas transações e poucas
operações concorrentes
Acesso desconectado

A conexão não fica ativa, é aberta e fechada

Dados copiados para memória

Alterações nos dados podem entrar em conflito na
atualização e requerem tratamento adicional

Ideal para aplicações com transações demoradas e com
muitas operações em paralelo (web)
Banco de Dados de Exemplo

DER e Diagrama de Classes do banco de dados de
exemplo





create table [Veiculo](
[ID] [int] NOT NULL,
[Modelo] [varchar](50) NULL,
[Ano] [int] NULL,
[Preco] [float] NULL)
Banco de Dados Exemplo

Insert





insert into Veiculo
values(@ID, @Modelo, @Ano, @Preco)
Delete




create procedure spVeiculoInsert
(@ID int, @Modelo varchar(50), @Ano int, @Preco float) as
create procedure spVeiculoDelete (@ID int) as
delete from Veiculo
where ID = @ID
Update





create procedure spVeiculoUpdate
(@ID int, @Modelo varchar(50), @Ano int, @Preco float) as
update Veiculo
set Modelo = @Modelo, Ano = @Ano, Preco = @Preco
where ID = @ID
Acesso Orientado a Conexão

DbConnection


Representa um comando SQL
DbTransaction


Representa a conexão com o BD
DbCommand


.NET Application
ADO.NET Connected Model
DataReader
DbCommand
Command
Representa uma transação
DataReader

Resultado de um comando SQL

Permite o acesso seqüencial às
linhas de uma tabela
DbConnection
Database
DbTransaction
Conexões com o Banco de
Dados

Descendentes de DbConnection são utilizados para
realizar a conexão com o banco de dados


OdbcConnection, OleDbConnection, OracleConnection,
SqlConnection
É necessário definir strings com os parâmetros de
conexão de acordo com o banco de dados

string connectionStr = "Data Source=Server;Initial
Catalog=Database;Integrated Security=True";

string connectionStr = "Data Source=Server;Initial
Catalog=Database;User ID=sa;Password=senha";
Conectando ao Servidor

Conexão com o SQL Server utilizando autenticação do próprio
banco de dados

string connectionStr = "Data Source=Server;Initial Catalog=Database;User
ID=sa;Password=senha";

SqlConnection conn = new SqlConnection(connectionStr);

conn.Open();

... Execução de comandos ...

conn.Close();
Desconectando com TryFinnaly

É necessário garantir o fechamento da conexão
para liberar os recursos do banco de dados










try {
conn.Open();
...
}
catch (Exception error) {
...
}
finally {
conn.Close();
}
Transações


Transações garantem que um conjunto de alterações
em um banco de dados seja realizado de forma
atômica
Descendentes de DbTransaction são usados para
controlar as transações em um banco de dados



O método Commit confirma a transação
O método Rollback aborta a transação
Exemplo




conn.Open();
SqlTransaction tx = conn.BeginTransaction();
tx.Commit();
conn.Close();
Níveis de Isolamento

ReadCommited


ReadUncommited


Dados não “commitados” são vistos por outras transações
RepeatableRead


Dados escritos em uma transação somente são vistos por outras
transações após o commit
Dados lidos em uma transação não podem ser alterados por outras
transações
Serializable

Serializa o acesso aos dados no banco de dados
Comandos

Descendentes de DbCommand são responsáveis pela
execução de comandos em um banco de dados


OdbcCommand, OleDbCommand, OracleCommand,
SqlCommand
A propriedade CommandType do comando define o tipo de
operação realizada

Text – Permite definir um comando em linguagem SQL

StoredProcedure – Permite executar um procedimento armazenado
no banco

TableDirect – Permite acessar diretamente uma tabela
Exemplos de Comandos



Text

string select = "select * from Veiculo";

SqlConnection conn = new SqlConnection(connectionStr);

conn.Open();

SqlCommand cmd = new SqlCommand(select, conn);
StoredProcedure

SqlCommand cmd = new SqlCommand("spVeiculoInsert", conn);

cmd.CommandType = CommandType.StoredProcedure;

cmd.Parameters.AddWithValue("@ID", obj.Id);
TableDirect

SqlCommand cmd = new SqlCommand("Veiculo", conn);

cmd.CommandType = CommandType.TableDirect;
Métodos de Execução

Métodos utilizados na execução dos comandos



ExecuteNonQuery

Utilizado em comandos que não retornam um resultado: delete,
insert, update

Retorna um inteiro com o número de linhas afetadas
ExecuteReader

Utilizado em comandos select que retornam um conjunto de
dados

Retorna um objeto DataReader, utilizado para o acesso
seqüencial aos dados
ExecuteScalar

Utilizado em comandos select que retornam um único valor
Executando um
StoredProcedure

Inserção com execução de procedimento armazenado












SqlConnection conn = new SqlConnection(connectionStr);
SqlCommand cmd = new SqlCommand("spVeiculoInsert", conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@ID", obj.Id);
cmd.Parameters.AddWithValue("@Modelo", obj.Modelo);
cmd.Parameters.AddWithValue("@Ano", obj.Ano);
cmd.Parameters.AddWithValue("@Preco", obj.Preço);
conn.Open();
try {
cmd.ExecuteNonQuery();
}
finally {
conn.Close();


}
Lendo com DataReader

Seleção com comando SQL retornando um DataReader

Types.Veiculos objs = new Types.Veiculos();

SqlConnection conn = new SqlConnection(connectionStr);

SqlCommand cmd = new SqlCommand("select * from Veiculo", conn);

conn.Open();

SqlDataReader datareader = cmd.ExecuteReader(...);

try { while (datareader.Read()) {

Types.Veiculo obj = new Types.Veiculo();

obj.Id = Convert.ToInt32(datareader[0]);

...

objs.Add(obj); }

}

finally { datareader.Close();

}
Acesso Desconectado

DbConnection



.Net Application
DbCommand


Representa a conexão com o BD
Representa um comando SQL
DataAdapter

Fill – Preenche o DataSet a partir do
BD

Update – Atualiza o BD a partir do
DataSet
Connection-less Model
DataSet
DataAdapter
DbCommand
DbConnection
DataSet

Armazena os dados do banco na
memória
Database
Preenchendo o DataSet

Usando o DataAdapter para preencher o DataSet






SqlConnection conn = new SqlConnection(connectionStr);
SqlCommand cmd = new SqlCommand("select * from
Veiculo", conn);
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
da.Fill(ds, "Veiculo");
Mostrando o DataSet em um DataGridView



dataGridView1.DataSource = ds;
dataGridView1.DataMember = "Veiculo";
conn.Close();
Atualizando o Banco de
Dados

Preparando o DataAdapter para atualizar o BD





Recuperando o DataSet da interface


SqlConnection conn = new SqlConnection(connectionStr);
SqlCommand cmd = new SqlCommand("select * from
Veiculo", conn);
SqlDataAdapter da = new SqlDataAdapter(cmd);
SqlCommandBuilder cb = new SqlCommandBuilder(da);
DataSet ds = (dataGridView1.DataSource as DataSet);
Atualizando o Banco de Dados


da.Update(ds, "Veiculo");
conn.Close();
Download