Sie sind auf Seite 1von 61

Curso Programando ASP.

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.

Anexando o Banco de Dados NorthWind

Primeiramente execute o instalador do banco de dados Northwind. Em meu


equipamento os arquivos do banco de dados foram extrados em uma pasta no caminho
C:\SQL Server 2000 Sample Databases. Antes de anex-lo, voc pode querer alterar a
sua localizao fsica, para isso basta mov-lo para qualquer outro local de seu
computador, lembrando que voc deve alterar o arquivo de banco de dados
(NORTHWND.MDF) e o arquivo de log de transaes (NORTHWND.LDF). O banco de
dados pode ser anexado atravs de um comando TQL ou visualmente, pelo Management
Studio. Vamos ver as duas formas. O comando TSQL necessrio pode ser visto a seguir:

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:

Na janela Attach DataBases clique em Add, em seguida localize e selecione o


arquivo Northwind.mdf em seu computador, clique em Ok e em seguida clique em Ok
novamente. O banco de dados dever ser anexado e desta forma estar pronto para uso.

Principais Namespaces e Classes do ADO.NET

Veremos agora as principais Namespaces e Classes que iremos utilizar durante o


nosso curso. As classes necessrias estaro nos Namespaces System.Data e

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;

public partial class Default2 : System.Web.UI.Page


{
protected void Page_Load(object sender, EventArgs e)
{

}
}

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

A classe SQLConnection nos permite estabelecer uma conexo com um sistema


gerenciador de banco de dados SQL Server. um objeto fundamental, pois sem uma
conexo estabelecida no podemos realizar qualquer operao na base de dados.
Primeiramente devemos instanciar um objeto, informar a fonte de dados, abrir a conexo
e depois de sua utilizao encerr-la. Para que a conexo seja aberta, algumas
informaes so fundamentais, sendo elas: a fonte de dados (Servidor SQL Server), o
banco de dados a qual queremos nos conectar, o usurio e a senha de conexo. Tais
informaes devem ser atribudas na forma de uma string em uma propriedade do objeto
de conexo: a string de conexo.
Veja abaixo um exemplo em que a conexo instanciada, a string de conexo
atribuda e posteriormente a conexo aberta:
'Instncia um objeto SqlConnection
Dim Conexao As 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()

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

Observe os elementos que formam a nossa string de conexo:


Data Souce: Define a fonte de dados, ou seja, o servidor SQL Server;
Initial Catalog: Define o banco de dados em que a conexo deve ser
realizada;
User ID: Nome do usurio com que deve ser estabelecida a conexo;
Password: Senha do Usurio;

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.

Outros valores so possveis, porm reservados para verses futuras e no


momento no nos interessam. Veja abaixo uma nova verso do cdigo de conexo

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

//Instncia um objeto SqlConnection


