Boas Práticas de Programação com ADO.NET

Propaganda
Boas Práticas de
Programação com ADO.NET
Vasco Nunes
Safira Consultadoria
http://www.safira.pt
Tópicos







Como aceder de forma segura a dados
usando ADO.NET
Como gerir excepções em ADO.NET
Como implementar transacções
Como desenvolver aplicações ADO.NET de
alta performance
Técnicas de gestão de dados em ADO.NET
Orientações no uso de Databound Controls
Novas funcionalidades do ADO.NET 1.1
Pré-requisitos
 Conhecimentos
de Arquitectura do .NET
 Conhecimentos de VB.NET ou C#
 Conhecimentos de conceitos de SGBDR
 Conhecimentos de ADO e ADO.NET
Outra vez o ADO.NET?
 Já
sabemos construir aplicações em
ADO & ADO.NET e queremos construir
aplicações de alta performance
 Queremos saber os principais
benefícios das aplicações feitas com
ADO.NET
 Queremos usar o ADO.NET de uma
forma optimizada
Demonstrações






Segurança em ADO.NET
Tratamento de erros
Tratamento de transacções
Boas práticas de performance
Paginação de dados
Boas práticas de data-binding
Agenda







Recomendações de Segurança na
utilização de ADO.NET no acesso a dados
Recomendações no Tratamento de Erros
Semântica de Transacções em ADO.NET
Boas práticas de Performance
Paginação de dados em ADO.NET
Boas práticas usando Databound
Controls
ADO.NET 1.1: Novas funcionalidades
ADO.NET: Recomendações de Segurança
Modos de Autenticação

Autenticação Windows® vs. Autenticação SQL
 Segurança é gerida mais facilmente
 Usernames e passwords não são
necessários nas connection strings
 Maior segurança no login


Gestão de Passwords: períodos de expiração,
comprimentos mínimos, bloqueio de contas
depois de múltiplos logins inválidos
Passwords não são enviadas “em claro”
pela rede
ADO.NET: Recomendações de Segurança
Modos de Autenticação

Evitar personificação na Camada de Negócio
para tornar o pooling de ligações mais eficiente

Criação de ligação pooled demora mais com
autenticação Windows do que autenticação
SQL; na execução de comandos, a diferença é
insignificante
ADO.NET: Recomendações de Segurança
Connection String: Opções

Connection string pode ser guardada em:






Ficheiros XML de configuração
Ficheiros UDL para provider OLEDB
COM+ Catalog (para serviced components)
Windows Registry
...
Usando autenticação Windows

Autenticação Windows não necessita que a
password seja guardada
ADO.NET: Recomendações de Segurança
Connection String: Opções

Cifrar connection string no ficheiro XML

Restringir acesso a connection string guardada
no Registry usando ACLs e/ou cifrando os
dados

Alterar Persist Security info para false na
connection string

Evita o retorno da password através da propriedade
ConnectionString das classes SqlConnection ou
OleDbConnection
Demonstração 1
Segurança em ADO.NET
Protecção contra Ataques de
injecção de código SQL
Autenticação Windows e SQL
Agenda







Recomendações de Segurança na
utilização de ADO.NET no acesso a dados
Recomendações no Tratamento de Erros
Semântica de Transacções em ADO.NET
Boas práticas de Performance
Paginação de dados em ADO.NET
Boas práticas usando Databound
Controls
ADO.NET 1.1: Novas funcionalidades
Tratamento de erros: Boas práticas
Tratamento de Excepções



No ADO.NET os erros são propagados através
de Excepções disponibilizadas a partir das
classes SqlException ou OleDbException
Estender classes base para fazer o throw de
erros com mais significado para código
específico de acesso a dados
Usar Excepções para verificar o estado de uma
ligação é ineficiente

Usar ConnectionState.Open ou ConnectionState.Close
Tratamento de erros: Boas práticas
Erros em Stored Procedures

Erros gerados em stored procedures
usando o statement RAISEERROR



São propagados para o ADO.NET como
excepções
Excepções geradas se severidade > 10
Ligação é fechada se severidade > 16
Tratamento de erros: Boas práticas
Erros em Stored Procedures

Para mensagens informativas (severidade
<=10), não é gerada excepção

Mensagens informativas podem ser capturadas
no ADO.NET criando um handler para o evento
infoMessage da connection
AddHandler conn.infoMessage, New
SqlClient.SqlinfoMessageEventHandler(Addressof
MessageEventHandler)
Sub MessageEventHandler(ByVal sender As Object, ByVal
e As SqlClient.SqlinfoMessageEventArgs)
‘do whatever
Demonstração 2
Tratamento de erros em
ADO.NET
Tratamento de excepções e propagação
de erros de Stored Procedures
Agenda







