Aula 8
Viso Geral
SQL
ADO.NET
Arquitetura
Classes
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
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
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.
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
7
SQL - INSERT
Permite inserir um novo registro na
tabela desejada, com um conjunto de
valores definidos para suas colunas
(atributos).
INSERT INTO <NOME DA TABELA>
(<Lista de campos a serem inseridos>)
VALUES (<Lista de valores>)
SQL - UPDATE
Permite atualizar um ou mais dados de um
registro j existente
UPDATE <NOME DA TABELA>
SET <campo 1>=<valor do campo 1>,
<campo 2> = <valor do campo 2>
WHERE <campo j existente> = <valor>
A clusula WHERE permite limitar os registros
que desejamos atualizar (filtro). Sem ela
todas as linhas da tabela so atualizadas...
9
SQL - DELETE
Permite remover um ou mais registros de
uma tabela
DELETE FROM <NOME DA TABELA>
WHERE <campo j existente> = <valor>
A clusula WHERE permite limitar os
registros que desejamos remover (filtro).
Sem ela todas as linhas da tabela so
removidas...
10
SQL - SELECT
SQL - SELECT
Imagine a tabela abaixo (chamada TABELA_EXEMPLO):
COLUNA1
COLUNA2
COLUNA3
COLUNA4
XXX
AA
43
YYY
567
ZZZZ
CC
46
COLUNA3
AA
CC
12
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
CELTA
CIVIC
PEUGEOT 206
MODELO
CARRO
CARRO_ID
REF_MODELO
PLACA
ABC 2346
BTX 9965
13
SQL - SELECT
Se executarmos o comando
SELECT * FROM MODELO, CARRO
Teremos:
MODELO_ID
MODELO
CARRO_ID
REF_MODELO
PLACA
CELTA
ABC 2346
CIVIC
ABC 2346
PEUGEOT 206
ABC 2346
CELTA
BTX 9965
CIVIC
BTX 9965
PEUGEOT 206
BTX 9965
No utilizamos o relacionamento
As informaes em cinza no fazem sentido.
14
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
MODELO
CARRO_ID
REF_MODELO
PLACA
CIVIC
ABC 2346
PEUGEOT 206
BTX 9965
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:
MODELO_ID
MODELO
PEUGEOT 206
CARRO_ID
REF_MODELO
PLACA
BTX 9965
ADO.NET
Arquitetura
17
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.
18
ADO.NET
Banco de
Dados
Command
Connection
Parameter
Data
Reader
Data
Adapter
Data Set
19
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
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=myPassw
ord;
Oracle
Provider=msdaora;Data Source=MyOracleDB;User
Id=myUsername;Password=myPassword;MySQL
MySQL
Provider=MySQLProv;Data Source=mydb;User
Id=myUsername;Password=myPassword;
21
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
22
Command
Os comandos, assim como as conexes
podem ser de dois tipos:
SqlCommand Para bancos SQL Server
OleDbCommand Para outros bancos
23
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
25
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
26
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
27
Parameter
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)
29
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
30
31
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.
32
33
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
34
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.
35
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
36
ADO.NET
Alm do ADO.NET
37
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
38
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)
39
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.
40
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
}
}
41
43
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...
44