SqlConnection Conexao = new SqlConnection("Data Source=FERNANDO
\\SQLEXPRESS;Initial Catalog=NorthWind;User
ID=sa;Password=123456");

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

SQLCommand outra classe fundamental no acesso a dados, atravs dele


podemos executar um comando SQL em um banco de dados SQL Server. Os elementos
mnimos para a sua utilizao so: definir a conexo, o comando SQL e execuo de fato
do comando. Veja o primeiro exemplo abaixo:
'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()

'Instncia um objeto SqlCommand


Dim comando As New SqlCommand
'Define a conexo do comando
comando.Connection = Conexao
'Define a instruo SQL
comando.CommandText = "INSERT INTO
REGION(REGIONID,REGIONDESCRIPTION) VALUES (6,'Other')"
'Executa o comando
comando.ExecuteNonQuery()

'Encerra a conexo
Conexao.Close()

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

//Instncia um objeto SqlCommand


SqlCommand comando = new SqlCommand();
//Define a conexo do comando
comando.Connection = Conexao;
//Define a instruo SQL
comando.CommandText = "INSERT INTO
REGION(REGIONID,REGIONDESCRIPTION) VALUES (6,'Other')";
//Executa o comando
comando.ExecuteNonQuery();

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

A classe SQLDataReader capaz de receber um conjunto de registros, de leitura


unidirecional e somente leitura. instanciada atravs do mtodo ExecuteReader de um
objeto do tipo SqlCommand, o que na prtica significa que a mesma deve ser apenas
declarada, e no instanciada em nosso cdigo, j que a instncia criada pelo mtodo.
Leitura unidirecional quer dizer que o conjunto de registros s pode ser percorrido em
uma direo: para frente. Somente leitura significa que no podemos alterar os dados

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

'Instncia um objeto SqlCommand


Dim comando As New SqlCommand
Atribui a conexo do comando
comando.Connection = Conexao
'Define a instruo SQL
comando.CommandText = "SELECT ShipperID,CompanyName FROM
SHIPPERS"
'Instncia um objeto SQLDataReader
Dim SqlReader As SqlDataReader = comando.ExecuteReader

'Atribui o SqlReader a um controle visual


With ListBox1
.DataSource = sqlreader
.DataTextField = "CompanyName"
.DataValueField = "ShipperID"
.DataBind()
End With
'Encerra a conexo
Conexao.Close()

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

//Instncia um objeto SqlCommand


SqlCommand comando = new SqlCommand();
//Atribui a conexo do comando
comando.Connection = Conexao;
//Define a instruo SQL
comando.CommandText = "SELECT ShipperID,CompanyName FROM
SHIPPERS";

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

//Atribui o SqlReader a um controle visual


ListBox1.DataSource = SqlReader;
ListBox1.DataTextField = "CompanyName";
ListBox1.DataValueField = "ShipperID";
ListBox1.DataBind();

//Encerra a conexo
Conexao.Close();

Note que a declarao do SQLDataReader feita sem a palavra New, j que a


instncia da classe criada pelo mtodo ExecuteReader do objeto comando. Associamos
ento o objeto SqlReader a um objeto ListBox atravs de sua propriedade DataSource.
Em seguida definimos os valores para as propriedades DataTextField e DataValueField
com os campos includos em nossa instruo SQL. Finalmente, o mtodo DataBind traz o
conjunto de registros ao controle:

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

'Instncia um objeto SqlCommand


Dim comando As New SqlCommand
'Define a conexo do comando
comando.Connection = Conexao
'Define a instruo SQL
comando.CommandText = "SELECT Quantity FROM [Order Details]"
'Instncia um objeto SQLDataReader
Dim SqlReader As SqlDataReader = comando.ExecuteReader

'Cria varivel para leitura


Dim Total As Integer

'Percorre os registros somando o total


While SqlReader.Read
Total += SqlReader(0)
End While

'Encerra a conexo
Conexao.Close()

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

//Instncia um objeto SqlCommand


SqlCommand comando = new SqlCommand();
//Define a conexo do comando
comando.Connection = Conexao;
//Define a instruo SQL
comando.CommandText = "SELECT Quantity FROM [Order Details]";
//Instncia um objeto SQLDataReader
SqlDataReader SqlReader = comando.ExecuteReader();
//Cria varivel para leitura
int Total = 0;

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

O resultado na varivel Total ao final do lao deve ser o mesmo se executada


uma instruo SQL de soma dos valores do campo Quantity. Observe que a leitura do
campo se d atravs do ndice do mesmo na instruo SQL, que no exemplo zero.
Existe uma sobrecarga que permite a leitura pelo nome do campo, obviamente que neste
caso o mesmo dever ser informado entre aspas.

Classe SqlParameter

Normalmente, a formao de um comando SQL se dar de forma dinmica. Por


exemplo, a instruo SQL abaixo retorna o ltimo nome do empregado de cdigo 1:
SELECT LASTNAME FROM EMPLOYEES WHERE EMPLOYEEID = '1'

Porm, podemos necessitar definir dinamicamente o cdigo do empregado que


queremos retornar, atravs de um valor informado em uma pgina, por exemplo, e assim
definir a instruo SQL dinamicamente. primeira vista, uma forma simples de resolver
este problema poderia ser algo como no fragmento de cdigo abaixo:
comando.CommandText = "SELECT LASTNAME FROM EMPLOYEES WHERE
EMPLOYEEID = " & TextBox1.Text

comando.CommandText = "SELECT LASTNAME FROM EMPLOYEES WHERE


EMPLOYEEID = " + TextBox1.Text;

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:

'1'; DELETE FROM CUSTOMERDEMOGRAPHICS

Simples, todos os itens da tabela CustomerDemographics sero apagados. O uso


de objetos de parmetros, como o SqlParameter, torna a programao um pouco mais
difcil, pois requer mais linhas de cdigo, mas com certeza torna a programao mais
elegante, e, acima de tudo, muito mais segura. O processo do uso da classe
SqlParameter inicia com a instncia de um objeto, definio de propriedades, como nome
da parmetro, tipo de dado e valor e finalmente o parmetro adicionado a coleo de
parmetros do objeto SqlCommand atravs do mtodo Add. Na instruo Sql, os
parmetros devem ter o nome composto pelo prefixo @ e devem coincidir com o nome
atribudo ao objeto SqlParameter. Vejamos um exemplo:

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

'Instncia um objeto SqlCommand


Dim comando As New SqlCommand
'Define a conexo do comando
comando.Connection = Conexao
'Define a instruo SQL
comando.CommandText = "SELECT LASTNAME FROM EMPLOYEES WHERE
EMPLOYEEID = @EMPLOYEEID"
'Instncia um objeto SqlParameter
Dim Parametro As New SqlParameter
'Atribui os dados necessrios ao parametro
Parametro.ParameterName = "@EMPLOYEEID"
Parametro.SqlDbType = SqlDbType.VarChar
Parametro.Value = TextBox1.Text

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)