Recomendações de Segurança na
utilização de ADO.NET no acesso a dados
Recomendações no Tratamento de Erros
Semântica de Transacções em ADO.NET
Boas práticas de Performance
Paginação de dados em ADO.NET
Boas práticas usando Databound
Controls
ADO.NET 1.1: Novas funcionalidades
Semântica de Transacções
Transacções Manuais

Permitem um controlo mais efectivo da
semântica transaccional

Aplicação é responsável pela transaction
recovery, concorrência, segurança, ...

Transacções manuais não são suportadas
no Distributed Transaction Coordinator
(DTC)
Semântica de Transacções
Transacções Manuais

SqlConnection.BeginTransaction inicia uma
transacção e retorna o objecto SqlTransaction
associado

Associar ao objecto da transacção todos os
comandos que queremos executar no contexto
dessa transacção

A classe SqlTransaction tem métodos para fazer
commit e rollback de transacções
Semântica de Transacções
Transacções Automáticas



Usar serviços COM+ para transacções
automáticas
Criar uma classe que herde de
ServicedComponent para obter um
componente COM+
Acrescentar o atributo [Transaction] à
classe para controlar o comportamento
transaccional
Semântica de Transacções
Transacções Automáticas

O atributo [AutoComplete] determina
“auto-magicamente” se uma transacção
deve efectuar commit ou abort


Se a execução do método termina sem erros,
a transacção é committed. Caso contrário a
transacção é abortada
Registar o componente no COM+ para ter
transacções automáticas

Assinar o componente com “strong name”
Semântica de Transacções
Níveis de isolamento




Controla a visibilidade das alterações
efectuadas numa transacção
Componentes COM+ 1.0 têm, por defeito,
o nível de isolamento Serializable
Maior nível de isolamento, dados da
transacção não são visíveis para outras
transacções até ao commit da transacção
COM+ 1.5 (Windows.NET Server) permite
configurar o isolation level
Demonstração 3
Manipulação de
Transacções
Transacções Manuais
Agenda







Recomendações de Segurança na
utilização de ADO.NET no acesso a dados
Recomendações no Tratamento de Erros
Semântica de Transacções em ADO.NET
Boas práticas de Performance
Paginação de dados em ADO.NET
Boas práticas usando Databound
Controls
ADO.NET 1.1: Novas funcionalidades
Boas práticas de Performance
Configuração da Pool de Ligações


O managed provider de SQL efectua
automaticamente a pool de ligações
baseado nas connection strings
As connection strings têm de
corresponder exactamente para estarem
na mesma pool
Boas práticas de Performance
Configuração da Pool de Ligações


Pool de ligações para provider de SQL
pode ser configurada na connection
string
Especificar os seguintes parâmetros &
valores na connection string



Max Pool Size
Min Pool Size
Não esquecer de fechar a ligação para a
fazer retornar à pool
Boas práticas de Performance
Técnicas de recolha de dados


ADO.NET disponibiliza múltiplas técnicas
de recolha de dados quando uma query é
executada
É importante ter noção dos resultados
que a query devolve para se escolher a
técnica de recolha de dados mais
apropriada
Boas práticas de Performance
Opções de execução de queries

Opções de execução:




ExecuteScalar – retorna o valor da primeira linha e
primeira coluna do result set. Útil para queries de
contagens, somas, máximos, mínimos,...
ExecuteNonQuery – retorna o número de linhas
afectadas pela execução da query. Usado com queries
de insert, update, delete ou queries DDL, que não
retornam resultados
ExecuteReader – retorna uma stream de resultados:
“forward-only” e rápido
DataAdapter.Fill – preenche o DataSet com os
resultados da query
Boas práticas de Performance
Manipulação de Blobs


ADO.NET suporta recolha e
armazenamento de binários de/para o
Data Provider
Dados binários podem ser guardados
num byte array
Boas práticas de Performance
Manipulação de DataSets



DataSets podem armazenar uma cópia
local de resultados de queries num
formato hierárquico
Aplicações clientes podem tratar um
DataSet como um SGBDR local
DataSets são especialmente úteis para
aplicações client-side com frequentes
lookups a dados
Boas práticas de Performance
Dataset Vs. Datareader




DataSets são mais pesados que DataReader
para operações de leitura simples e “forwardonly”
DataSets são mais funcionais que DataReaders
DataSets podem ser usados para armazenar
resultados de uma query e funcionar como
cache
Rich clients podem usar DataSets para evitar
round trips à base de dados e usar DataReaders
para leituras “forward-only”
Demonstração 4
Boas práticas de
Performance
Pooling de Ligações
Alternativas de recolha de dados
Manipulação de Datasets
Manipulação de BLOBs
Agenda







Recomendações de Segurança na
utilização de ADO.NET no acesso a dados
Recomendações no Tratamento de Erros
Semântica de Transacções em ADO.NET
Boas práticas de Performance
Paginação de dados em ADO.NET
Boas práticas usando Databound
Controls
ADO.NET 1.1: Novas funcionalidades
Paginação de dados em ADO.NET
Paginação de dados


