Вы находитесь на странице: 1из 44

1

Linguagem de Programao Comercial


C# e ADO.NET
Acesso a Banco de Dados

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

Para manter dados desta forma em geral


so utilizados Bancos de Dados,
controlados por ferramentas chamadas
Sistemas Gerenciadores de Banco de
Dados (SGBDs)
4

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
5

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>)

A lista de campos e de valores


separada por vrgulas.
8

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

Permite obter os dados de uma


ou mais tabelas de forma conjunta
SELECT <Lista de campos e funes sobre os
campos>
FROM <Lista de tabelas>
WHERE <condies (filtros)>
GROUP BY <agrupamento dos resultados>
ORDER BY <ordenao dos resultados>
11

SQL - SELECT
Imagine a tabela abaixo (chamada TABELA_EXEMPLO):
COLUNA1

COLUNA2

COLUNA3

COLUNA4

XXX

AA

43

YYY

567

ZZZZ

CC

46

SELECT COLUNA1,COLUNA3 FROM TABELA_EXEMPLO


Ser executarmos o comando acima teremos:
COLUNA1

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

Resultaria na tabela abaixo:


MODELO_ID

MODELO

CARRO_ID

REF_MODELO

PLACA

CIVIC

ABC 2346

PEUGEOT 206

BTX 9965

Nosso comando SQL podia ser traduzido como:


Quero todas as informaes sobre os carros e
seus respectivos modelos.
15

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

Nosso comando SQL podia ser traduzido como:


Quero todas as informaes do carro com placa
BTX 9965 e de seu modelo.
16

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

A Conexo pode tambm ser implicitamente


aberta por um Data Adapter
20

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

O comando possui tambm uma


propriedade CommandText que a
string representando o comando SQL
(Insert, Update, Delete, Select) que
desejamos executar

23

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.
24

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

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 + ";
28

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

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);

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

DataSet Principais Componentes

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

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):
42

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)

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

Вам также может понравиться