'Atribui o sobrenome a uma varivel


Dim sobrenome As String = comando.ExecuteScalar

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

//Instncia um objeto SqlCommand


SqlCommand comando = new SqlCommand();
//Define a conexo do comando
comando.Connection = Conexao;
//Define a instruo SQL
comando.CommandText = "SELECT LASTNAME FROM EMPLOYEES WHERE
EMPLOYEEID = @EMPLOYEEID";
//Instncia um objeto SqlParameter
SqlParameter Parametro = new SqlParameter();
//Atribui os dados necessrios ao parametro
Parametro.ParameterName = "@EMPLOYEEID";
Parametro.SqlDbType = SqlDbType.VarChar;
Parametro.Value = TextBox1.Text;

//Adiciona o parametro ao SqlCommand


comando.Parameters.Add(Parametro);

//Atribui o sobrenome a uma varivel


String sobrenome = Convert.ToString( comando.ExecuteScalar());

Observe que na clusula where da instruo Sql, Employeeid dever receber


seus valores atravs de uma varivel, no nosso exemplo fornecido atravs de um
parmetro. Em seguida instanciamos um objeto do tipo SqlParameter, definimos seu
nome que deve ser igual ao nome da varivel da instruo SQL seu tipo, atravs do
enumerador SqlDbType, e finalmente seu valor, onde o cdigo mostra que vir da
propriedade Text do controle TextBox1. Ao executar este exemplo, experimente
preencher o valor do TextBox1 com o exemplo de Sql Injection que testamos
anteriormente: O ASP.NET exibe uma mensagem de erro ao invs de apagar todos os
itens da tabela CUSTOMERDEMOGRAPHICS. Se sua instruo Sql tem mais de um

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

Quando trabalhamos com aplicaes que envolvem o acesso a dados, comum