User Interface paginado é melhor para grande
volume de dados
Ganhos com o acesso paginado a dados:





Menos largura de banda na rede
Maior velocidade em cada execução
Menor ocupação de memória na Base de Dados
Menor ocupação de memória na camada de
negócio
Melhor performance para queries sobre tabelas
ordenadas e indexadas em colunas unique
Paginação de dados em ADO.NET
Paginação de dados

Custos com o acesso paginado a dados:

Necessita de uma query mais elaborada

Mais esforço na Base de Dados

Mais roundtrips entre cliente e a BD
aumentando a carga em termos de queries

Concatenação de colunas é necessária para
tabelas sem uma coluna unique
Paginação de dados em ADO.NET
Paginação de dados

Stored procedure com coluna unique
CREATE PROCEDURE GetProductsPaged
@lastProductID int,
@pageSize int
AS
SET ROWCOUNT @pageSize
SELECT * FROM Products
WHERE [standard search criteria] AND
ProductID > @lastProductID
ORDER BY [Criteria that leaves ProductID
monotonically increasing]
Demonstração 5
Paginação de Dados
Utilização de Paginação de Dados
Agenda







Recomendações de Segurança na
utilização de ADO.NET no acesso a dados
Recomendações no Tratamento de Erros
Semântica de Transacções em ADO.NET
Boas práticas de Performance
Paginação de dados em ADO.NET
Boas práticas usando Databound
Controls
ADO.NET 1.1: Novas funcionalidades
Boas práticas usando Databound Controls
Comparação entre Databound Controls



Usar DataReaders para ASP.NET aceder a dados
Usar DataSets quando queremos fazer cache de
dados ou com web services
DataGrid binding é mais lento do que usar o
controlo DataRepeater (early-bound)
Boas práticas usando Databound Controls
Optimização de Databinding




Não esquecer que as ligações devem ser
fechadas (mesmo no mundo do GC)
Analisar e optimizar índices das tabelas da base
de dados
Reduzir os dados recolhidos da base de dados
ao estritamente necessário
Usar ExecuteScalar e queries com os
parametros unicamente necessários para
maximizar a performance e reduzir o tráfego da
rede
Boas práticas usando Databound Controls
Optimização de Databinding


Usar o early bound DataRepeater para recolher
dados de uma forma “forward-only” e rápida
Armazenar dados de acesso frequente numa
cache/DataSet para evitar round trips com a
base de dados
Demonstração 6
Boas práticas de Data
Binding
Utilização do Controlo Datagrid
Utilização do Controlo Datarepeater
Agenda







Recomendações de Segurança na
utilização de ADO.NET no acesso a dados
Recomendações no Tratamento de Erros
Semântica de Transacções em ADO.NET
Boas práticas de Performance
Paginação de dados em ADO.NET
Boas práticas usando Databound
Controls
ADO.NET 1.1: Novas funcionalidades
ADO.NET 1.1: Novas funcionalidades
Novos providers

ADO.NET 1.1 inclui:





SqlClient
OleDb
OracleClient novo
Odbc
novo
Não é necessário instalá-los separadamente

Framework .NET 1.1 inclui ADO.NET 1.1
ADO.NET 1.1: Novas funcionalidades
SQLClient e Partial Trust

Cenário

Uma aplicação vai ser executada em sand-boxes
partially-trusted





Internet Explorer
A partir de um share \\server\share\app.exe
A partir de um URL http://server.com/app.exe
…
Solução


SqlClient (ADO.NET 1.1)
Conceder permissões explicitamente

Microsoft .NET Framework 1.1 Configuration
ADO.NET 1.1: Novas funcionalidades
HasRows

Cenário





Foi executado um SELECT
Este pode ou não conter rows
No ADO.NET 1.0, não é possível descobrir
isso sem iniciar a leitura
Result-sets vazios podem dar problemas
com data-binding
Solução

Usar propriedade SqlDataReader.HasRows
Sumário da sessão

Nesta sessão abordámos:







Recomendações de Segurança na
utilização de ADO.NET no acesso a dados
Recomendações no Tratamento de Erros
Semântica de Transacções em ADO.NET
Boas práticas de Performance
Paginação de dados em ADO.NET
Boas práticas usando Databound Controls
ADO.NET 1.1: Novas funcionalidades
A importância da Formação Especializada
Safira lança curso em parceria com a DevelopMentor

Guerrilla Web Services.NET


Objectivo: dotar os participantes da capacidade
de compreensão da tecnologia e da aplicação das
melhores práticas, de forma eficaz e inovadora no
seu ambiente de trabalho, no desenvolvimento de
Web Services
Formadores de elevado prestígio, exclusivos da
DevelopMentor:



Aaron Skonnard
Scott Boom
Simon Horrel
fim
[email protected]
www.safira.pt
Download