This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
1. TREINAMENTOSDesenvolvimento Webcom ASP.NET MVC 4
6. 1 S UMRIOSobre a K19 A K19 uma empresa especializada na
capacitao de desenvolvedores de software. Sua equipe composta por
prossionais formados em Cincia da Computao pela Universidade de So
Paulo(USP) e que possuem vasta experincia em treinamento de
prossionais para rea de TI. O principal objetivo da K19 oferecer
treinamentos de mxima qualidade e relacionados s prin-cipais
tecnologias utilizadas pelas empresas. Atravs desses treinamentos,
seus alunos se tornamcapacitados para atuar no mercado de trabalho.
Visando a mxima qualidade, a K19 mantm as suas apostilas em
constante renovao e melho-ria, oferece instalaes fsicas apropriadas
para o ensino e seus instrutores esto sempre atualizadosdidtica e
tecnicamente. www.k19.com.br 1
7. S UMRIO 2Seguro Treinamento Na K19 o aluno faz o curso
quantas vezes quiser! Comprometida com o aprendizado e com a
satisfao dos seus alunos, a K19 a nica que pos-sui o Seguro
Treinamento. Ao contratar um curso, o aluno poder refaz-lo quantas
vezes desejarmediante a disponibilidade de vagas e pagamento da
franquia do Seguro Treinamento. As vagas no preenchidas at um dia
antes do incio de uma turma da K19 sero destinadas aoalunos que
desejam utilizar o Seguro Treinamento. O valor da franquia para
utilizar o Seguro Treina-mento 10% do valor total do curso.2
www.k19.com.br
8. 3 S UMRIO Termo de UsoTermo de Uso Todo o contedo desta
apostila propriedade da K19 Treinamentos. A apostila pode ser
utilizadalivremente para estudo pessoal . Alm disso, este material
didtico pode ser utilizado como materialde apoio em cursos de
ensino superior desde que a instituio correspondente seja
reconhecida peloMEC (Ministrio da Educao) e que a K19 seja citada
explicitamente como proprietria do material. proibida qualquer
utilizao desse material que no se enquadre nas condies acima semo
prvio consentimento formal, por escrito, da K19 Treinamentos. O uso
indevido est sujeito smedidas legais cabveis. www.k19.com.br 3
9. S UMRIO 4 TR EIN AM EN TR TO EIN S TREINAMENTOS AM EN TO S
Conhea os nossos cursos K01- Lgica de Programao K11 - Orientao a
Objetos em Java K12 - Desenvolvimento Web com JSF2 e JPA2 K21 -
Persistncia com JPA2 e Hibernate K22 - Desenvolvimento Web Avanado
com JFS2, EJB3.1 e CDI K23 - Integrao de Sistemas com Webservices,
JMS e EJB K31 - C# e Orientao a Objetos K32 - Desenvolvimento Web
com ASP.NET MVC www.k19.com.br/cursos4 www.k19.com.br
10. CAPTULO B ANCO DE D ADOS 1 Em geral, as aplicaes necessitam
armazenar dados de forma persistente para consult-los
pos-teriormente. Por exemplo, a aplicao de uma livraria precisa
armazenar os dados dos livros e dosautores de forma persistente.
Suponha que esses dados sejam armazenados em arquivos do sistema
operacional. Vrios fato-res importantes nos levam a descartar tal
opo. A seguir, apresentamos as principais diculdades aserem
consideradas na persistncia de dados.Segurana: O acesso s informaes
potencialmente condenciais deve ser controlado de forma que apenas
usurios e sistemas autorizados possam manipul-las.Integridade:
Restries relacionadas aos dados armazenados devem ser respeitadas
para que as in- formaes estejam sempre consistentes.Consulta: O
tempo gasto para realizar as consultas aos dados armazenados deve
ser o menor poss- vel.Concorrncia: Em geral, diversos sistemas e
usurios acessaro concorrentemente as informaes armazenadas. Apesar
disso, a integridade dos dados deve ser preservada. Considerando
todos esses aspectos, conclumos que um sistema complexo seria
necessrio parapersistir as informaes de uma aplicao de maneira
adequada. Felizmente, tal tipo de sistema jexiste e conhecido como
Sistema Gerenciador de Banco de Dados (SGBD). Figura 1.1: Sistema
Gerenciador de Banco de Dados Sistemas Gerenciadores de Banco de
DadosNo mercado, h diversas opes de sistemas gerenciadores de banco
de dados. Os mais popularesso: Oracle Database SQL Server
www.k19.com.br 1
11. B ANCO DE D ADOS 2 MySQL Server PostgreSQL SQL ServerNeste
treinamento, utilizaremos o SQL Server Express, que mantido pela
Microsoft. O SQL ServerExpress pode ser obtido a partir do site:
http://www.microsoft.com/express/Database/.Microsoft SQL Server
Management Studio Express Para interagir com o SQL Server Express,
utilizaremos um cliente com interface grca chamadode Microsoft SQL
Server Management Studio Express. Bases de Dados (Databases)Um
sistema gerenciador de banco de dados capaz de gerenciar informaes
de diversos sistemasao mesmo tempo. Por exemplo, as informaes dos
clientes de um banco, alm dos produtos de umaloja virtual ou dos
livros de uma livraria. Suponha que os dados fossem mantidos sem
nenhuma separao lgica. Implementar regrasde segurana especcas seria
extremamente complexo. Tais regras criam restries quanto ao
con-tedo que pode ser acessado por cada usurio. Por exemplo,
determinado usurio poderia ter per-misso de acesso aos dados dos
clientes do banco, mas no s informaes dos produtos da lojavirtual,
ou dos livros da livraria. Para obter uma organizao melhor, os
dados so armazenados separadamente em um SGDB.Da surge o conceito
de base de dados (database). Uma base de dados um agrupamento lgico
dasinformaes de um determinado domnio.Criando uma base de dados no
SQL Server Express Para criar uma base de dados no SQL Server
Express, utilizamos o comando CREATE DATABASE.2 www.k19.com.br
12. 3 B ANCO DE D ADOS www.k19.com.br 3
13. B ANCO DE D ADOS 4 Repare que alm da base de dados livraria
h outras bases. Essas bases foram criadas automati-camente pelo
prprio SQL Server Express para teste ou para guardar algumas
conguraes. Quando uma base de dados no mais necessria, ela pode ser
removida atravs do comandoDROP DATABASE. TabelasUm servidor de
banco de dados dividido em bases de dados com o intuito de separar
as informa-es de domnios diferentes. Nessa mesma linha de
raciocnio, podemos dividir os dados de umabase a m de agrup-los
segundo as suas correlaes. Essa separao feita atravs de tabelas.
Porexemplo, no sistema de um banco, interessante separar o saldo e
o limite de uma conta, do nome eCPF de um cliente. Ento, poderamos
criar uma tabela para os dados relacionados s contas e outrapara os
dados relacionados aos clientes. Cliente Conta nome idade cpf
numero saldo limite Jos 27 31875638735 1 1000 500 Maria 32
30045667856 2 2000 700 Tabela 1.1: Tabelas para armazenar os dados
relacionados aos clientes e s contas Uma tabela formada por
registros (linhas) e os registros so formados por campos
(colunas).Por exemplo, considere uma tabela para armazenar as
informaes dos clientes de um banco. Cadaregistro dessa tabela
armazena em seus campos os dados de um determinado cliente.Criando
tabelas no SQL Server Express As tabelas no SQL Server Express so
criadas atravs do comando CREATE TABLE. Na criao deuma tabela
necessrio denir quais so os nomes e os tipos das colunas.4
www.k19.com.br
14. 5 B ANCO DE D ADOS www.k19.com.br 5
15. B ANCO DE D ADOS 6 No SQL Server os nomes das tabelas so
precedidas pelo ID do usurio que possui a tabela. Nocaso do usurio
sa, o ID dbo. Portanto o nome da tabela Livros ca dbo.Livros. Se
uma tabela no for mais desejada ela pode ser removida atravs do
comando DROP TABLE. CRUDAs operaes bsicas para manipular os dados
persistidos so: inserir, ler, alterar e remover. Essas operaes so
realizadas atravs de uma linguagem de consulta denominada SQL
(Structu-red Query Language). Essa linguagem oferece quatro
comandos bsicos: INSERT, SELECT, UPDATE6 www.k19.com.br
16. 7 B ANCO DE D ADOSe DELETE. Esses comandos so utilizados
para inserir, ler, alterar e remover registros, respectiva-mente.
www.k19.com.br 7
17. B ANCO DE D ADOS 88 www.k19.com.br
18. 9 B ANCO DE D ADOS Chaves Primria e EstrangeiraSuponha que
os livros da nossa livraria sejam classicados por editoras. As
editoras possuem nomee telefone. Para armazenar esses dados, uma
nova tabela deveria ser criada. Nesse momento, teramos duas tabelas
(Livro e Editora). Constantemente, a aplicao da livrariadever
descobrir qual a editora de um determinado livro ou quais so os
livros de uma determinadaeditora. Para isso, os registros da tabela
Editora devem estar relacionados aos da tabela Livro. Na tabela
Livro, poderamos adicionar uma coluna para armazenar o nome da
editora dos livros.Dessa forma, se algum quiser recuperar as
informaes da editora de um determinado livro, deve www.k19.com.br
9
19. B ANCO DE D ADOS 10consultar a tabela Livro para obter o
nome da editora correspondente. Depois, com esse nome,
deveconsultar a tabela Editora para obter as informaes da editora.
Porm, h um problema nessa abordagem. A tabela Editora aceita duas
editoras com o mesmonome. Dessa forma, eventualmente, no
conseguiramos descobrir os dados corretos da editora deum
determinado livro. Para resolver esse problema, deveramos criar uma
restrio na tabela Editoraque proba a insero de editoras com o mesmo
nome. Para resolver esse problema no SQL Server Express, poderamos
adicionar a propriedade UNI-QUE no campo nome da tabela Editora.
Porm, ainda teramos mais um problema. Na tabela Li-vro, poderamos
adicionar registros vinculados a editoras inexistentes, pois no h
nenhuma relaoexplcita entre as tabelas. Para solucionar esses
problemas, devemos utilizar o conceito de chaveprimria e chave
estrangeira. Toda tabela pode ter uma chave primria, que um
conjunto de um ou mais campos que de-vem ser nicos para cada
registro. Normalmente, um campo numrico escolhido para ser a
chaveprimria de uma tabela, pois as consultas podem ser realizadas
com melhor desempenho. Ento, poderamos adicionar um campo numrico
na tabela Editora e torn-lo chave primria.Vamos chamar esse campo
de id. Na tabela Livro, podemos adicionar um campo numrico
chamadoeditora_id que deve ser utilizado para guardar o valor da
chave primria da editora correspondenteao livro. Alm disso, o campo
editora_id deve estar explicitamente vinculado com o campo id
databela Editora. Para estabelecer esse vnculo, o campo editora_id
da tabela Livro deve ser uma chaveestrangeira associada chave
primria da tabela Editora. Uma chave estrangeira um conjunto de uma
ou mais colunas de uma tabela que possuem va-lores iguais aos da
chave primria de outra tabela. Com a denio da chave estrangeira, um
livro no pode ser inserido com o valor do campoeditora_id invlido.
Caso tentssemos fazer isso, obteramos uma mensagem de erro.
Exerccios de Fixao 1 Abra o Microsoft SQL Server Management Studio
Express utilizando NOME_DA_MAQUINASQLEXPRESS como Server Name, SQL
Server Authentication como Authentication, sa como Logine sa como
Password.10 www.k19.com.br
20. 11 B ANCO DE D ADOS 2 Caso exista uma base de dados chamada
Livraria, remova-a conforme a gura abaixo: 3 Crie uma nova base de
dados chamada livraria, conforme mostrado na gura abaixo. Voc
vaiutilizar esta base nos exerccios seguintes. www.k19.com.br
11
21. B ANCO DE D ADOS 124 Crie uma tabela chamada Editoras
conforme as guras abaixo.12 www.k19.com.br
22. 13 B ANCO DE D ADOS Altere os campos para torn-los
obrigatrios, NO permitindo que eles quem em branco NU LL. Alm disso
o campo Id deve ser uma chave primria. www.k19.com.br 13
23. B ANCO DE D ADOS 14 O campo Id dever ser incrementado
automaticamente. Dena ele com a propriedade Identitysegundo a gura
abaixo:14 www.k19.com.br
24. 15 B ANCO DE D ADOS 5 Crie uma tabela chamada Livros
conforme as guras abaixo: Lembrando de NO marcar a opo ALLOW NULL.
Alm disso o campo Id deve ser uma chaveprimria e automaticamente
incrementada. Voc precisa tornar o campo EditoraId uma chave
estrangeira. Clique com o boto direito sobrea coluna EditoraId e
selecione a opo Relantioships..., conforme a gura abaixo:
www.k19.com.br 15
25. B ANCO DE D ADOS 16 Devemos acrescentar o relacionamento
entre livro e editora. Clique em Add e posteriormente noboto
direita na linha Tables and Columns Specication. Devemos informar
qual a chave primria que a coluna EditoraId da tabela Livros faz
referncia.16 www.k19.com.br
26. 17 B ANCO DE D ADOSPara isto, informe a tabela Editoras
como Primary Key Table e indique a coluna Id como a chaveprimria
referenciada. Selecione a coluna EditoraId como a coluna que ir
fazer referncia a chaveprimria da tabela Editoras. 6 Adicione
alguns registros na tabela Editoras. Veja exemplos na gura abaixo:
Adicione alguns registros na tabela Livros. Veja exemplos na gura
abaixo: www.k19.com.br 17
27. B ANCO DE D ADOS 18 7 Consulte os registros da tabela
Editoras, e em seguida consulte a tabela Livros. Veja exemploslogo
abaixo:18 www.k19.com.br
28. 19 B ANCO DE D ADOS8 Altere alguns dos registros da tabela
Livros. Veja o exemplo abaixo:9 Altere alguns dos registros da
tabela Editoras. Veja o exemplo abaixo: www.k19.com.br 19
29. B ANCO DE D ADOS 2010 Remova alguns registros da tabela
Livros. Veja o exemplo abaixo:11 Remova alguns registros da tabela
Editoras. Preste ateno para no remover uma editora quetenha algum
livro relacionado j adicionado no banco. Veja o exemplo abaixo:20
www.k19.com.br
30. 21 B ANCO DE D ADOS12 Faa uma consulta para buscar todos os
livros de uma determinada editora. Veja um exemplona gura abaixo:
www.k19.com.br 21
31. B ANCO DE D ADOS 2222 www.k19.com.br
32. CAPTULO ADO.NET 2 No captulo anterior, aprendemos que
utilizar bancos de dados uma tima alternativa paraarmazenar os
dados de uma aplicao. Entretanto, voc deve ter percebido que as
interfaces dispo-nveis para interagir com o SQL Server Express no
podem ser utilizadas por qualquer pessoa. Parautiliz-las, necessrio
conhecer a linguagem SQL e os conceitos do modelo relacional. Em
geral, asinterfaces dos outros SGDBs exigem os mesmos
conhecimentos. SELECT * FROM tbl_funcionarios WHERE nome LIKE
%jonas%; INSERT INTO tbl_funcionarios (nome, codigo, salario)
VALUES (Rafael, 1234, 1000); Figura 2.1: Usurios comuns no possuem
conhecimento sobre SQL ou sobre o modelo relacional Para resolver
esse problema, podemos desenvolver aplicaes com interfaces que no
exijam co-nhecimentos tcnicos de SQL ou do modelo relacional para
serem utilizadas. Dessa forma, usurioscomuns poderiam manipular as
informaes do banco de dados atravs dessas aplicaes. Nessaabordagem,
os usurios interagem com as aplicaes e as aplicaes interagem com os
SGDBs. www.k19.com.br Cadastro de Funcionrios Nome: Cdigo: Salrio:
Figura 2.2: Usurios comuns devem utilizar interfaces simples
www.k19.com.br 23
33. ADO.NET 24 DriverAs aplicaes interagem com os SGDBs atravs
de troca de mensagens. Os SGDBs denem o formatodas mensagens. Para
no sobrecarregar o canal de comunicao entre as aplicaes e os SGDBs,
asmensagens trocadas devem ocupar o menor espao possvel.
Geralmente, protocolos binrios somais apropriados para reduzir o
tamanho das mensagens e consequentemente diminuir a carga docanal
de comunicao. Por isso, os SGDBs utilizam protocolos binrios.
rollback find getReference persist begin getTransaction commit
10110 111000 10010 Figura 2.3: Diminuindo o tamanho das mensagens
para no sobrecarregar o meio de comunicao Mensagens binrias so
facilmente interpretadas por computadores. Por outro lado, so
com-plexas para um ser humano compreender. Dessa forma, o trabalho
dos desenvolvedores seria muitocomplexo, aumentando o custo para o
desenvolvimento e manuteno das aplicaes. 10 010 11 110 01
1011010111 11 11 11 0 0010110011 0 0010110001 01 00 01 1101011101
10 111 10 110 11 01 01 1010111101 10 01 10 1 0101101001 0 01 01 00
11 0111011100 0111011100 01 101 11 0101101001 1010111101 1 010
1101011101 0010110001 0 0010110011 1011010111 Figura 2.4: Mensagens
binrias so altamente complexas para os seres humanos Para resolver
esse problema e facilitar o desenvolvimento das aplicaes, as
empresas propriet-24 www.k19.com.br
34. 25 ADO.NETrias dos SGDBs, normalmente, desenvolvem e
distribuem drivers de conexo. Um driver de conexoatua como um
intermedirio entre as aplicaes e os SGDBs. Os drivers de conexo so
tradutores de comandos escritos em uma determinada linguagemde
programao para comandos denidos de acordo com o protocolo de um
SGDB. Utilizando umdriver de conexo, os desenvolvedores das
aplicaes no manipulam diretamente as mensagensbinrias trocadas
entre as aplicaes e os SGDBs. Mais Sobre Em alguns casos, o
protocolo binrio de um determinado SGDB fechado. Consequen-
temente, a nica maneira de se comunicar com ele atravs de um driver
de conexo oferecido pelo fabricante desse SGDB. ODBCSuponha que os
proprietrios dos bancos de dados desenvolvessem os drivers de
maneira total-mente independente. Consequentemente, cada driver
teria sua prpria interface, ou seja, seu pr-prio conjunto de
instrues. Dessa maneira, o desenvolvedor da aplicao precisa
conhecer as ins-trues de cada um dos drivers dos respectivos bancos
que ele for utilizar. Para facilitar o trabalho do desenvolvedor da
aplicao, a Microsoft deniu uma especicaochamada ODBC (Open Database
Connectivity) para padronizar a interface dos drivers de
conexo.Assim, quando uma empresa proprietria de um banco de dados
pretende desenvolver um driver,ela segue essa especicao com o
intuito de populariz-lo. Os drivers de conexo que respeitam a
especicao ODBC, ou seja, possuem um conjunto decomandos
padronizados, so chamados de drivers de conexo ODBC. ODBC
ManagerPara que drivers ODBC possam ser instalados em uma mquina e
as aplicaes consigam utiliz-los necessrio ter o ODBC Manager, que j
vem instalado no Windows. O driver de conexo ODBC j est disponvel
para utilizao, podemos consultar o ODBC Mana-ger do Windows. O ODBC
Manager pode ser executado atravs do item Ferramentas
Administrati-vas do Painel de Controle. www.k19.com.br 25
35. ADO.NET 26 Criando uma conexoCom o driver de conexo ODBC
instalado na mquina j possvel criar uma conexo com o bancode dados
correspondente. O que necessrio para estabelecer uma conexo com o
banco de dados? Escolher o driver de conexo; Denir a localizao do
banco de dados; Informar o nome da base de dados; Ter um usurio e
senha cadastrados no banco de dados. Todas essas informaes so
denidas na chamada string de conexo.1 string stringDeConexao = @ "
driver ={ SQL Server };2 server = MARCELO - PC SQLEXPRESS ;
database = livraria ; uid = sa ; pwd = sa ; " ; Cdigo C# 2.1:
Denindo a string de conexo Aps a denio da string de conexo, podemos
utilizar a classe System.Data.Odbc.OdbcConnec-tion do .NET
Framework. Essa classe responsvel por criar conexes ODBC.1
OdbcConnection conexao = new OdbcConnection ( stringDeConexao ) ;
Cdigo C# 2.2: Criando uma conexo ODBC Inserindo
registrosEstabelecida a conexo com o banco de dados, j podemos
executar comandos. Por exemplo, pos-svel inserir registros nas
tabelas. O primeiro passo para executar um comando deni-lo em
lin-guagem SQL de acordo com a sintaxe do SGDB utilizado.26
www.k19.com.br
36. 27 ADO.NET1 string textoDoComando = @ " INSERT INTO
Editoras ( Nome , Email )2 VALUES ( Abril , abril@email . com ) ; "
; Mais Sobre O caractere @ antes de um valor literal do tipo string
indica que os caracteres dentro da string no devem ser processados
como caracteres especiais. Em seguida, devemos criar um objeto da
classe System. Data.Odbc.OdbcCommand a partir docdigo sql e da
conexo previamente criados. O comando no executado quando os
objetos dessaclasse so instanciados.1 OdbcCommand comando = new
OdbcCommand ( textoDoComando , conexao ) ; Cdigo C# 2.4: Criando um
comando ODBC Por m, o comando pode ser executado atravs do mtodo
ExecuteNonQuery(). A conexo deveser aberta antes de executar o
comando.1 conexao . Open () ;2 comando . ExecuteNonQuery () ;
Importante A mesma conexo pode ser reaproveitada para executar
vrias operaes. Quando no houver mais operaes a serem executadas,
devemos nalizar a conexo ODBC atravsdo mtodo Close(). Finalizar as
conexes ODBC que no so mais necessrias importantepois libera
recursos no SGBD. 1 conexao . close () ; Cdigo C# 2.6: Finalizando
uma conexo ODBC Mais Sobre Em C#, para evitar que o uma conexo no
seja fechada aps a sua utilizao, podemos aplicar um bloco using. 1
using ( OdbcConnection conexao = new OdbcConnection (
stringDeConexao ) ) 2 { 3 // utiliza a conexao 4 } Cdigo C# 2.7:
Utilizando um bloco usingNo cdigo acima, quando o bloco using que
est associado conexo ODBC terminar, automa-ticamente, essa conexo
ser fechada. Exerccios de Fixao www.k19.com.br 27
37. ADO.NET 28 1 Crie um projeto do tipo Console Application no
Microsoft Visual C# Express, chamadoODBC. 2 Crie uma classe chamada
InsereEditora no projeto ODBC para inserir registros na tabela
Edi-toras. 1 using System . Data . Odbc ; 2 3 namespace Odbc 4 { 5
class InsereEditora 6 { 7 static void Main ( string [] args ) 8 { 9
string stringDeConexao = @ " driver ={ SQL Server };10 server =
MARCELO - PC SQLEXPRESS ; database = livraria ; uid = sa ; pwd = sa
; " ;1112 System . Console . Write ( " Digite o Nome da Editora : "
) ;13 string nome = System . Console . ReadLine () ;1415 System .
Console . Write ( " Digite o Email da Editora : " ) ;16 string
email = System . Console . ReadLine () ;1718 string
textoInsereEditora =19 @ " INSERT INTO Editoras ( Nome , Email )20
VALUES ( " + nome + @ " , " + email + @ " ) " ;2122 using (
OdbcConnection conexao = new OdbcConnection ( stringDeConexao ) )23
{24 OdbcCommand command = new OdbcCommand ( textoInsereEditora ,
conexao ) ;25 conexao . Open () ;26 command . ExecuteNonQuery ()
;27 }28 }29 }30 } Cdigo C# 2.8: InsereEditora.cs Exerccios
Complementares 1 Crie uma classe chamada InsereLivro no projeto
ODBC para inserir registros na tabela Livros. SQL InjectionA
implementao da insero de registros feita anteriormente possui uma
falha grave. Os dados ob-tidos do usurio atravs do teclado no so
tratados antes de serem enviados para o SGDB. Esses dados podem
conter caracteres especiais. Se esses caracteres no so tratados, o
compor-tamento esperado da operao afetado. Eventualmente, registros
no so inseridos como deveriamou brechas de segurana podem se abrir.
Por exemplo, considere a classe InsereEditora do exerccio de xao.
Se o usurio digitarOReilly e [email protected], o cdigo SQL gerado
pela aplicao seria:1 INSERT INTO Editoras ( nome , email ) VALUES (
O Reilly , oreilly@email . com )28 www.k19.com.br
38. 29 ADO.NET Observe que o caractere aspas simples aparece
cinco vezes no cdigo SQL acima. O SGDB nosaberia dizer onde de fato
termina o nome da editora. Ao tentar executar esse cdigo, um erro
desintaxe lanado pelo SQL Server. Para resolver esse problema
manualmente, devemos adicionardois caracteres seguidos.1 INSERT
INTO Editoras ( nome , email ) VALUES ( O Reilly , oreilly@email .
com ) Os valores recebidos dos usurios devem ser analisados e os
caracteres especiais contidos nessesvalores devem ser tratados.
Esse processo extremamente trabalhoso, pois o conjunto de
caracteresespeciais e a forma de trat-los diferente em cada SGDB. A
responsabilidade do tratamento dos caracteres especiais contidos
nos valores de entrada dosusurios pode ser repassada para os
drivers ODBC. Dessa forma, o cdigo das aplicaes se
tornaindependente das particularidades desse processo para cada
SGDB. Mais Sobre O processo de tratamento dos caracteres especiais
das entradas dos usurios denomi- nado sanitize. 1 // pegando os
dados da editora pelo teclado 2 string nome = System . Console .
ReadLine () ; 3 string email = System . Console . ReadLine () ; 4 5
// definindo a sentena SQL com parmetros 6 string textoDoComando =
7 @ " INSERT INTO Editoras ( Nome , Email ) VALUES (? , ?) ; " ; 8
9 // criando um comando odbc10 OdbcCommand comando = new
OdbcCommand ( textoDoComando , conexao ) ;1112 // atribuindo
valores aos parmetros13 comando . Parameters . AddWithValue ( "
@Nome " , nome ) ;14 comando . Parameters . AddWithValue ( " @Email
" , email ) ; Cdigo C# 2.12: Sanitizando as entradas dos usurios
Observe que a sentena SQL foi denida com parmetros atravs do
caractere ?. Antes de exe-cutar o comando, necessrio atribuir
valores aos parmetros. Isso feito com o mtodo AddWith-Value(). Esse
mtodo realiza a tarefa de sanitizar os valores enviados pelo
usurio. Exerccios de Fixao 3 Tente causar um erro de SQL Injection
ao inserir editoras com a classe InsereEditora. (Dica:tente
entradas com aspas simples) 4 Altere o cdigo da classe
InsereEditora para eliminar o problema do SQL Injection. Observe
ocdigo abaixo:1 using System . Data . Odbc ;23 namespace Odbc4 {5
class InsereEditora www.k19.com.br 29
39. ADO.NET 30 6 { 7 static void Main ( string [] args ) 8 { 9
string stringDeConexao = @ " driver ={ SQL Server };10 server =
MARCELO - PC SQLEXPRESS ; database = livraria ; uid = sa ; pwd = sa
; " ;1112 System . Console . Write ( " Digite o Nome da Editora : "
) ;13 string nome = System . Console . ReadLine () ;1415 System .
Console . Write ( " Digite o Email da Editora : " ) ;16 string
email = System . Console . ReadLine () ;1718 string
textoInsereEditora =19 @ " INSERT INTO Editoras ( Nome , Email )
VALUES (? ,?) " ;2021 using ( OdbcConnection conexao = new
OdbcConnection ( stringDeConexao ) )22 {23 OdbcCommand command =
new OdbcCommand ( textoInsereEditora , conexao ) ;2425 command .
Parameters . AddWithValue ( " @Nome " , nome ) ;26 command .
Parameters . AddWithValue ( " @Email " , email ) ;2728 conexao .
Open () ;29 command . ExecuteNonQuery () ;30 }31 }32 }33 } Cdigo C#
2.13: InsereEditora.cs 5 Agora tente causar novamente o problema de
SQL Injection ao inserir novas editoras. Exerccios Complementares 2
Provoque um erro de SQL Injection na classe InsereLivro. (Dica:
tente entradas com aspassimples.) 3 Altere o cdigo para eliminar o
problema do SQL Injection. 4 Agora tente causar novamente o
problema de SQL Injection ao inserir novos livros. Listando
registrosDepois de inserir alguns registros, interessante consultar
os dados das tabelas para conferir se a in-sero foi realizada com
sucesso. O processo para executar um comando de consulta parecido
com o de insero. necessriodenir a sentena SQL e criar um objeto da
classe OdbcCommand.1 // definindo a sentena SQL2 string
textoDoComando = @ " SELECT * FROM Editoras ; " ;34 // criando um
comando odbc5 OdbcCommand comando = new OdbcCommand (
textoDoComando , conexao ) ; Cdigo C# 2.15: Criando um comando de
seleo A diferena que para executar um comando de consulta necessrio
utilizar o mtodo Execu-30 www.k19.com.br
40. 31 ADO.NETteReader() ao invs do ExecuteNonQuery(). Esse
mtodo devolve um objeto da classe
System.Da-ta.Odbc.OdbcDataReader.1 OdbcDataReader resultado =
comando . ExecuteReader () ; Cdigo C# 2.16: Executando um comando
de consulta Os dados contidos no OdbcDataReader podem ser acessados
atravs dos nomes das colunas.1 string nome = resultado [ " Nome " ]
as string ;2 string email = resultado [ " Email " ] as string ;
Cdigo C# 2.17: Recuperando os campos do primeiro registro do
resultado O cdigo acima mostra como os campos do primeiro registro
do resultado da consulta so recu-perados. Agora, para recuperar os
outros registros necessrio avanar o OdbcDataReader atravsdo mtodo
Read().1 string nome1 = resultado [ " nome " ] as string ;2 string
email1 = resultado [ " email " ] as string ;34 resultado . Read ()
;56 string nome2 = resultado [ " nome " ] as string ;7 string
email2 = resultado [ " email " ] as string ; Cdigo C# 2.18:
Recuperando os campos dos dois primeiros registros do resultado O
prprio mtodo Read() devolve um valor booleano para indicar se o
reader conseguiu avanarpara o prximo registro. Quando esse mtodo
devolver false signica que no h mais registrospara serem
recuperados.1 while ( resultado . Read () )2 {3 string nome =
resultado [ " nome " ] as string ;4 string email = resultado [ "
email " ] as string ;5 } Cdigo C# 2.19: Recuperando os campos de
todos os registros do resultado Exerccios de Fixao 6 Insira algumas
editoras utilizando a classe InsereEditora que voc criou nos
exerccios anteri-ores. 7 Adicione uma nova classe ao projeto ODBC
chamada ListaEditora. O objetivo listar as edi-toras que foram
salvas no banco. Veja o cdigo dessa classe.1 using System . Data .
Odbc ;23 namespace Odbc4 {5 class ListaEditora6 {7 static void Main
( string [] args )8 { www.k19.com.br 31
41. ADO.NET 32 9 string stringDeConexao = @ " driver ={ SQL
Server };10 server = MARCELO - PC SQLEXPRESS ; database = livraria
; uid = sa ; pwd = sa ; " ;1112 using ( OdbcConnection conexao =
new OdbcConnection ( stringDeConexao ) )13 {14 string
textoListaEditora = " SELECT * FROM Editoras " ;15 OdbcCommand
command = new OdbcCommand ( textoListaEditora , conexao ) ;16
conexao . Open () ;17 OdbcDataReader resultado = command .
ExecuteReader () ;1819 while ( resultado . Read () )20 {21 long ?
id = resultado [ " Id " ] as long ?;22 string nome = resultado [ "
Nome " ] as string ;23 string email = resultado [ " Email " ] as
string ;24 System . Console . WriteLine ( " {0} : {1} - {2} n " ,id
, nome , email ) ;25 }26 }27 }28 }29 } Cdigo C# 2.20:
ListaEditora.cs Exerccios Complementares 5 Crie uma classe para
listar os livros cadastrados na base de dados. Connection Factory
Voc deve ter percebido que para cada ao executada no banco de
dados, ns precisamos criaruma conexo. Isso gera um problema
relacionado string de conexo car armazenada em diversoslocais.
Imagine que o driver do banco foi atualizado e mudamos a sua verso.
Isso implicaria fa-zer diversas alteraes no cdigo em cada ocorrncia
da string de conexo, tornando o cdigo maissuscetvel a erros e
dicultando a sua manuteno. Para resolver esta situao, ns poderamos
criar uma classe responsvel pela criao e distri-buio de conexes,
mantendo assim uma nica referncia para a string de conexo, e
qualqueralterao no modo em que nos conectamos base de dados, s
implica mudanas nesta classe. 1 static class ConnectionFactory 2 {
3 public static OdbcConnection CreateConnection () 4 { 5 string
driver = @ " SQL Server " ; 6 string servidor = @ " MARCELO - PC
SQLEXPRESS " ; 7 string baseDeDados = @ " livraria " ; 8 string
usuario = @ " sa " ; 9 string senha = @ " sa " ;1011 StringBuilder
connectionString = new StringBuilder () ;12 connectionString .
Append ( " driver = " ) ;13 connectionString . Append ( driver )
;14 connectionString . Append ( " ; server = " ) ;15
connectionString . Append ( servidor ) ;16 connectionString .
Append ( " ; database = " ) ;17 connectionString . Append (
baseDeDados ) ;18 connectionString . Append ( " ; uid = " ) ;32
www.k19.com.br
42. 33 ADO.NET19 connectionString . Append ( usuario ) ;20
connectionString . Append ( " ; pwd = " ) ;21 connectionString .
Append ( senha ) ;2223 return new OdbcConnection ( connectionString
. ToString () ) ;24 }25 } Cdigo C# 2.22: ConnectionFactory.cs Agora
podemos obter uma nova conexo apenas chamando
ConnectionFactory.CreateConnection().O resto do sistema no precisa
mais conhecer os detalhes sobre a conexo com o banco de
dados,diminuindo o acoplamento da aplicao. Exerccios de Fixao 8
Adicione uma nova classe chamada ConnectionFactory com seguinte
cdigo: 1 using System ; 2 using System . Data . Odbc ; 3 using
System . Text ; 4 5 namespace Odbc 6 { 7 static class
ConnectionFactory 8 { 9 public static OdbcConnection
CreateConnection ()10 {11 string driver = @ " SQL Server " ;12
string servidor = @ " MARCELO - PC SQLEXPRESS " ;13 string
baseDeDados = @ " livraria " ;14 string usuario = @ " sa " ;15
string senha = @ " sa " ;1617 StringBuilder connectionString = new
StringBuilder () ;18 connectionString . Append ( " driver = " ) ;19
connectionString . Append ( driver ) ;20 connectionString . Append
( " ; server = " ) ;21 connectionString . Append ( servidor ) ;22
connectionString . Append ( " ; database = " ) ;23 connectionString
. Append ( baseDeDados ) ;24 connectionString . Append ( " ; uid =
" ) ;25 connectionString . Append ( usuario ) ;26 connectionString
. Append ( " ; pwd = " ) ;27 connectionString . Append ( senha )
;2829 return new OdbcConnection ( connectionString . ToString () )
;30 }31 }32 } Cdigo C# 2.23: ConnectionFactory.cs 9 Altere as
classes InsereEditora e ListaEditora para que elas utilizem a
fbrica de conexo.Execute-as novamente.1 using System . Data . Odbc
;23 namespace Odbc4 {5 class InsereEditora6 { www.k19.com.br
33
43. ADO.NET 34 7 static void Main ( string [] args ) 8 { 9
System . Console . Write ( " Digite o Nome da Editora : " ) ;10
string nome = System . Console . ReadLine () ;1112 System . Console
. Write ( " Digite o Email da Editora : " ) ;13 string email =
System . Console . ReadLine () ;1415 string textoInsereEditora =16
@ " INSERT INTO Editoras ( Nome , Email ) VALUES (? ,?) " ;1718
using ( OdbcConnection conexao = ConnectionFactory .
CreateConnection () )19 {20 OdbcCommand command = new OdbcCommand (
textoInsereEditora , conexao ) ;2122 command . Parameters .
AddWithValue ( " @Nome " , nome ) ;23 command . Parameters .
AddWithValue ( " @Email " , email ) ;2425 conexao . Open () ;26
command . ExecuteNonQuery () ;27 }28 }29 }30 } Cdigo C# 2.24:
InsereEditora.cs 1 using System . Data . Odbc ; 2 3 namespace Odbc
4 { 5 class ListaEditora 6 { 7 static void Main ( string [] args )
8 { 9 using ( OdbcConnection conexao = ConnectionFactory .
CreateConnection () )10 {11 string textoListaEditora = " SELECT *
FROM Editoras " ;12 OdbcCommand command = new OdbcCommand (
textoListaEditora , conexao ) ;13 conexao . Open () ;14
OdbcDataReader resultado = command . ExecuteReader () ;1516 while (
resultado . Read () )17 {18 long ? id = resultado [ " Id " ] as
long ?;19 string nome = resultado [ " Nome " ] as string ;20 string
email = resultado [ " Email " ] as string ;21 System . Console .
WriteLine ( " {0} : {1} - {2} n " ,id , nome , email ) ;22 }23 }24
}25 }26 } Cdigo C# 2.25: ListaEditora.cs Exerccios Complementares 6
Altere as classes InsereLivro e ListaLivro para que elas utilizem a
fbrica de conexo. Execute-as novamente.34 www.k19.com.br
44. 35 ADO.NET Desaos1 Implemente um teste que remove uma
editora pelo id.2 Implemente um teste que altera os dados de uma
editora pelo id. www.k19.com.br 35
45. ADO.NET 3636 www.k19.com.br
46. CAPTULO E NTITY F RAMEWORK 3 Mltiplas sintaxes da linguagem
SQL No captulo anterior, utilizamos conexes ODBC para fazer uma
aplicao C# interagir com osSGDBs. Nessa interao, as consultas so
denidas com a linguagem SQL. A sintaxe dessa linguagem diferente em
cada SGDB. Dessa forma, a complexidade do trabalho dos
desenvolvedores aumenta.Para resolver esse problema, as consultas
deveriam ser denidas atravs de um mecanismo indepen-dente da
linguagem SQL. SELECT TOP 100 * FROM livros ORDER BY autor ASC
Driver SQL Server ODBC SELECT * FROM ( SELECT ROW_NUMBER() OVER
(ORDER BY autor ASC) AS rownumber, id, titulo, autor FROM livros )
WHERE rownumber