necessitarmos tratar um conjunto de operaes de forma nica. Por um conjunto de
operaes se entende a execuo de diversos comandos em uma ou mais fontes de
dados, comandos estes que podem ser instrues de excluso, alterao, incluso. O
exemplo clssico que a literatura usa para entendermos na prtica o conceito de
transaes o da movimentao bancria: voc vai transferir um montante de sua conta
para um terceiro. Tecnicamente falando, isto implica em diversas operaes em banco de
dados, mas basicamente um valor debitado de uma conta e creditado em outra. Se por
acaso ocorrer alguma falha no sistema entre o crdito e o dbito, e sabemos que
sistemas falham, o montante que deveria ser transferido simplesmente deixar de existir.
Transaes garantem a atomicidade da operao: se aps o dbito algo der errado, a
operao desfeita e a integridade das informaes mantida.
Um exemplo comum do uso de transaes entre blocos protegidos try.catch,
conforme estudamos no primeiro curso. Se a execuo do cdigo entrar no bloco catch,
significa que ocorreu um erro e a transao deve ser desfeita, caso contrrio, a transao
ocorreu com sucesso e pode ser confirmada. No exemplo abaixo, o objetivo inserir um
registro na tabela Region e em seguida um registro na tabela Territories. Um dos valores
includos na tabela Territories uma chave estrangeira para o registro da tabela Region
que acabou de ser inserido no mesmo bloco de cdigo. Porm, caso haja algo de errado
na insero em Territories, queremos que a incluso de Region, que j foi executada, seja
desfeita.
Como a instruo Sql de insero da tabela Territories vai causar uma violao de
chave primria, j que j existe no banco de dados um territrio cuja a chave primria
85014, a segunda insero vai causar uma exceo de banco de dados e ser
executado o cdigo de rollback dentro do bloco catch. Como a insero na tabela Region

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.

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

'Instancia um objeto SqlCommand


Dim comando As New SqlCommand
'Define o comando Sql
comando.CommandText = "INSERT INTO REGION
(REGIONID,REGIONDESCRIPTION) VALUES(10,'North')"
'Define a conexo
comando.Connection = Conexao

'Instncia um objeto SqlTransaction


Dim Transacao As SqlTransaction = Conexao.BeginTransaction
'Atribui o objeto SqlTransaction ao comando
comando.Transaction = Transacao

'Inclui a Regio, at aqui no deve ocorrer erro


comando.ExecuteNonQuery()

'Prepara o comando para inserir o territrio


comando.CommandText = "INSERT INTO TERRITORIES
(TERRITORYID,TERRITORYDESCRIPTION,REGIONID) VALUES
('85014','Phoenix',10)"

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

'Confirma a transao, este cdigo no deve ser executado


Transacao.Commit()

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

//Instancia um objeto SqlCommand


