Post on 17-Nov-2015
description
1
2
Linguagem de Programao Comercial
C# e ADO.NET
Acesso a Banco de Dados
3
Aula 8
Viso Geral
SQL
ADO.NET
Arquitetura
Classes
4
Viso Geral
A maior parte das aplicaes necessitam manter dados Persistente As informaes so mantidas
mesmo quando a aplicao que as utiliza/mantm termina
Eficiente As informaes devem ser armazenadas e posteriormente recuperadas de forma rpida
Para manter dados desta forma em geral so utilizados Bancos de Dados, controlados por ferramentas chamadas Sistemas Gerenciadores de Banco de Dados (SGBDs)
5
Viso Geral
Tabelas Estruturas que compes o banco de dados formada por linhas e colunas Linhas (Tuplas) representam uma instncia da
informao (registro) representada pela tabela
Colunas representam os diversos atributos da informao representada pela tabela
Chave a informao composta por um ou mais atributos (coluna) que garante a unicidade de um registro em uma tabela Primria a chave que define a unicidade de
um registro em uma tabela
Estrangeira o relacionamento de um ou mais campos de uma tabela com a chave primria de outra tabela
6
Viso Geral
Relacionamento Indica a associao entre entidades distintas no banco. Um para Um (1:1) Relao unvoca entre as
tabelas. Neste caso decide-se qual tabela ter uma chave estrangeira para a outra
Um para muitos (1:N) Um registro associa-se a N outros. Neste caso a tabela do lado N possui uma chave estrangeira para a tabela onde existe 1 registro
Muitos para muitos (M:N) Relao com multiplicidade de ambos os lados. implementada usando-se uma tabela auxiliar.
7
SQL
Structured Query Language - Linguagem de Consultas Estruturada
Linguagem para :
Definir Dados (criar e manter tabelas)
Manipular Dados (inserir, atualizar e remover registros)
Consultar Dados (buscar dados na forma desejada)
Definir o escopo de uma transao no banco
8
SQL - INSERT
Permite inserir um novo registro na tabela desejada, com um conjunto de valores definidos para suas colunas (atributos).
INSERT INTO () VALUES ()
A lista de campos e de valores separada por vrgulas.
9
SQL - UPDATE
Permite atualizar um ou mais dados de um registro j existente
UPDATE
SET =,
=
WHERE =
A clusula WHERE permite limitar os registros que desejamos atualizar (filtro). Sem ela
todas as linhas da tabela so atualizadas...
10
SQL - DELETE
Permite remover um ou mais registros de uma tabela
DELETE FROM
WHERE =
A clusula WHERE permite limitar os registros que desejamos remover (filtro).
Sem ela todas as linhas da tabela so
removidas...
11
SQL - SELECT
Permite obter os dados de uma ou mais tabelas de forma conjunta
SELECT
FROM
WHERE
GROUP BY
ORDER BY
12
SQL - SELECT
Imagine a tabela abaixo (chamada TABELA_EXEMPLO):
SELECT COLUNA1,COLUNA3 FROM TABELA_EXEMPLO
Ser executarmos o comando acima teremos:
COLUNA1 COLUNA2 COLUNA3 COLUNA4
1 XXX AA 43
5 YYY B 567
9 ZZZZ CC 46
COLUNA1 COLUNA3
1 AA
5 B
9 CC
13
SQL - SELECT
Quando colocamos mais de uma tabela na clusula FROM temos a combinao de todas as linhas das tabelas (produto cartesiano)
Imaginemos as seguintes tabelas:
MODELO_ID MODELO
1 CELTA
2 CIVIC
3 PEUGEOT 206
CARRO_ID REF_MODELO PLACA
1 2 ABC 2346
2 3 BTX 9965
MODELO CARRO
14
SQL - SELECT
Se executarmos o comando
SELECT * FROM MODELO, CARRO
Teremos:
No utilizamos o relacionamento
As informaes em cinza no fazem sentido.
MODELO_ID MODELO CARRO_ID REF_MODELO PLACA
1 CELTA 1 2 ABC 2346
2 CIVIC 1 2 ABC 2346
3 PEUGEOT 206 1 2 ABC 2346
1 CELTA 2 3 BTX 9965
2 CIVIC 2 3 BTX 9965
3 PEUGEOT 206 2 3 BTX 9965
15
SQL - SELECT
Podemos utilizar a clusula WHERE para filtrar as combinaes que nos interessam (s trazer as linhas que respeitam a condio)
Por exemplo:
SELECT *
FROM MODELO,CARRO
WHERE MODELO_ID = REF_MODELO
Resultaria na tabela abaixo:
Nosso comando SQL podia ser traduzido como: Quero todas as informaes sobre os carros e seus respectivos modelos.
MODELO_ID MODELO CARRO_ID REF_MODELO PLACA
2 CIVIC 1 2 ABC 2346
3 PEUGEOT 206 2 3 BTX 9965
16
SQL - SELECT
Podemos ter clusulas WHERE ainda mais complexas, compostas de vrias expresses unidas por AND (E) e OR (OU)
Por exemplo:
SELECT *
FROM MODELO,CARRO
WHERE MODELO_ID = REF_MODELO
AND PLACA=BTX 9965
Resultaria na tabela abaixo:
Nosso comando SQL podia ser traduzido como: Quero todas as informaes do carro com placa BTX 9965 e de seu modelo.
MODELO_ID MODELO CARRO_ID REF_MODELO PLACA
3 PEUGEOT 206 2 3 BTX 9965
17
ADO.NET
Arquitetura
18
ADO.NET
um conjunto de classes que possibilitam a comunicao de aplicaes .NET com
bancos de dados e outras formas de
persistir dados (ex: XML)
Pode trabalhar de duas formas:
Conectada A cada comando executado no banco a aplicao se conecta ao banco e faz
o que for necessrio
Desconectada A aplicao se conecta ao banco, traz as informaes para memria e
trabalha com elas assim. De tempos em
tempos se conecta ao banco para atualizar as
informaes neste.
19
Data Set
ADO.NET
Banco de
Dados Connection Command Parameter
Data
Reader
Data
Adapter
20
Connection
a classe que prov a conectividade com o banco de dados
Pode ser de dois tipos:
SqlConnection conexo com bancos SQL Server
OleDbConnection conexo com outros bancos
Mtodos importantes
Open() conecta-se ao banco de dados
Close() desconecta-se do banco de dados
A Conexo pode tambm ser implicitamente aberta por um Data Adapter
21
Connection
Para fazer a conexo com o banco o objeto connection recebe uma string com vrios parmetros relativos a conexo. Esta chamada de Connection String
Esta string varia de banco para banco: SQL Server Provider=SQLNCLI;Server=myServerAddress;Datab
ase=myDataBase;Uid=myUsername;Pwd=myPassword;
Oracle Provider=msdaora;Data Source=MyOracleDB;User
Id=myUsername;Password=myPassword;MySQL
MySQL Provider=MySQLProv;Data Source=mydb;User
Id=myUsername;Password=myPassword;
22
Command
Esta classe representa um comando SQL
Este comando se acopla a uma conexo para ser executado em um banco de
dados
Um comando pode ser criado de duas formas
Utilizar o mtodo CreateCommand do objeto Connection
Instanciar um novo comando (com new) e definir sua propriedade Connection como
sendo a conexo que ser utilizada
23
Command
Os comandos, assim como as conexes podem ser de dois tipos:
SqlCommand Para bancos SQL Server
OleDbCommand Para outros bancos
O comando possui tambm uma propriedade CommandText que a
string representando o comando SQL
(Insert, Update, Delete, Select) que
desejamos executar
24
Command Executando os comandos
Existem diversos mtodos para executar diferentes comandos: ExecuteScalar() Retorna o valor da primeira
coluna, da primeira linha retornada pela consulta. til para consultas (SELECTs) que retornam apenas um valor (Ex: SELECT COUNT(*) FROM CARRO)
ExecuteNonQuery() Executa comandos SQL que no so consultas (INSERT, UPDATE,DELETE, CREATE), retornando o nmero de linhas afetadas pelo comando
ExecuteDataReader() Executa uma consulta e traz como resultado um objeto DataReader que contm os dados retornados pela consulta.
25
DataReader
Maneira mais simples de ler resultados de uma consulta ao banco
Permite apenas a leitura seqencial (para frente) do resultado
Propriedades: FieldCount - nmero de colunas da linha que
est sendo processada
IsClosed indica se o reader est aberto para leitura ou j foi fechado
RecordsAffected Nmero de registros afetados pelo comando realizado
26
DataReader
Mtodos:
Read() Avana para a prxima linha do resultado obtido
GetName(int i) Obtm o nome da i-sima coluna da linha em que estamos
GetValue(int i) Obtm o valor da i-sima coluna da linha em que estamos
IsDBNull(int i) Verifica se a i-sima coluna da linha atual est vazia no banco (null)
Close() fecha (termina o uso) deste Reader
27
Parameter
Muitas vezes queremos definir dinamicamente parte de nosso comando SQL
Imagine o exemplo de obter os dados do carro pela placa:
SELECT *
FROM MODELO,CARRO
WHERE MODELO_ID = REF_MODELO
AND PLACA=BTX 9965
28
Parameter
Se quisermos definir a placa a ser consultada partir de um campo
de texto da interface poderiamos
fazer algo como:
command.CommandText = "SELECT * FROM MODELO,CARRO WHERE MODELO_ID =
REF_MODELO AND PLACA= " +
txbPlaca.Text + ";
29
Parameter
Porm este tipo de abordagem possui problemas:
Imagine um usurio mal intecionado
Imagine que ele possua algum conhecimento de SQL
Este usurio pode colocar um texto malicioso no campo txbPlaca (ex: algo
como XXX; DELETE * FROM CARRO) que afete
no s o valor, mas o comportamento da
consulta
Isto uma falha de segurana conhecida chamada SQL Injection (Incluso de SQL)
30
Parameter
Para evitar este tipo de problema possvel definir parmetros nas consultas
Os parmetros so substitudos por valores definidos de uma forma segura,
sem alterar a estrutura da query ( o
parmetro ocupar apenas a sua devida
posio na query)
A classe Parameter como as outras classes do ADO.NET existe em dois tipos:
SqlParameter Parmetros para SQL Server
OleDbParameter Para outros bancos
31
Parameter Como Utilizar
comandoSQL.CommandText = "SELECT * FROM
MODELO,CARRO WHERE MODELO_ID
=REF_MODELO AND PLACA=@Placa";
SqlParameter parametro = new SqlParameter();
parametro.ParameterName=@Placa;
parametro.Value = txbPlaca.Text;
comandoSQL.Parameters.Add(parametro);
32
DataSet
uma representao desconectada de parte de um ou mais bancos de dados
Isto significa que aps obter os dados do banco o DataSet se desconecta deste e
mantm os dados em memria
(permitindo l-los ou alter-los)
Em um momento posterior o DataSet se reconecta ao banco e atualiza este com
os seus dados alterados.
33
DataSet Principais Componentes
34
DataSet
Um DataSet precisa de uma maneira para traduzir as suas tabelas para o
banco de dados e vice versa quando se
conectam
Esta responsabilidade cabe a um ou mais DataAdapters
35
DataAdapter
uma ponte de ligao entre o DataSet e o banco de dados ou outra fonte de
dados
Possui referncias a conexo e a um grupo de comandos SQL que sero
utilizados na obteno, atualizao,
insero e remoo de dados do banco
O Adapter pode receber no construtor a conexo que dever utilizar com o
banco de dados.
36
DataAdapter
Propriedades:
SelectCommand, InsertCommand, DeleteCommand, UpdateCommand
comandos que sero utilizados pelo Adapter
Mtodos
Fill(DataSet dataSet,String nomeTabela) preenche a tabela nomeTabela no data set
usando a consulta definida em
SelectCommand
Update(DataSet dataSet,String nomeTabela) atualiza o banco de dados com os dados da
tabela nomeTabela do data set
37
ADO.NET
Alm do ADO.NET
38
Transaes
Muitas vezes precisamos executar um conjunto de operaes relacionadas em um banco de dados
Se algumas dessas operaes no forem efetuadas podemos ter informaes inconsistentes no final da
execuo
Um exemplo comum uma transferncia bancria onde sacamos de uma conta A uma quantia X e a
depositamos na conta B. Ao terminar devemos ter
na conta A seu valor X e na conta B seu valor +X
Se uma destas operaes no for executada os valores finais no sero como esperados e temos
um cenrio inconsistente com a operao
realizada
39
Transaes
Para evitar estes problemas existe o conceito de transao
Uma transao define um escopo de execuo onde ou todas as operaes so executadas
com sucesso ou, se ocorrer um erro em pelo
menos um dos passos o sistema volta todas as
operaes feitas para o seu estado anterior
(rollback)
Desta forma ou estamos em um estado consistente final (se todas as operaes foram
feitas) ou no estado consistente inicial (onde
nenhuma das operaes foi realizada)
40
Transaes
A plataforma .Net disponibiliza uma classe TransactionScope para manter
uma transao
Utilizando-se de uma ferramenta do Windows (MSDTC Microsoft Distributed
Transaction Coordinator Coordenador
de Transaes Distribuidas) possvel
inclusive manter o contexto de uma
transao entre bancos distintos.
41
Transaes - Exemplo
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
{
try
{
//Aqui vo as operaes que queremos fazer dentro da transao
...
//Se chegou aqui podemos fechar a transao com sucesso
//Estamos no estado consistente final
scope.Complete();
}
catch (Exception ex)
{
//Ocorreu algum erro! Como no chegamos ao comando //scope.Complete() voltamos automaticamente ao estado //inicial
}
}
42
Mapeadores Objeto X Relacional
Aplicaes C# e Java - Orientadas a Objetos
Bancos de Dados Modelo Relacional
Devido a esta diferena em geral precisamos mapear as entidades do
banco para os objetos utilizados pelas
nossas aplicaes e depois mapear estas
de volta para o banco para atualiz-lo.
Este um trabalho em geral repetitivo (a estrutura do cdigo muda muito pouco):
43
Mapeadores Objeto X Relacional
Para facilitar este trabalho existem algumas bibliotecas (frameworks) que
podem ser utilizadas em conjunto com a
aplicao para fazer parte deste
trabalho para ns.
Os mais conhecidos so:
Hibernate (Java) e NHibernate (.NET)
IBatis (Java) e IBatis.NET (.NET)
44
LINQ
Sigla para Language Integrated Query (Linguagem Integrada de Consulta)
Surgiu na verso 3.5 da plataforma .NET. Suportado pelo Visual Studio 2008
Possibilita utilizar uma linguagem prpria de consulta de dados(com alguma
similaridade com SQL) que pode ser
utilizada contra bancos de dados,
arquivos XML e estruturas da linguagem,
como Listas e Dicionrios...