Beruflich Dokumente
Kultur Dokumente
NET
3.5: Acesso a dados e
recursos Avanados
MDULO III
Ateno: O material deste mdulo est disponvel apenas como parmetro de estudos para
este Programa de Educao Continuada. proibida qualquer forma de comercializao do
mesmo. Os crditos do contedo aqui contido so dados aos seus respectivos autores
descritos na Bibliografia Consultada.
MDULO III
Acesso a Dados
A no ser que seu ramo de negcios seja algo muito especfico, a imensa maioria
das aplicaes que voc criar durante sua vida como desenvolvedor de software ter que,
de alguma forma, alterar ou consultar dados. Na maior parte das aplicaes este ,
inclusive, o item mais sensvel e importante: um modelo de acesso a dados mal planejado
ou mal dimensionado pode tornar qualquer aplicao intil. Existe uma grande variedade
de sistemas de gerenciamento de dados no mercado. Se tivssemos que desenvolver
rotinas de consultas e alteraes de dados para cada produto diferente do mercado
teramos uma grande dor de cabea. Felizmente, a Microsoft deixou tudo pronto: seu
modelo de acesso a dados, o ADO.NET, abstrai as nuances de programao de cada
sistema, tornando o acesso a dados uma tarefa bem mais simples.
O ADO.NET, acrnimo de ActiveX Data Objects, o modelo de acesso a dados
lanado junto com a plataforma .NET. Seu grande diferencial com relao a modelos
anteriores a capacidade de trabalhar com dados sem manter uma conexo permanente
com a fonte de informaes. Vou explicar melhor: Nos modelos anteriores, a aplicao
abria uma conexo, executava uma ou mais operaes na base de dados e ento a
conexo era encerrada. O modelo ADO.NET muda este paradigma: a conexo aberta,
os dados so recuperados e ento a conexo encerrada, operaes so realizadas
sobre os dados, a conexo novamente aberta, as alteraes so enviadas para a base
de dados e ento outra vez conexo encerrada. Note que a grande diferena que
toda e qualquer operao na base de dados pode ser feita sem que seja mantida uma
conexo aberta com a base de dados. Este modelo, como voc deve estar imaginando,
foi criado pensando na programao de aplicao para a Internet.
Nosso curso sobre acesso a dados em .NET ser dividido em duas partes
principais: inicialmente vamos estudar o acesso a dados de forma declarativa, onde
vamos instanciar conexes, objetos de comando, parmetros, definir propriedades,
mtodos e eventos, construir instrues SQL, entre outros. Na segunda parte iremos
120
Este material deve ser utilizado apenas como parmetro de estudo deste Programa. Os crditos deste contedo so dados aos seus respectivos autores
utilizar controles visuais de acesso a dados. Na primeira parte escreveremos bastante
cdigos e utilizaremos poucos controles visuais. Na segunda parte vamos empregar
muitos controles visuais e escrever menos cdigos. Se voc esta pensando em estudar
apenas a segunda parte, minha sugesto para que voc NO FAA ISSO. Controles
visuais ajudam muito, lhe do um grande ganho de produtividade e tornam o nosso
trabalho mais divertido, porm no iro resolver todos os problemas que voc vai
encontrar no seu dia-a-dia como um profissional desenvolvedor de aplicaes: muitas
vezes preciso digitar cdigo e resolver os problemas com algumas linhas de
programao. Eu diria que na soluo da maioria dos problemas de acesso a dados na
vida real utilizamos um misto de cdigo e controles visuais.
Preparando o Ambiente
Voc pode criar uma aplicao ASP.NET que acesse praticamente qualquer fonte
de dados: Oracle, DB2, Informix, FireBird, etc. Para algumas destas fontes de dados voc
vai ter sucesso utilizando provedores OleDB ou drivers ODBC gratuitos ou que j
acompanham o .NET. Para outros voc vai ter que comprar algum produto comercial.
Neste curso vamos usar unicamente o SQL Server em nossos exemplos. Os motivos so
diversos: este o sistema gerenciador de banco de dados da Microsoft. O .NET est
pronto para sua utilizao; um produto de fcil emprego, bastante intuitivo. Por fim, vale
lembrar que como estamos acessando dados em alto nvel, ou seja, utilizando uma
camada de abstrao o ADO.NET ao aproveitar outra fonte de dados as diferenas
sero sutis, seno inexistentes.
Agora qual verso do SQL Server usar? Nos meus exemplos vou utilizar o SQL
Server Express 2005 e o banco de dados de demonstrao NorthWind. Isto uma
mistura de uma verso do SQL Server com o banco de dados de demonstrao de outra
verso (O banco Northwind o banco de dados da verso 2000 do SQL Server). Por que
esta mistura? Vou explicar: o banco de dados de demonstrao do SQL Server 2005,
denominado AdventureWorks, possui um recurso denominado schemas, em que o nome
de uma tabela pode ser composto atravs de um modelo Schema.Nome. desta forma
121
Este material deve ser utilizado apenas como parmetro de estudo deste Programa. Os crditos deste contedo so dados aos seus respectivos autores
que o AdventuraWorks foi criado. Curiosamente, alguns controles visuais do ASP.NET
possuem um bug com esta forma de nomear tabelas. Tal bug no impede sua utilizao,
mas tornam seu uso um tanto quanto desapropriado em um curso. O banco de dados
Northwind no utiliza o recurso de schemas, portanto no apresentam tal problema.
Voc poder tambm usar a verso 2000 ou 2008 do SQL Server, no haver
qualquer diferena com relao ao curso. Tambm no obrigatria a utilizao da
edio Express: qualquer edio til. Voc pode baixar o banco de dados Northwind no
endereo: http://www.microsoft.com/downloads/details.aspx?FamilyID=06616212-0356-
46A0-8DA2-EEBC53A68034&displaylang=en. Outra forma de localiz-lo rapidamente
fazer uma busca na Internet, simplesmente utilizando a palavra Northwind. O SQL Server
Express, 2005 ou 2008 pode ser baixado no endereo: www.microsoft.com/sql.
Se voc no possui qualquer ferramenta administrativa para SQL Server,
recomendo baixar o SQL Server Managment Studio Express, que capaz de se conectar
a qualquer verso ou edio do SQL Server. Uma ferramenta administrativa
indispensvel ao decorrer do desenvolvimento de um software ou mesmo para estudos.
Na prxima seo vou demonstrar como anexar o banco de dados de demonstrao
Northwind ao seu SQL Server.
122
Este material deve ser utilizado apenas como parmetro de estudo deste Programa. Os crditos deste contedo so dados aos seus respectivos autores
EXEC sp_attach_db @dbname = 'NorthWind',
@filename1 = 'C:\SQL Server 2000 Sample Databases\NORTHWND.MDF',
@filename2 = 'C:\SQL Server 2000 Sample Databases\NORTHWND.LDF'
Visualmente, abra o SQL Server Managment Studio, clique com o boto direito
sobre Databases e selecione a opo Attach, conforme imagem abaixo:
123
Este material deve ser utilizado apenas como parmetro de estudo deste Programa. Os crditos deste contedo so dados aos seus respectivos autores
System.Data.SQLClient. Os Namespaces devem ser importados, como primeiro item em
nosso arquivo de cdigo de servidor, veja os exemplos abaixo:
Imports System.data
Imports System.Data.SqlClient
Partial Class _Default
Inherits System.Web.UI.Page
End Class
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data;
using System.Data.SqlClient;
}
}
Observe que nos dois exemplos adicionamos apenas duas linhas de cdigo, a
diferena est no fato de que no C#, por padro, diversos outros Namespaces so
importados, o que no VB se d implicitamente.
Veremos agora as principais classes que iremos utilizar durante o nosso curso:
SqlConnection: Abre e mantm uma conexo com um gerenciador de banco
de dados SQL Server;
SqlCommand: Permite a execuo de comandos SQL contra um banco de
dados SQL Server;
SqlParameter: Permite a atribuio de parmetros para comandos SQL para
SQL Server;
124
Este material deve ser utilizado apenas como parmetro de estudo deste Programa. Os crditos deste contedo so dados aos seus respectivos autores
SqlTransaction: Permite a criao e o gerenciamento de transaes em
banco de dados SQL Server;
SqlDataReader: Permite a recuperao de um conjunto de dados de um
banco de dados SQL Server, que estar disponvel somente para leitura e
pode ser percorrido de forma unidirecional;
DataSet: Permite o armazenamento em memria de um conjunto de dados.
Independe da fonte de dados (no necessariamente SQL Server) e no
requer conexo com o sistema gerenciador de banco de dados;
DataTable: Permite o armazenamento em memria de um tabela de dados.
Independe da fonte de dados (no necessariamente SQL Server) e no
requer conexo com o sistema gerenciador de banco de dados.
A classe SQLConnection
125
Este material deve ser utilizado apenas como parmetro de estudo deste Programa. Os crditos deste contedo so dados aos seus respectivos autores
//Instncia um objeto SqlConnection
SqlConnection Conexao = new SqlConnection();
//Define a string de conexo
Conexao.ConnectionString = "Data Source= FERNANDO
\\SQLEXPRESS;Initial Catalog=NorthWind;User
ID=sa;Password=123456";
//Abre a conexo
Conexao.Open();
//Encerra a conexo
Conexao.Close();
Se tudo ocorrer bem no vai acontecer nada na execuo do cdigo, pois apenas
abrimos e fechamos uma conexo. Porm, se algo der errado, voc vai receber um erro
de conexo, como o da imagem abaixo:
126
Este material deve ser utilizado apenas como parmetro de estudo deste Programa. Os crditos deste contedo so dados aos seus respectivos autores
Neste caso revise as informaes em sua string de conexo. importante
salientar tambm que o SQL Server por padro no permite conexes remotas. Se voc
est tentando conexo com o usurio Sa, como no meu exemplo, lembre-se que por
padro este usurio tambm tem o login desabilitado. Antes de continuarmos, algumas
consideraes sobre segurana. Em meu exemplo estou utilizando o usurio Sa para
conexo. Este um usurio com privilgios de super administrador e no deve jamais ser
utilizado em uma aplicao de produo. Em um curso, porm, seu uso mais prtico, j
que no precisamos criar um usurio especfico para o mesmo tampouco temos que lidar
com eventuais problemas de permisso de acesso.
Tambm preciso tomar cuidado para no utilizarmos para testes um servidor
onde rode uma aplicao de produo, independente do tipo de usurio que iremos nos
conectar. Isto para evitarmos acidentalmente causar danos a informaes ou mesmo
degradar a performance de aplicaes vivas. Uma ltima observao: no primeiro curso
aprendemos a tratar erros atravs de blocos try...catch. A abertura de uma conexo e
outras operaes em banco de dados so exemplos clssicos de situaes em que
devemos prever erros em nosso cdigo, afinal o servidor de banco de dados pode ter
cado, estar sobrecarregado, simplesmente no existir ou outra situao, dentre infinitas
possibilidades. Porm, a fim de clareza, todo o cdigo escrito neste curso, salvo algumas
excees, ser apresentado sem os blocos de tratamento de erros. Ao escrever
aplicaes para a vida real no se esquea de inclu-los em seu cdigo.
Voltando ao objeto SQLConnection, uma propriedade bastante til a State, que
nos permite verificar a situao da conexo. Por exemplo: antes de uma operao
importante voc pode querer atravs de uma estrutura if certificar-se de que a conexo
continua aberta. A propriedade State um enumerador que pode ter os seguintes valores:
Broken: A conexo foi aberta, porm por algum motivo foi quebrada. Deve-
se fechar a conexo e abri-la novamente;
Closed: A conexo se encontra encerrada;
Open: A conexo est aberta.
127
Este material deve ser utilizado apenas como parmetro de estudo deste Programa. Os crditos deste contedo so dados aos seus respectivos autores
anterior. Neste exemplo, um bloco Select/switch verifica o estado da conexo: se a
mesma foi quebrada, fecha e reabre a mesma, se estiver fechada, abre. Note que se a
conexo j estiver aberta no h nada a ser feito, pois a mesma j est pronta para o uso:
'Instncia um objeto SqlConnection
Dim Conexao As New SqlConnection("Data
Source=FERNANDO\SQLEXPRESS;Initial Catalog=NorthWind;User
ID=sa;Password=123456")
'Abre a conexo
Select Case Conexao.State
Case ConnectionState.Broken
Conexao.Close()
Conexao.Open()
Case ConnectionState.Closed
Conexao.Open()
End Select
'Encerra a conexo
Conexao.Close()
//Abre a conexo
switch (Conexao.State)
{
case ConnectionState.Broken:
Conexao.Close();
Conexao.Open();
break;
case ConnectionState.Closed:
Conexao.Open();
break;
}
//Encerra a conexo
Conexao.Close();
Outra diferena nesta segunda verso que a string de conexo foi passada
como uma parmetro atravs de uma sobrecarga do construtor da classe SQLConnection
ao invs de ser atribudo pela propriedade. O resultado prtico o mesmo.
128
Este material deve ser utilizado apenas como parmetro de estudo deste Programa. Os crditos deste contedo so dados aos seus respectivos autores
A classe SQLCommand
'Encerra a conexo
Conexao.Close()
//Encerra a conexo
Conexao.Close();
129
Este material deve ser utilizado apenas como parmetro de estudo deste Programa. Os crditos deste contedo so dados aos seus respectivos autores
A criao da instncia da classe SqlConnection j conhecida. Observe que o
cdigo acima instancia um objeto SqlCommand, atribui um objeto SqlConnection a
propriedade Connection, define uma instruo SQL atravs da propriedade
CommandText e finalmente executa o comando atravs do mtodo ExecuteNonQuery. A
Instruo SQL um comando Insert bem simples. Note que se voc executar o cdigo
mais de uma vez ter um erro de violao de chave primria, a no ser que altere
REGIONID para um valor diferente de 6. O mais importante no cdigo o mtodo de
execuo. Existem diversos mtodos de execuo na classe SqlCommand, cada um com
um propsito diferente, vamos estud-los:
ExecuteNonQuery: Executa o comando e retorna o nmero de linhas que foram
afetadas pelo comando. Por exemplo, caso seja uma comando SQL Delete, o
mtodo retorna o nmero de linhas que foram excludas. Ideal para execuo de
comandos SQL que no retornam um conjunto de resultados, como instrues
INSERT, UPDATE e DELETE.
ExecuteReader: Executa um comando SQL, instancia e retorna um objeto
SQLDataReader. O Objeto SQLDataReader capaz de receber um conjunto de
registros, de leitura unidirecional e somente leitura. Vamos estudar a classe
SqlDataReader na prxima seo.
ExecuteScalar: Executa um comando SQL e retorna apenas o valor da primeira
coluna da primeira linha do resultado. Um exemplo de seu uso em instrues
escalares, como COUNT, SUM ou AVG.
A classe SQLDataReader
130
Este material deve ser utilizado apenas como parmetro de estudo deste Programa. Os crditos deste contedo so dados aos seus respectivos autores
recuperados. Outra caracterstica desta classe que o objeto requer acesso exclusivo
conexo durante a recuperao de dados.
As caractersticas desta classe a tornam ideal para leitura de dados que no
necessitam de alterao, j que as suas caractersticas de direo nica e somente leitura
fazem com que a recuperao dos dados seja extremamente rpida. Se os ltimos
pargrafos pareceram um pouco complicados, o exemplo a seguir vai ajudar a esclarecer.
Antes de digitar o cdigo, adicione um controle ListBox sua pgina:
'Instncia um objeto SqlConnection
Dim Conexao As New SqlConnection("Data
Source=FERNANDO\SQLEXPRESS;Initial Catalog=NorthWind;User
ID=sa;Password=123456")
'Abre a conexo
Conexao.Open()
131
Este material deve ser utilizado apenas como parmetro de estudo deste Programa. Os crditos deste contedo so dados aos seus respectivos autores
//Instncia um objeto SQLDataReader
SqlDataReader SqlReader = comando.ExecuteReader();
//Encerra a conexo
Conexao.Close();
132
Este material deve ser utilizado apenas como parmetro de estudo deste Programa. Os crditos deste contedo so dados aos seus respectivos autores
Outro problema comum que podemos encontrar ter de percorrer registros de
uma tabela, um a um. A classe SqlDataReader permite isso atravs do mtodo read, que,
a cada execuo, avana um registro do conjunto de resultados, enquanto houverem
registros. No exemplo abaixo percorremos a tabela de detalhes de pedidos e realizamos a
soma do campo quantidade:
'Instncia um objeto SqlConnection
Dim Conexao As New SqlConnection("Data
Source=FERNANDO\SQLEXPRESS;Initial Catalog=NorthWind;User
ID=sa;Password=123456")
'Abre a conexo
Conexao.Open()
'Encerra a conexo
Conexao.Close()
133
Este material deve ser utilizado apenas como parmetro de estudo deste Programa. Os crditos deste contedo so dados aos seus respectivos autores
//Percorre os registros somando o total
while (SqlReader.Read())
{
Total += Convert.ToInt32(SqlReader[0]);
}
//Encerra a conexo
Conexao.Close();
Classe SqlParameter
134
Este material deve ser utilizado apenas como parmetro de estudo deste Programa. Os crditos deste contedo so dados aos seus respectivos autores
A ideia simples: a instruo SQL montada concatenada propriedade
CommandText. O exemplo funciona, seu grande problema relacionado segurana. Tal
comando pode causar uma das falhas mais comuns e exploradas em aplicaes: Injeo
de SQL. O que aconteceria se, no TextBox, ao invs de digitar o cdigo do empregado,
voc digitasse o texto abaixo:
135
Este material deve ser utilizado apenas como parmetro de estudo deste Programa. Os crditos deste contedo so dados aos seus respectivos autores
'Adiciona o parametro ao SqlCommand
comando.Parameters.Add(Parametro)
136
Este material deve ser utilizado apenas como parmetro de estudo deste Programa. Os crditos deste contedo so dados aos seus respectivos autores
parmetro, basta instanciar quantos objetos SqlParameter forem necessrios, sem
esquecer de adicion-los coleo de parmetros da instncia de seu SqlCommand.
Classe SqlTransaction
137
Este material deve ser utilizado apenas como parmetro de estudo deste Programa. Os crditos deste contedo so dados aos seus respectivos autores
est utilizando a mesma transao, a incluso da Regio ser desfeita. Voc pode
confirmar isto fazendo uma consulta diretamente no banco de dados atravs do Sql
Server Mangment Studio, por exemplo.
Try
'Executa a insero do territrio
'Deve ocorrer erro porque a instruo Sql causa uma violao de
Chave Primria
comando.ExecuteNonQuery()
Catch ex As Exception
'Desfaz a transao
Transacao.Rollback()
Exit Sub
End Try
'Encerra a conexo
Conexao.Close()
138
Este material deve ser utilizado apenas como parmetro de estudo deste Programa. Os crditos deste contedo so dados aos seus respectivos autores
//Instncia um objeto SqlConnection
SqlConnection Conexao = new SqlConnection("Data Source= FERNANDO
\\SQLEXPRESS;Initial Catalog=NorthWind;User
ID=sa;Password=123456");
//Abre a conexo
Conexao.Open();
try
{
//Executa a insero do territrio
//Deve ocorrer erro porque a instruo Sql causa uma
//violao de Chave Primria
comando.ExecuteNonQuery();
}
catch
{
//Desfaz a transao
Transacao.Rollback();
return;
}
//Encerra a conexo
Conexao.Close();
139
Este material deve ser utilizado apenas como parmetro de estudo deste Programa. Os crditos deste contedo so dados aos seus respectivos autores
Para ver a transao ser confirmada e as duas inseres serem efetivadas, basta
alterar o valor para o campo TerritoryID no Sql de insero a fim de que no cause a
violao de chave primria.
'Abre a conexo
Conexao.Open()
'Prepara um comando
Dim comando As New SqlCommand
comando.Connection = conexao
comando.CommandText = "SELECT REGIONID,REGIONDESCRIPTION FROM
REGION"
'Instncia um SqlDataAdapter
140
Este material deve ser utilizado apenas como parmetro de estudo deste Programa. Os crditos deste contedo so dados aos seus respectivos autores
Dim Adaptador As New SqlDataAdapter
Adaptador.SelectCommand = comando
'Instncia um DataSet
Dim DataSet As New DataSet
'O mtodo Fill do SqlDataAdapter popula o DataSet com os Registros
'de acordo com a instruo Sql do SqlCommand
Adaptador.Fill(DataSet)
'A conexo no mais necessria
conexao.Close()
'Vinculamos o DataSet ao ListBox
With ListBox1
.DataSource = DataSet
.DataValueField = "REGIONID"
.DataTextField = "REGIONDESCRIPTION"
.DataBind()
End With
//Prepara um comando
SqlCommand comando = new SqlCommand();
comando.Connection = conexao;
comando.CommandText = "SELECT REGIONID,REGIONDESCRIPTION FROM
REGION";
//Instncia um SqlDataAdapter
SqlDataAdapter Adaptador = new SqlDataAdapter();
Adaptador.SelectCommand = comando;
//Instncia um DataSet
DataSet DataSet = new DataSet();
//O mtodo Fill do SqlDataAdapter popula o DataSet com os
Registros
//de acordo com a instruo Sql do SqlCommand
Adaptador.Fill(DataSet);
//A conexo no mais necessria
conexao.Close();
//Vinculamos o DataSet ao ListBox
ListBox1.DataSource = DataSet;
ListBox1.DataValueField = "REGIONID";
ListBox1.DataTextField = "REGIONDESCRIPTION";
ListBox1.DataBind();
O cdigo acima apenas recupera e listas dados. Seria mais eficiente com a
utilizao de um SqlDataReader, lembrando que em seo anterior falamos que o
SqlDataReader um cursor somente leitura e unidirecional, portanto muito mais veloz.
141
Este material deve ser utilizado apenas como parmetro de estudo deste Programa. Os crditos deste contedo so dados aos seus respectivos autores
Vamos ver como podemos usar as classes DataSet e DataTable para a manipulao de
dados. Note que no modelo acima fornecemos um comando de seleo. Se vamos, por
exemplo, incluir dados, teremos tambm que fornecer uma instruo Sql de incluso
atravs da propriedade InsertCommand do SqlDataAdapter. Alternativamente, podemos
utilizar a classe SqlCommandBuilder para que as instrues Sql de Insero, Excluso e
Alterao sejam criadas automaticamente para o SqlDataAdapter. Para isto dar certo,
necessrio que a instruo Sql de Seleo fornecida contenha a chave primria da tabela.
No exemplo a seguir, inclumos um registro na tabela Regions. Note que
utilizamos um objeto DataTable ao invs de um DataSet, algo totalmente possvel pois
estamos trabalhando com uma nica tabela. Observe tambm o uso de um objeto
DataRow, objeto este que representa uma linha da tabela. Depois de definirmos o valor
para a linha, adicionamos linha a tabela e atualizamos a fonte de dados. Outra
observao importante no cdigo que no h abertura ou fechamento explcito da
conexo com o banco de dados. Isto possvel porque o SqlDataAdapter faz o
gerenciamento automtico da conexo: se encontrar a mesma aberta, utiliza e a mantm
aberta, porm, caso encontre a conexo fechada, faz a abertura e ao final fecha a
conexo.
Dim conexao As New SqlConnection
'Instncia um objeto SqlConnection
Dim Conexao As New SqlConnection("Data
Source=FERNANDO\SQLEXPRESS;Initial Catalog=NorthWind;User
ID=sa;Password=123456")
'Prepara um comando
Dim comando As New SqlCommand
comando.Connection = conexao
comando.CommandText = "SELECT REGIONID,REGIONDESCRIPTION FROM
REGION"
'Instncia um SqlDataAdapter
Dim Adaptador As New SqlDataAdapter
Adaptador.SelectCommand = comando
'Instncia um Datatable
Dim Tabela As New DataTable
'O mtodo Fill do SqlDataAdapter popula a tabela com os Registros
'de acordo com a instruo Sql do SqlCommand
142
Este material deve ser utilizado apenas como parmetro de estudo deste Programa. Os crditos deste contedo so dados aos seus respectivos autores
Adaptador.Fill(Tabela)
//Prepara um comando
SqlCommand comando = new SqlCommand();
comando.Connection = conexao;
comando.CommandText = "SELECT REGIONID,REGIONDESCRIPTION FROM
REGION";
//Instncia um SqlDataAdapter
SqlDataAdapter Adaptador = new SqlDataAdapter();
Adaptador.SelectCommand = comando;
//Instncia um Datatable
DataTable Tabela = new DataTable();
//O mtodo Fill do SqlDataAdapter popula a tabela com os
Registros
//de acordo com a instruo Sql do SqlCommand
Adaptador.Fill(Tabela);
143
Este material deve ser utilizado apenas como parmetro de estudo deste Programa. Os crditos deste contedo so dados aos seus respectivos autores
Juntando Tudo
Nesta seo vamos criar uma pequena aplicao, de uma nica pgina, que
utiliza a maioria dos recursos de programao que estudamos at aqui. Antes, porm,
uma observao sobre a string de conexo. Em todos os exemplos at aqui definimos
nossa string de conexo junto com nosso cdigo, ou seja, dentro dos arquivos vb e cs.
Isto, na vida real nos trar dois problemas: primeiro que as informaes de conexo so
muito dinmicas. Quando seu sistema entrar em produo elas tero que ser alteradas,
quando seu sistema gerenciador de banco de dados mudar elas tero que ser alteradas e
assim por diante. O segundo problema que normalmente abrimos conexes em
diversos pontos da aplicao. Ficaria muito difcil gerenciar dezenas, centenas ou at
milhares de strings de conexo espalhadas no seu cdigo fonte.
O ASP.NET resolve isso permitindo que voc defina uma ou mais strings de
conexo em seu arquivo de configurao da aplicao, o web.config. Desta forma voc
tem as suas informaes de conexo centralizadas: ser necessria a alterao em um
nico lugar. Tambm voc no vai precisar alterar seu cdigo fonte para mudar sua fonte
de dados. Vamos ver como isso pode ser feito: Primeiro adicionamos a string de conexo
ao web.config:
<connectionStrings>
<add name="NorthWindConnectionString" connectionString="Data
Source=FERNANDO\SQLEXPRESS;Initial Catalog=NorthWind;User
ID=sa;Password=123456" providerName="System.Data.SqlClient"/>
</connectionStrings>
No meu web.config ela foi colocada logo aps o elemento <appSettings/>. Entre
os atributos, temos name, que d um nome nico para a string, isso til especialmente
se voc tem mais de uma fonte de dados e necessita de mais de uma string de conexo.
O segundo atributo, connectionString, a string de conexo propriamente dita,
semelhante a que utilizamos em nosso cdigo fonte nas sees anteriores. Finalmente, o
ltimo elemento define o provedor de acesso a dados, que para Sql Server o SqlClient.
144
Este material deve ser utilizado apenas como parmetro de estudo deste Programa. Os crditos deste contedo so dados aos seus respectivos autores
A prxima etapa como atribuir nossa string de conexo s nossas instncias
das classes SqlConnection. Isso pode ser feito atravs do mtodo ConnectionStrings da
classe ConfigurationManager. O mtodo deve receber como parmetro o nome da string
de conexo, conforme definido no web.config, que no nosso exemplo nomeamos como
NorthWindConnectionString. Veja os exemplos:
145
Este material deve ser utilizado apenas como parmetro de estudo deste Programa. Os crditos deste contedo so dados aos seus respectivos autores
Inicialmente devemos incluir as clusulas Imports/using no topo de nosso arquivo
de cdigo:
Imports System.Data.SqlClient
Imports System.Data
using System.Data.SqlClient;
Dentro da classe vamos declarar duas variveis privadas, uma para conexo e
outra para execuo de comandos. Faremos desta forma para que possamos aproveitar
as variveis no restante da pgina:
Private Conexao As New SqlConnection
Private Comando As New SqlCommand
146
Este material deve ser utilizado apenas como parmetro de estudo deste Programa. Os crditos deste contedo so dados aos seus respectivos autores
Criamos ento um procedimento RecuperaRegioes, que tem por objetivo
recuperar os registros da tabela regies. A criao deste procedimento separado permite
que a listagem de regies seja atualizada quando um registro includo ou excludo:
Private Sub RecuperaRegioes()
Conexao.Open()
'Define a instruo Sql
Comando.CommandText = "SELECT REGIONID,REGIONDESCRIPTION FROM
REGION"
'Instncia um SqlDataReader
Dim DataReader As SqlDataReader = Comando.ExecuteReader
'Popula o ListBox
With ListBox1
.DataTextField = "REGIONDESCRIPTION"
.DataValueField = "REGIONID"
.DataSource = DataReader
.DataBind()
End With
'Fecha a conexo
Conexao.Close()
End Sub
O boto de excluso tem uma instruo Sql Delete, que recebe como parmetro a
chave do registro da tabela Region que est sendo excluda. Note que no bloco de cdigo
em que populamos o ListBox, a chave da tabela foi adicionada propriedade
DataValueField.
147
Este material deve ser utilizado apenas como parmetro de estudo deste Programa. Os crditos deste contedo so dados aos seus respectivos autores
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As
System.EventArgs) Handles ButtonExcluir.Click
Conexao.Open()
'Define a instruo Sql
Comando.CommandText = "DELETE FROM REGION WHERE REGIONID =
@REGIONID"
'Instncia e define o parametro
Dim Parametro As New SqlParameter
Parametro.ParameterName = "@REGIONID"
Parametro.SqlDbType = SqlDbType.Int
'O valor para o parametro vem da propriedade SelectedValue do
ListBox
'Que foi populada com a chave da tabela
Parametro.Value = ListBox1.SelectedValue
Comando.Parameters.Add(Parametro)
Comando.ExecuteNonQuery()
Conexao.Close()
'Atualiza a lista de regies, sem o registro excluido
RecuperaRegioes()
End Sub
148
Este material deve ser utilizado apenas como parmetro de estudo deste Programa. Os crditos deste contedo so dados aos seus respectivos autores
Conexao.Open()
'Define a instruo Sql
Comando.CommandText = "INSERT INTO REGION
(REGIONID,REGIONDESCRIPTION) VALUES
(@REGIONID,@REGIONDESCRIPTION)"
'Primeiro Parmetro
Dim Parametro As New SqlParameter
Parametro.ParameterName = "@REGIONID"
Parametro.SqlDbType = SqlDbType.Int
Parametro.Value = TextBoxCodigo.Text
Comando.Parameters.Add(Parametro)
'Segundo Parmetro
Dim Parametro2 As New SqlParameter
Parametro2.ParameterName = "@REGIONDESCRIPTION"
Parametro2.SqlDbType = SqlDbType.VarChar
Parametro2.Value = TextBoxRegiao.Text
Comando.Parameters.Add(Parametro2)
Comando.ExecuteNonQuery()
Conexao.Close()
'Atualiza a lista de regies, com o registro incluido
RecuperaRegioes()
End Sub
comando.ExecuteNonQuery();
Conexao.Close();
//Atualiza a lista de regies, com o registro incluido
RecuperaRegioes();
}
149
Este material deve ser utilizado apenas como parmetro de estudo deste Programa. Os crditos deste contedo so dados aos seus respectivos autores
Finalmente vamos adicionar algum cdigo ao nosso evento Page Load, com
inteno de inicializar a string de conexo e definir a conexo do comando. Tambm
populamos a lista de regies, porm com um detalhe: esta populao deve ser feita
apenas na primeira execuo da pgina, por isso a chamada do procedimento dentro de
um bloco if.
Protected Sub Page_Load(ByVal sender As Object, ByVal e As
System.EventArgs) Handles Me.Load
'Define a string de conexo
Conexao.ConnectionString =
ConfigurationManager.ConnectionStrings("NorthWindConnectionString").Conne
ctionString
'Define a conexo do comando
Comando.Connection = Conexao
'Se no for um postback, popula o ListBox, caso contrrio,
'os eventos de incluso ou excluso sero responsveis pela atualizao
If Not IsPostBack Then
RecuperaRegioes()
End If
End Sub
150
Este material deve ser utilizado apenas como parmetro de estudo deste Programa. Os crditos deste contedo so dados aos seus respectivos autores
Private Sub RecuperaRegioes()
Conexao.Open()
'Define a instruo Sql
Comando.CommandText = "SELECT REGIONID,REGIONDESCRIPTION FROM REGION"
'Instncia um SqlDataReader
Dim DataReader As SqlDataReader = Comando.ExecuteReader
'Popula o ListBox
With ListBox1
.DataTextField = "REGIONDESCRIPTION"
.DataValueField = "REGIONID"
.DataSource = DataReader
.DataBind()
End With
'Fecha a conexo
Conexao.Close()
End Sub
End Sub
151
Este material deve ser utilizado apenas como parmetro de estudo deste Programa. Os crditos deste contedo so dados aos seus respectivos autores
Conexao.Open()
'Define a instruo Sql
Comando.CommandText = "INSERT INTO REGION (REGIONID,REGIONDESCRIPTION)
VALUES (@REGIONID,@REGIONDESCRIPTION)"
Dim Parametro As New SqlParameter
'Primeiro Parmetro
Parametro.ParameterName = "@REGIONID"
Parametro.SqlDbType = SqlDbType.Int
Parametro.Value = TextBoxCodigo.Text
Comando.Parameters.Add(Parametro)
'Segundo Parmetro
Dim Parametro2 As New SqlParameter
Parametro2.ParameterName = "@REGIONDESCRIPTION"
Parametro2.SqlDbType = SqlDbType.VarChar
Parametro2.Value = TextBoxRegiao.Text
Comando.Parameters.Add(Parametro2)
Comando.ExecuteNonQuery()
Conexao.Close()
'Atualiza a lista de regies, com o registro incluido
RecuperaRegioes()
End Sub
End Class
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
152
Este material deve ser utilizado apenas como parmetro de estudo deste Programa. Os crditos deste contedo so dados aos seus respectivos autores
ListBox1.DataValueField = "REGIONID";
ListBox1.DataSource = DataReader;
ListBox1.DataBind();
}
//Fecha a conexo
Conexao.Close();
}
153
Este material deve ser utilizado apenas como parmetro de estudo deste Programa. Os crditos deste contedo so dados aos seus respectivos autores
SqlParameter Parametro2 = new SqlParameter();
Parametro2.ParameterName = "@REGIONDESCRIPTION";
Parametro2.SqlDbType = SqlDbType.VarChar;
Parametro2.Value = TextBoxRegiao.Text;
comando.Parameters.Add(Parametro2);
comando.ExecuteNonQuery();
Conexao.Close();
//Atualiza a lista de regies, com o registro incluido
RecuperaRegioes();
}
}
O que mais voc pode fazer para aperfeioar esta pequena aplicao? Seguem
abaixo algumas sugestes:
Validar a entrada de dados de insero, ou seja, certificar-se que o usurio
informou um cdigo e uma regio. Validar se o cdigo inteiro;
Verificar se a insero no vai causar uma violao de chave primria;
Na excluso, certificar-se que existe um valor selecionado no ListBox;
Proteger seu cdigo com blocos try.catch onde houver probabilidade maior de
ocorrncia de erros.
Controles Visuais
Agora que voc passou pelo mais difcil, vem o prmio: a programao
declarativa mais cansativa, a programao visual mais divertida e a produtividade
muito superior. Como disse em seo anterior, um bom desenvolvedor tem que
obrigatoriamente conhecer os dois modelos de programao. Voc ver tambm que
mesmo na programao visual alguns problemas tm que ser resolvidos escrevendo-se
cdigo.
Os controles visuais esto localizados na guia Data, conforme imagem abaixo:
154
Este material deve ser utilizado apenas como parmetro de estudo deste Programa. Os crditos deste contedo so dados aos seus respectivos autores
No vou explicar cada um dos controles neste momento, j que iremos descobrir
alguns deles durante o curso. Antes de entrarmos em nosso primeiro exemplo, vamos
falar um pouco da programao para internet antes do ASP.NET. No ASP Clssico, ou
mesmo em outras linguagens de programao Web, exibir uma tabela qualquer em uma
pgina de internet era um trabalho grandioso: voc teria que criar um recordset, percorr-
lo e simultaneamente criar tags tables, td e tr. Entre o incio da programao e a verso
final poderiam ir horas ou at mesmo dias. Vamos ver agora que exibir uma tabela em
uma pgina Web pode ser feito rapidamente, sem a digitao de uma nica linha de
cdigo.
Primeiramente crie uma nova aplicao ASP.NET ou adicione um novo Web Form
se voc j estiver com a aplicao aberta. Localize a guia Data e arraste um controle
GridView para seus Web Form. Na Smat Tag do controle, selecione New Data Source em
Choose Data Source, como na imagem abaixo:
155
Este material deve ser utilizado apenas como parmetro de estudo deste Programa. Os crditos deste contedo so dados aos seus respectivos autores
exibida a Janela DataSource Configuration Wizard. Neste assistente ser criado
um controle SqlDataSource, que nos permite acessar uma base de dados em um servidor
Sql Server. Voc tambm poderia arrastar este controle da guia Data e configur-lo da
mesma forma. A diferena que pela Smart Tag do GridView, o SQLDataSorce j
criado vinculado ao controle visual. Na primeira etapa do assistente, selecione DataBase,
mantenha o valor padro para o campo Specify na ID for the data source:
156
Este material deve ser utilizado apenas como parmetro de estudo deste Programa. Os crditos deste contedo so dados aos seus respectivos autores
Clique em Ok. Na prxima etapa voc deve configurar o acesso ao banco de
dados. No DropDownList desta janela so listadas conexes j encontradas no
web.config da aplicao. Como no temos ainda nenhuma conexo configurada, no
haver valores listados:
157
Este material deve ser utilizado apenas como parmetro de estudo deste Programa. Os crditos deste contedo so dados aos seus respectivos autores
Para criarmos uma nova conexo, clique em New Connection. Na janela Choose
Data Source, selecione Microsoft SQL Server:
158
Este material deve ser utilizado apenas como parmetro de estudo deste Programa. Os crditos deste contedo so dados aos seus respectivos autores
Clique em continue. Agora devemos fazer a configurao de fato da conexo. A
janela Add Connection vai montar, de forma visual, a string de conexo que nas sees
anteriores escrevemos no cdigo. As informaes necessrias so basicamente as
mesmas: nome do servidor SQL Server em Server Name, se voc no sabe o nome do
servidor pode solicitar que os servidores disponveis na rede sejam listados, clicando em
Refresh. O tipo de conexo, que em nossa aplicao dever ser Use SQL Server
Authentication, ao selecionar esta opo automaticamente os campos User Name e
Password so habilitados. Voc deve informar o usurio de conexo e sua senha,
respectivamente. Marque tambm a opo Save My Password, para que a senha seja
salva junto com as demais informaes de conexo. Finalmente, em Select or enter a
database name, se as informaes de conexo estiverem corretas, sero listados os
banco de dados disponveis no servidor. Selecione Northwind para nosso exemplo.
159
Este material deve ser utilizado apenas como parmetro de estudo deste Programa. Os crditos deste contedo so dados aos seus respectivos autores
Voc ainda pode usar o boto Test Connection para testar sua conexo.
Normalmente se os bancos de dados foram listados, a conexo j est funcionando.
Clique em Ok. O VS nos trs de volta a janela Configure Data Source, desta vez com a
conexo configurada. Note que se clicarmos no sinal + na parte central esquerda da
janela podemos ver a string de conexo criada. Clique em Next. Nesta etapa devemos
manter marcada a opo Yes, save this connection as para que o VS mantenha a string
de conexo no Web.Config e, assim, possa ser reaproveitada por outros controles.
Opcionalmente voc pode alterar o nome da string de conexo:
160
Este material deve ser utilizado apenas como parmetro de estudo deste Programa. Os crditos deste contedo so dados aos seus respectivos autores
definir colunas de uma tabela ou view. Vamos utilizar a segunda opo. Abaixo, em
Name, definimos qual tabela ser includa na consulta, o DropDownList lista todas as
tabelas e views do banco de dados de nossa string de conexo:
Clique agora no boto Advanced. O VS, alm da instruo Select, pode gerar
automaticamente os comandos SQL de insero, atualizao e excluso, para isso
devemos marcar o primeiro chekbox:
161
Este material deve ser utilizado apenas como parmetro de estudo deste Programa. Os crditos deste contedo so dados aos seus respectivos autores
Ter estes comandos criados importante se queremos ter controles com
funcionalidades de manipulao de dados. A segunda opo cria as instrues de
atualizao de excluso de forma a detectar problemas de concorrncia no banco de
dados. No vamos utilizar esta opo. Um ponto importante que a criao das
instrues de excluso, incluso e atualizao s esto habilitadas porque ao
selecionarmos os campos para incluso na consulta inclumos a chave primria da tabela.
Voc pode testar isso, feche a janela Advanced, desmarque a coluna OrderID e abra
novamente a tela Advanced. Note que todas as opes esto desabilitadas.
Podemos seguir adiante. A ltima etapa nos permite testar a consulta, para isso
clique no boto Test Query, se tudo estiver ok, a tela retorna o resultado da consulta:
162
Este material deve ser utilizado apenas como parmetro de estudo deste Programa. Os crditos deste contedo so dados aos seus respectivos autores
Ao finalizar o assistente voc est de volta ao Web Form, como o GridView
populado com dados fictcios, mas j seguindo o esquema dos campos selecionados. Foi
criado tambm um controle SqlDataSource, j configurado. O SqlDataSource est
vinculado ao GridView atravs da propriedade DataSourceID deste ltimo. Antes de rodar
a aplicao, examine as propriedade do SqlDataSource criado. Verifique propriedades
como SelectQuery, UpdateQuery, DeleteQuery e InserQuery. Note que nestas
propriedades so armazenados os comandos SQL criados:
163
Este material deve ser utilizado apenas como parmetro de estudo deste Programa. Os crditos deste contedo so dados aos seus respectivos autores
Podemos alterar estes comandos manualmente, desde que, obviamente,
estejamos sabendo o que estamos fazendo. Existe ainda a possibilidade de utilizarmos a
ferramenta Query Builder, que nos permite montar comandos complexos em uma
interface visual. Para conhecer a ferramenta basta clicar no boto Query Builder na janela
de exibio do comando. Tudo a fazer agora rodar a aplicao:
164
Este material deve ser utilizado apenas como parmetro de estudo deste Programa. Os crditos deste contedo so dados aos seus respectivos autores
Exiba o cdigo fonte da pgina e veja que o VS renderizou o GridView em
elementos table, td e tr. Vamos aperfeioar nosso GridView. Primeiramente vamos dar um
visual mais legal. Poderamos fazer isso usando Thems ou mesmo CSS, mas vamos
utilizar uma soluo mais rpida: abra a Smart Tag do Grid View e clique na opo Auto
Format. exibida uma janela com vrias opes de formatao pr-definidas. Ao
selecionar uma opo podemos pr visualiz-la direita:
165
Este material deve ser utilizado apenas como parmetro de estudo deste Programa. Os crditos deste contedo so dados aos seus respectivos autores
Depois de escolhida a opo, clique em ok. Rode a aplicao e veja a mudana
no visual. Vamos agora adicionar mais funcionalidades ao GridView. Abra novamente a
Smart Tag do controle e observe uma srie de botes de verificao na parte inferior:
166
Este material deve ser utilizado apenas como parmetro de estudo deste Programa. Os crditos deste contedo so dados aos seus respectivos autores
Enable Editing: Habilita a edio de uma linha. Quando esta opo marcada, o
GridView ganha direita um boto Edit, que quando clicado em tempo de
execuo, coloca a linha em modo de edio.
Enable Deleting: Habilita a excluso de uma linha. Quando esta opo marcada,
o GridView ganha direita um boto Delete, que quando clicado em tempo de
execuo, exclui o registro.
Enable Selection: Habilita a seleo de uma linha. Quando esta opo marcada,
o GridView ganha direita um boto Select, que quando clicado em tempo de
execuo, seleciona a linha.
167
Este material deve ser utilizado apenas como parmetro de estudo deste Programa. Os crditos deste contedo so dados aos seus respectivos autores
Teste as funcionalidades de seu GridView: Experimente ordenar colunas, paginar,
alterar registros, etc. Note que, ao colocar uma linha em modo de edio, os botes Edit,
Delete e Select so substitudos, apenas naquela linha, pelos botes Update e Cancel.
Criamos um Grid View que nos permite alterar, excluir e selecionar registros, ordenar por
colunas e ainda com recurso automtico de paginao. Tudo isso sem escrever uma
nica linha de cdigo.
Examinando a pgina com mais cuidado, voc vai perceber que seu GridView tem
alguns problemas que precisam ser resolvidos, vamos enumer-los para que as solues
sejam mostradas de forma ordenada:
1. Os ttulos das colunas esto com os nomes da tabelas. O ideal que pudssemos
personalizar estas informaes;
2. Os ttulos dos botes de comando esto em ingls. Tambm seria bom poder
traduzi-los;
3. As datas carecem de mscaras, para no mostrar as informaes de hora;
4. As colunas CustomerID e EmployeeID so chaves estrangeiras, e por isso so
cdigos que apontam para valores em outras tabelas. Seria interessante exibirmos
CompanyName e LastName, por exemplo, ao invs de CustomerID e EmployeeID.
O primeiro problema tem uma soluo rpida e simples. Clique na opo Edit
Columns do Smart Tag do GridView. aberto o editor de colunas. Ele mostra os campos
disponveis, ou que podem ser includos no Grid, abaixo os campos j includos no Grid e
direita a lista de propriedade do campo selecionado. Em Selected fields, localize e
selecione CommandField. Procure as propriedades com o sufixo Text, como CancelText,
e as altere para o portugus:
168
Este material deve ser utilizado apenas como parmetro de estudo deste Programa. Os crditos deste contedo so dados aos seus respectivos autores
Voc ainda pode mudar o tipo de boto na propriedade ButtonType. Observe que
no meu exemplo alterei de Link para Button. Note tambm que nos campos selecionados,
CommandField agora o ltimo campo da listagem. Voc pode ordenar os campos da
forma que quiser, basta selecion-lo e mov-lo utilizando os botes de subir e descer ao
lado da listagem. Clique em ok. Observe na imagem abaixo que agora temos botes ao
invs de links, traduzidos e do lado direito do GridView:
169
Este material deve ser utilizado apenas como parmetro de estudo deste Programa. Os crditos deste contedo so dados aos seus respectivos autores
O segundo problema traduzir os ttulos da coluna. O caminho semelhante.
Clique na opo Edit Columns do Smart Tag do GridView. aberto o editor de colunas.
Para cada coluna localize e traduza a propriedade HeaderText:
170
Este material deve ser utilizado apenas como parmetro de estudo deste Programa. Os crditos deste contedo so dados aos seus respectivos autores
Note que alterei CustomerID para Cliente, ao invs de modificar para cdigo do
cliente. Isto porque nosso ltimo problema exatamente trocar o cdigo pelo Nome da
Empresa. Depois de traduzir todas as colunas, clique em ok e observe o resultado.
171
Este material deve ser utilizado apenas como parmetro de estudo deste Programa. Os crditos deste contedo so dados aos seus respectivos autores
O terceiro problema, formatar as datas, segue o mesmo caminho: clique na opo
Edit Columns do Smart Tag do GridView. aberto o editor de colunas. Para cada coluna
de tipo data, localize a propriedade DataFormatString, e adicione o texto {0:d}, sendo o
primeiro caractere zero e a letra d minscula. Observe a imagem abaixo:
A string de formatao est dizendo que o primeiro parmetro, e neste caso como
se trata de um campo temos apenas um, seja formatado como data, o que representado
pelo d minsculo. Nosso quarto ltimo problema, visualizar os textos das chaves
estrangeiras ao invs dos cdigos, um pouco mais difcil, porm est longe de ser
complexo. Vamos precisar criar um SqlDataSource que aponte para a tabela em que a
chave estrangeira faz referncia. Em seguida vamos converter a coluna em TempleField e
adicionar um DropDownList que seja populado com a tabela estrangeira, mas que exiba o
registro de acordo com o cdigo daquela linha.
172
Este material deve ser utilizado apenas como parmetro de estudo deste Programa. Os crditos deste contedo so dados aos seus respectivos autores
Vamos mostrar o procedimento para a coluna Cliente. Primeiramente adicione um
controle SqlDataSource ao seu Web Form. Na Smart Tag clique em Configure Data
Souce. Na primeira etapa selecione o string de conexo que j est disponvel em seu
web.config. Na segunda etapa voc deve escolher a tabela Customers e marcar apenas
as colunas CustomerID e CompanyName. No necessrio solicitar a criao dos
demais comandos Sql, j que o SqlDataSource vai ser usado apenas para listar dados em
um DropDownList. Execute as prximas etapas do Wizard e o finalize.
173
Este material deve ser utilizado apenas como parmetro de estudo deste Programa. Os crditos deste contedo so dados aos seus respectivos autores
lembre-se que estamos fazendo isto para que o usurio no tenha que ver o cdigo
(CustomerID) do cliente no GridView.
Nossa prxima etapa transformar a coluna Customer em um TemplateField. Um
TemplateField uma coluna onde podemos personalizar de forma mais profunda o seu
comportamento. Clique na opo Edit Columns do Smart Tag do GridView. aberto o
editor de colunas. Selecione o campo cliente, em seguida clique em Convert this field into
a TemplateField. Esta opo est disponvel na forma de um link, logo acima do boto ok:
Agora vamos editar o template criado. Clique com o boto direito do mouse sobre
o GridView, localize a opo Edit Template e em seguida clique sobre Column[1]
Cliente:
174
Este material deve ser utilizado apenas como parmetro de estudo deste Programa. Os crditos deste contedo so dados aos seus respectivos autores
Note que o GridView entra em modo de edio de template, dividindo-se em
vrias regies que funcionam como containers, onde podemos colocar controles. No
ItemTemplate existe um controle Label e no EditItemTemplate um controle TextBox.
Remova ambos os controles e adicione, em cada uma destas duas regies, um controle
DropDownList. Seu template dever ficar semelhante imagem abaixo:
175
Este material deve ser utilizado apenas como parmetro de estudo deste Programa. Os crditos deste contedo so dados aos seus respectivos autores
A prxima etapa configurar os controles DropDownList. Primeiramente devemos
definir a origem dos dados, ou seja, de onde viro as informaes para sua listagem. Para
isto selecione a opo ChoseDataSource em sua Smart Tag. Em Select a data source
escolha SqlDataSource2, que foi o controle que configuramos para apontar para a tabela
de clientes. Select data field to display in the DropDownList deve conter o campo que ser
visualizado pelo usurio. No nosso exemplo, este campo CompanyName. Select a data
field for the value of the DropDownList deve conter a chave da tabela, que o campo
CustomerID. Observe a imagem abaixo:
176
Este material deve ser utilizado apenas como parmetro de estudo deste Programa. Os crditos deste contedo so dados aos seus respectivos autores
A listem dos valores no DropDownList est ok. Falta agora definir qual item do
DropDownList, entre os muitos que ele pode listar, vir selecionado. Para isso temos que
apontar para o campo CustomerID da Tabela Orders. Clique na opo Edit data binding
da Smart Tag do DropDownList, em Bindable properties selecione SelectedValue. Em
Boud to selecione CustomerID. Observe a imagem a seguir:
177
Este material deve ser utilizado apenas como parmetro de estudo deste Programa. Os crditos deste contedo so dados aos seus respectivos autores
Lembre-se que estas configuraes devem ser feitas para os dois controles
DropDownList. Uma ltima configurao que deve ser feita apenas no DropDownList da
rea Item Template: como este template o modo de visualizao, ou seja, onde o
usurio no poder alterar dados, vamos desabilitar o DropDownList. Para isto encontre
sua propriedade Enabled e a defina como false. Rode a aplicao e observe o resultado:
178
Este material deve ser utilizado apenas como parmetro de estudo deste Programa. Os crditos deste contedo so dados aos seus respectivos autores
Faa alguns testes: coloque colunas em modo de edio, altere o cliente e salve
as alteraes. Note que a alterao imediatamente refletida no modo de visualizao do
GridView. Para praticar, faa os procedimentos para exibir a coluna Last Name da tabela
de empregados, ao invs da coluna EmployeeID.
179
Este material deve ser utilizado apenas como parmetro de estudo deste Programa. Os crditos deste contedo so dados aos seus respectivos autores