SqlCommand comando = new SqlCommand();
//Define o comando Sql
comando.CommandText = "INSERT INTO REGION
(REGIONID,REGIONDESCRIPTION) VALUES(10,//North//)";
//Define a conexo
comando.Connection = Conexao;

//Instncia um objeto SqlTransaction


SqlTransaction Transacao = Conexao.BeginTransaction();
//Atribui o objeto SqlTransaction ao comando
comando.Transaction = Transacao;

//Inclui a Regio, at aqui no deve ocorrer erro


comando.ExecuteNonQuery();

//Prepara o comando para inserir o territrio


comando.CommandText = "INSERT INTO TERRITORIES
(TERRITORYID,TERRITORYDESCRIPTION,REGIONID) VALUES
('85014','Phoenix',10)";

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

//Confirma a transao, este cdigo no deve ser executado


Transacao.Commit();

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

Classes DataSet e DataTable

Todas as classes relacionadas a dados que estudamos at aqui possuem o


prefixo SQL. Isto se deve ao fato de que so classes desenvolvidas para o sistema
gerenciador de banco de dados Sql Server. As principais classes que veremos nesta
sesso so independentes da fonte de dados, e por isso se chamam DataSet e
DataTable. Um Dataset pode armazenar um conjunto de dados das mais diversas fontes:
posso ter uma tabela oriunda de um arquivo Accesss, outra de Oracle e uma terceira de
Sql Server: todas juntas e interoperveis, como se fosse um nico banco de dados. E
exatamente esta a ideia de um DataSet: um banco de dados em memria.
O DataSet no mantm conexo com sua fonte de dados: fazemos a recuperao
dos dados, adicionamos ao DataSet, os dados so alterados em memria e depois, se
necessrios, as alteraes so executadas contra a fonte de dados original. Durante este
processo, no necessria que a conexo de dados seja aberta: o dataset sequer sabe
qual a origem de dados, j que os mesmos chegam at ele em um formato universal.
Porm, como o formato dos dados no DataSet universal, preciso que ocorra uma
transformao do formato especfico da fonte de dados para esse formato padro.
Quando a fonte de dados Sql Server, isto feito atravs da classe SqlDataAdapter.
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")

'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

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

//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 objeto SqlCommandBuilder


Dim Builder As New SqlCommandBuilder
'Define o SqlAdatpter
Builder.DataAdapter = Adaptador

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

'Instncia um objeto DataRow


Dim Linha As DataRow = Tabela.NewRow
'Define os valores para a linha a ser incluida
Linha("REGIONID") = 20
Linha("REGIONDESCRIPTION") = "New Orleans"
'Adiciona a linha a tabela
'Esta operao ainda est em memria
Tabela.Rows.Add(Linha)
'Atualiza a tabela de dados no Sql Server
Adaptador.Update(Tabela)

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

//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 objeto SqlCommandBuilder


SqlCommandBuilder Builder = new SqlCommandBuilder();
//Define o SqlAdatpter
Builder.DataAdapter = Adaptador;

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

//Instncia um objeto DataRow


DataRow Linha = Tabela.NewRow();
//Define os valores para a linha a ser incluida
Linha["REGIONID"] = 20;
Linha["REGIONDESCRIPTION"]= "new Orleans";
//Adiciona a linha a tabela
//Esta operao ainda est em memria
Tabela.Rows.Add(Linha);
//Atualiza a tabela de dados no Sql Server
Adaptador.Update(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:

'Instncia um objeto SqlConnection


Dim Conexao As New SqlConnection
'Define a string de conexo
Conexao.ConnectionString =
ConfigurationManager.ConnectionStrings("NorthWindConnectionString").Conne
ctionString
'Abre a conexo
Conexao.Open()

//Define a string de conexo


SqlConnection conexao = new SqlConnection();
//Define a string de conexo
conexao.ConnectionString =
ConfigurationManager.ConnectionStrings["NorthWindConnectionString"].Conne
ctionString;
conexao.Open();

Agora voltamos ao exemplo. O objetivo permitir exibir, incluir e excluir registros


da tabela Region do banco de dados NorthWind. Para isso, monte uma pgina
semelhante ao modelo a seguir:

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

private SqlConnection Conexao = new SqlConnection();


private SqlCommand Comando = 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

private void RecuperaRegioes()


{
Conexao.Open();
//Define a instruo Sql
comando.CommandText = "SELECT REGIONID,REGIONDESCRIPTION FROM
REGION";
//Instncia um SqlDataReader
SqlDataReader DataReader = comando.ExecuteReader();
//Popula o ListBox
{
ListBox1.DataTextField = "REGIONDESCRIPTION";
ListBox1.DataValueField = "REGIONID";
ListBox1.DataSource = DataReader;
ListBox1.DataBind();
}
//Fecha a conexo
Conexao.Close();
}

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

protected void Button1_Click(object sender, EventArgs e)


{
Conexao.Open();
//Define a instruo Sql
comando.CommandText = "DELETE FROM REGION WHERE REGIONID =
@REGIONID";
//Instncia e define o parametro
SqlParameter Parametro = 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();
}

O boto de incluso no tem surpresas, exceto pelo fato de utilizarmos duas


instncias da classe SqlParameter, uma para cada parmetro da instruo:
Protected Sub Button3_Click(ByVal sender As Object, ByVal e As
System.EventArgs) Handles Button3.Click

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

protected void Button3_Click(object sender, EventArgs e)


{
Conexao.Open();
//Define a instruo Sql
comando.CommandText = "INSERT INTO REGION
(REGIONID,REGIONDESCRIPTION) VALUES
(@REGIONID,@REGIONDESCRIPTION)";
//Primeiro Parmetro
SqlParameter Parametro = new SqlParameter();
Parametro.ParameterName = "@REGIONID";
Parametro.SqlDbType = SqlDbType.Int;
Parametro.Value = TextBoxCodigo.Text;
comando.Parameters.Add(Parametro);
//Segundo Parmetro
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();
}

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

protected void Page_Load(object sender, EventArgs e)


{
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 (!IsPostBack)
{
RecuperaRegioes();
}
}

Se voc se perdeu em algum ponto, segue abaixo a listagem de todo o cdigo do


arquivo code behind:
Imports System.Data.SqlClient
Imports System.Data
Partial Class Default4
Inherits System.Web.UI.Page
Private Conexao As New SqlConnection
Private Comando As New SqlCommand

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

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

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

Protected Sub Button3_Click(ByVal sender As Object, ByVal e As


System.EventArgs) Handles Button3.Click

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;

public partial class Default7 : System.Web.UI.Page


{

private SqlConnection Conexao = new SqlConnection();


private SqlCommand comando = new SqlCommand();

private void RecuperaRegioes()


{
Conexao.Open();
//Define a instruo Sql
comando.CommandText = "SELECT REGIONID,REGIONDESCRIPTION FROM REGION";
//Instncia um SqlDataReader
SqlDataReader DataReader = comando.ExecuteReader();
//Popula o ListBox
{
ListBox1.DataTextField = "REGIONDESCRIPTION";

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

protected void Page_Load(object sender, EventArgs e)


{
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 (!IsPostBack)
{
RecuperaRegioes();
}
}

protected void Button1_Click(object sender, EventArgs e)


{
Conexao.Open();
//Define a instruo Sql
comando.CommandText = "DELETE FROM REGION WHERE REGIONID = @REGIONID";
//Instncia e define o parametro
SqlParameter Parametro = 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();
}

protected void Button3_Click(object sender, EventArgs e)


{
Conexao.Open();
//Define a instruo Sql
comando.CommandText = "INSERT INTO REGION (REGIONID,REGIONDESCRIPTION)
VALUES (@REGIONID,@REGIONDESCRIPTION)";
//Primeiro Parmetro
SqlParameter Parametro = new SqlParameter();
Parametro.ParameterName = "@REGIONID";
Parametro.SqlDbType = SqlDbType.Int;
Parametro.Value = TextBoxCodigo.Text;
comando.Parameters.Add(Parametro);
//Segundo Parmetro

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:

Clique novamente em Next. Esta a etapa mais interessante de nosso Wizard.


Aqui o VS montar automaticamente todas as instrues SQL necessrias para a
configurao do controle. Na parte superior dois botes de rdio nos permitem escolher
entre criar uma instruo Sql ou Stored Procedure para execuo dos comandos ou

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:

Vamos ver o que cada opo significa:


Enable Paging: Habilita paginao em seu GridView. Para entender o que
paginao, lembre-se de quando voc faz uma busca na internet: voc pode
navegar entre os conjuntos de resultados atravs de nmeros, normalmente
dispostos no rodap da pgina. Cada nmero apresenta um conjunto de
resultados. A paginao do GridView apresenta, por padro, 10 linhas por pgina.
Este valor pode ser alterado atravs da propriedade PageSize.
Enable Sorting: Habilita ordenao do GridView por uma determinada Coluna.
Quando esta propriedade habilitada, o ttulo da coluna se torna um Link (voc
pode ver isso em tempo de design), que quando clicado ordena o resultado de
forma ascendente por aquela coluna. Clicando novamente na mesma coluna, a
ordenao se d de forma descendente.

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.

importante entender que algumas opes podem no estar disponveis. Por


exemplo, se no foi criada uma instruo Sql de Excluso no SqlDataSource, a opo
Enable Deleting no estar disponvel. Tambm cabe lembrar que algumas operaes
esto restritas integridade do banco de dados. Por exemplo, voc no vai conseguir
excluir um pedido se houver alguma integridade referencial com alguma outra tabela no
banco de dados. Rode a aplicao.

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.

Por que escolhemos as colunas CustomerID e CompanyName? CustomerID a


chave primria da tabela Customers, consequentemente a chave estrangeira na tabela
Orders que popula nosso GridView. Esta coluna necessria para identificar qual linha da
tabela deve ser exibida. CompanyName o campo que vai ser exibido ao usurio:

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.

----------------FIM DO MDULO III--------------

179
Este material deve ser utilizado apenas como parmetro de estudo deste Programa. Os crditos deste contedo so dados aos seus respectivos autores

Das könnte Ihnen auch gefallen