Programação Orientada à Objetos Aula 15 -ADO.NET.
Transcript of Programação Orientada à Objetos Aula 15 -ADO.NET.
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
SQL-data
MS SQL Server, Oracle, Jet, Foxpro, ...
Non-SQL-data
Directory Services, Mail, Text, Video, ...
ADO.NETADO.NET
SQLServer
OracleODBC OLEDB
Namespaces do ADO.NET System.Data
Classes genéricas de acesso a dados: DataSet, DataTable, DataRow, DataColumn, DataRelation, Constraint
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 Namespaces dos provedores de dados
System.Data.SqlTypes Tipos de dados do Sql Server
Arquitetura do ADO.NET
Database
Connection-oriented data flow
ADO.NET Managed Providers
DataAdapter
Connection
DataReader
Command
Transaction
ADO.NET Content Components
XML file
Connectionless data flow
DataSet
Tables
Relations
DataTable
ReadXmlWriteXml
DataTable DataRelation
Update
Fill
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 create procedure spVeiculoInsert (@ID int, @Modelo varchar(50), @Ano int, @Preco float) as insert into Veiculo values(@ID, @Modelo, @Ano, @Preco)
Delete 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 a conexão com o BD
DbCommand Representa um comando SQL
DbTransaction Representa uma transação
DataReader Resultado de um comando SQL
Permite o acesso seqüencial às linhas de uma tabela Database
ADO.NET Connected Model
.NET Application
DbConnection
Command
DataReader
DbCommand 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 Try-Finnaly É 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 Dados escritos em uma transação somente são vistos por outras
transações após o commit
ReadUncommited Dados não “commitados” são vistos por outras transações
RepeatableRead 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
Representa a conexão com o BD
DbCommand
Representa um comando SQL
DataAdapter
Fill – Preenche o DataSet a partir do BD
Update – Atualiza o BD a partir do DataSet
DataSet
Armazena os dados do banco na memória
.Net Application
DataSet
DataAdapter
DbCommand
Database
DbConnection
Connection-less Model
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
SqlConnection conn = new SqlConnection(connectionStr); SqlCommand cmd = new SqlCommand("select * from
Veiculo", conn); SqlDataAdapter da = new SqlDataAdapter(cmd); SqlCommandBuilder cb = new SqlCommandBuilder(da);
Recuperando o DataSet da interface DataSet ds = (dataGridView1.DataSource as DataSet);
Atualizando o Banco de Dados da.Update(ds, "Veiculo"); conn.Close();