NET 2005
por Jlio Battisti. No Mercado Livre, somente o usurio GROZA que tem
Ao adquirir este ebook voc tem o direito de l-lo na tela do seu computador e de
cpia ou qualquer outro meio de reproduo, para outras pessoas. Se voc recebeu
este ebook atravs do e-mail ou via ftp de algum site da Internet, ou atravs de
um CD de Revista, saiba que voc est com uma cpia pirata, ilegal, no
Lei 5988. Se for este o caso entre em contato com o autor, atravs do e-mail
sobre novos cursos que gostaria de ver disponibilizados, entre em contato pelo e-
mail: webmaster@juliobattisti.com.br.
novidades:
Cursos de informtica.
NO AUTORIZADA
PREVISTA DE CADEIA
BATTISTI
Para que voc possa acompanhar as lies deste curso necessrio que voc j
Explorer.
Palavras do autor:
curso, envie-me tambm suas sugestes para que possamos sempre melhorar o
ndice do Curso
ndice do Curso............................................................................................ 7
Introduo .................................................................................................. 8
Capitulo 1 ................................................................................................. 11
Introduo ao ADO.NET............................................................................... 11
Capitulo 2 ................................................................................................. 71
Capitulo 3 ................................................................................................111
Capitulo 4 ................................................................................................255
Capitulo 5 ................................................................................................292
Capitulo 6 ................................................................................................298
Transaes ...............................................................................................298
Capitulo 7 ................................................................................................302
Introduo
Neste curso voc vai aprender a programar utilizando banco de dados com a
O C# junto com o Visual Studio .NET 2005 compe uma ferramenta extremamente
robusta e fcil de utilizar, com perfeito suporte a todas as novas ondas que rondam
para a plataforma .NET. Com uma interface amigvel e integrada com os ambientes
sofisticadas com todos os recursos existentes, sem ter que ficar criando parte de
atravs de diagramas.
Captulo 2: Neste capitulo voc vai aprender profundamente sobre conexo com
DataSet e o DataAdapter. Voc vai aprender tambm a utilizar o Visual Studio para
criar DataSets tipados criando assim uma camada de negocio separando sua
TableAdapter.
Captulo 4: Neste capitulo vamos estudar o modelo conectado atravs dos objetos
atualizar, excluir e exibir dados de forma conectada. Voc vai aprender tambm a
Captulo 5: Neste capitulo voc aprendera a tratar erros que podem acontecer
Para enviar suas dvidas referentes aos assuntos e exemplos abordados neste
para criticar e para elogiar (porque no?), s entrar em contato pelo e-mail:
Capitulo 1
Introduo ao ADO.NET
dados distintos, como SQL Server e Oracle ao mesmo tempo. Alm disso, algumas
vezes o nico acesso aos dados pode ser atravs de arquivos XML que fazem a
que tem mais do que um sistema rodando e muitas vezes os mesmos rodam em
plataformas diferentes.
Temos hoje vrios dispositivos que precisam acessar os dados, o prprio Bill Gates
tem falado a respeito da Informao da Palma da Mo, e isso cada vez mais
informaes.
atualmente.
Neste aspecto tenho me identificado e defendido a plataforma .NET pela sua alta
plataforma .NET tem amplo suporte a sua utilizao (XML), com classes e recursos
Dentro de cada namespace destes voc tem as classes para acesso e manipulao
aprendizado como voc ver durante o curso. Isso quer dizer que um objeto criado
dados do Microsoft Access e Microsoft SQL Server verso anterior a 7.0. Nada
impede voc de utilizar este namespace para Microsoft SQL Server verses 7.0 e
System.Data.SqlClient.
Voc pode acessar outros bancos de dados utilizando outros namespaces, mas
dados que deseja utilizar que geralmente eles tem a disposio os arquivos para
ter a sua disposio a instalao de classes feitas pela prpria Oracle que tem
Como voc vai ver durante todo esse livro eu gosto de trabalhar com vrios
Para acompanhar os exemplos voc vai precisar ter uma verso do Visual Studio
instalada em sua maquina, desde que ela seja na verso 2005 voc pode us-la
para as aplicaes web por serem uma verso gratuita que todos podem baixar
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 14
facilmente do site da Microsoft. Se tiver duvidas sobre onde baixar e como instalar
http://msdn.microsoft.com/vstudio/express/
Durante este curso vamos criar do comeo ao fim uma aplicao para
conforme formos aprofundando nela vamos entendendo cada vez mais o que o
regra de negcio desta aplicao, como eu disse, ela apenas um exemplo, a cada
capitulo voc vai compreender um pouco mais sobre ela e no final, com ela pronta
voc inclusive poder us-la para gerenciar seus prximos projetos de software.
Agora que j falamos sobre o nosso ambiente de produo vamos fazer nosso
em nossas aplicaes.
projetos. Nele voc vai aprender a criar e gerenciar um banco de dados utilizando o
Visual Studio .NET 2005 e vai conhecer alguns recursos que a ferramenta
exemplos estarei usando as verses Express, no entando voc pode usar qualquer
Solution Explorer, clique sobre o nome do projeto com o boto direito do mouse e
selecione a opo Add e clique sobre New Item como mostra a imagem:
4 Na janela Add New Item selecione SQL Database. Vamos dar o nome de
Projetos para o nosso banco de dados, para isso digite Projetos.mdf em Name e
A imagem abaixo mostra como ficou seu Solution Explorer agora que o banco de
utilizando uma verso Express do Visual Studio), voc pode encontrar a janela
dados.
Diagramas que nos permite ter uma viso do todo ao modelarmos nosso banco de
dados.
Sim.
diagrama tabelas que j estejam criadas no banco de dados, como ainda no temos
10 Vamos agora criar uma tabela, para isso clique com o boto direito sobre o
11 Voc questionado sobre qual o nome para a nova tabela. Digite Empresas e
12 Crie os campos conforme a imagem abaixo, note que temos trs colunas,
Column Name (nome da coluna), Data Type (tipo de dado que a coluna vai
armazenar) e Allow Null (se marcada permite valores nulos ou seja, o campo no
obrigatrio).
13 Precisamos definir agora um campo como chave primaria (Primary Key) para a
nossa tabela. Este campo precisa ser obrigatrio e no pode ter valores repetidos.
Ele serve como identificador nico para a tabela, como um cpf para ns, voc pode
encontrar varias pessoas com um nome igual, mas no com o mesmo cpf. No caso
da nossa tabela vamos setar a coluna EmpresaID como chave primaria, mas
poderia ser feito para a coluna CNPJ tambm, preferi criar um campo novo porque
pesquisas que so facilitadas com nmeros simples, do tipo inteiro, mas cada caso
um caso. Para definir EmpresaID como chave primaria, clique com o boto
direito sobre a mesma e selecione Set Primary Key como mostra a imagem:
16 Clique com o boto direito sobre o nome da tabela e selecione a opo Table
View. Aqui voc pode escolher entre as varias formas que deseja que a tabela seja
exibida no diagrama. Clique na opo Column Names para que seja apenas
exibido o nome das colunas facilitando a visualizao de varias tabelas j que agora
pressione CTRL+S.
Note na janela Database Explorer que agora foi adicionado o Diagram1 dentro
Ateno: Durante o curso, se voc estiver utilizando uma verso do Visual Studio
.NET 2005 que no seja uma verso Express entenda que sempre que eu me refirir
a janela Database Explorer no seu caso ser a janela Server Explorer. A janela
Vamos agora adicionar uma nova tabela no banco de dados. Vou fazer de uma
forma diferente para voc aprender, mas saiba que poderia usar o Diagrama
novamente se desejar.
21 Vamos definir a coluna TipoID como chave-primaria, para isso clique com o
imagem:
25 Note na janela Database Explorer que agora temo duas tabelas criadas.
26 Abra o Diagram1.
27 - Clique com o boto direito do mouse sobre o diagrama e escolha a opo Add
para adiconar a mesma no diagrama. Para fechar a janela Add Table clique em
Close.
A imagem a seguir mostra o diagrama agora com as duas tabelas. Note que na
tabela Empresas temos o campo TipoID. Este campo do tipo int, o mesmo
relacionamento esta sendo feito corretamente e dar um nome para o mesmo. Note
que a coluna TipoID da tabela Empresa conhecido como Foreign key, ou seja,
31 Clique em OK.
varias empresas com um mesmo tipo e cada empresa s pode ter um tipo.
A prxima imagem mostra o diagrama com os dados salvos. Voc pode notar que
sempre que fizer uma modificao e no salvar o asterisco (*) ao lado do nome da
no podemos ter uma Empresa que no tenha um tipo. Para adicionar valores
clique com o boto direito sobre o nome da tabela e selecione Show Table Data.
A tabela exibida. Como pode perceber no tem nenhum valor cadastrado ainda.
como Yes.
Agora que j criamos um banco de dados e duas tabelas vamos prosseguir com
nossa aplicao.
iniciado um assistente que nos a ajuda a criar um Data Source (fonte de dados
42 Clique em Next.
44 Clique em Next.
utilizar na nossa aplicao. Vamos selecionar as duas tabelas que criamos como
46 Clique em Finish.
ProjetosDataSet como mostra a imagem. Sei que voc esta bem curioso sobre
este objeto, teremos um capitulo aprofundando sobre ele, por enquanto apenas
manipulao dos registros no banco de dados, vamos testar se estes mtodos esto
ok.
51 Note que agora temos as duas tabelas na janela Data Sources. Clique em
abaixo:
projetosDataSet
empresasBindingSource
empresasTableAdapter
empresasBindingNavigator
frm.Show();
55 Execute a aplicao.
teste. Aps clique no disquete na mesma barra para salvar como mostra a imagem:
dos registros que voc inseriu na execuo anterior esto l. Essa duvida a
campe que eu recebo nos meus e-mails. Aparentemente parece estar tudo ok,
58 Na janela Solution Explorer clique no boto Show All Files como mostra a
imagem:
Perceba que dentro da pasta debug temos um arquivo do banco de dados. Quando
no o que esta diretamente na pasta dos projetos. Isso quer dizer que sempre que
executamos nossa aplicao esse banco substitudo por aquele, que no tem as
projetar.
Output Directory para Do not copy. Isso far com que o banco de dados nunca
S que agora para que sua aplicao funcione adequadamente necessrio uma
comando DataDirectory que retorna para a aplicao qual o caminho que esta o
manualmente onde esta o banco de dados que voc quer manipular, como eu fiz na
imagem abaixo:
Esse caminho pode variar dependendo de onde voc esta salvando seu projeto no
disco rgido. nesse local que voc configura o caminho do banco de dados
Quero salientar que esse problema com o banco de dados sendo adicionado na
banco de dados Access que tambm fica sendo armazenado junto com a aplicao.
precisa se preocupar com isso j que os arquivos do banco de dados esto l. Neste
caso voc apenas vai precisar informar na sua aplicao o nome ou ip do servidor,
de dados.
Para finalizarmos este capitulo eu quero apenas fazer mais um ajuste no nosso
ele esta cadastrando. Ele sabe que um fornecedor, mas qual o cdigo do
fornecedor mesmo?
Vamos agora ajuda-lo a solucionar este problema, sem que ele tenha que abrir um
64 Marque a opo Use data bound items, aparecem novas opes como
mostra a imagem:
TipoEmpresa.
TipoID para Value Member. Isso quer dizer que queremos que o ComboBox
TipoEmpresa com o campo TipoID da tabela Empresas, o resultado voc vai ver
Agora o usurio pode escolher o tipo de empresa facilmente, sem precisar decorar
Capitulo 2
No capitulo anterior usamos os assistentes do Visual Studio .NET 2005 para tudo,
banco de dados. Voc vai aprender tambm a utilizar o objeto Command para
Connection. Para criar este objeto voc vai precisar da string de conexo, que
informa ao objeto sobre como e em qual banco de dados ele deve se conectar.
Se voc estiver utilizando o banco de dados SQL Server vai criar o objeto
Connection assim:
SqlConnection conn;
Agora se voc estiver utilizando um banco de dados Access, por exemplo, vai criar
o objeto assim:
OleDbConnection conn;
vai acontecer para qualquer tipo de banco de dados que voc for utilizar, o objeto
os objetos do ADO.NET. Isso vai facilitar sua vida e aprendizado fazendo com que
Voc pode declarar e inicializar o objeto na mesma linha como mostra o exemplo
E Access:
String de Conexo
Vamos falar agora sobre a string de conexo (Connection String). atravs dela
que vamos informar ao objeto Connection onde esta nosso banco de dados, qual o
Data
Source=200.150.7.8;"
Nome ou endereo IP da maquina
mdb;
Initial
Initial Catalog Nome do banco de dados.
Catalog=Projetos;
User ID e Password.
exceo/erro na tentativa de
conexo.
conexo.
aberta.
Veja como exemplo uma string de conexo semelhante a que estamos utilizando na
nossa aplicao de exemplo para o banco de dados SQL Server Express 2005:
O prximo exemplo mostra uma string de conexo com um banco de dados SQL
Security=SSPI;database=NomedoBancodeDados;server=MeuServidorSQL;"
O prximo exemplo ilustra uma string de conexo com banco de dados SQL Server
Catalog=NomedoBancodeDados;Server=MeuServidorSQL"
O exemplo seguinte mostra uma string de conexo com banco de dados Access:
NomedoBancodeDados.mdb;User ID=Admin;Password=;
conn.ConnectionString = strconn;
Suponha que strconn no cdigo acima uma varivel do tipo string que armazena
Voc pode fazer tudo em uma linha, ou seja, criar o objeto Connection, inicializa-lo
de dados e recupera um valor, mas antes de mais nada vamos terminar de criar as
Vamos adicionar agora as tabelas que faltam para o nosso projeto. Como voc j
3 Vamos adicionar a tabela Contato, para isso clique com o boto direito sobre o
pressione OK.
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 79
6 Clique com o boto direito sobre o campo ContatoID e selecione Set Primary
Key como mostra a prxima imagem. Isso define o campo ContatoID como
ou seja, podem ter duas pessoas com o mesmo nome, mas no com o mesmo
ContatoID.
Properties marque Yes para a propriedade (Is Identity) que esta dentro de
8 Clique com o boto direito sobre a janela que representa a tabela contato,
estiverem no modo de visualizao Standart faa o mesmo para cada uma delas
Como voc pode perceber na prxima imagem a tabela Contato tem um campo
mesmo tipo, ou seja, tipo int. Vamos us-los para relacionar as duas tabelas, assim
trabalha.
imagem:
key table), ou seja a tabela que contem a Primary Key com o campo
tabela que contem a Foreign key. As duas colunas no precisam ter o mesmo
nome, mas sim o mesmo tipo. Eu costumo dar o mesmo nome para os campos,
mas para quem esta comeando pode ser interessante nomear o campo da chave
fkEmpresaID.
10 Clique em OK.
12 Vamos agora adicionar uma nova tabela chamada Projeto com os campos
Yes.
Note tambm que apenas o campo Obs esta marcado na coluna Allow Nulls. Isso
quer dizer que quando voc inserir um registro na tabela Projeto, ou seja, quando
voc for criar um projeto, apenas o campo Obs no obrigatrio, voc vai precisar
informar um nome, empresa, data de inicio e data de fim para inserir o registro.
13 Vamos agora criar uma nova tabela chamada Tarefa como mostra a prxima
imagem:
Note que todos os campos so obrigatrios menos o campo Fim que deve ser
TarefaID e temos uma chave secundria chamada ProjetoID para relacionar uma
A prxima imagem mostra nosso diagrama agora com todas as tabelas criadas.
relacionamentos criados:
O diagrama acima mostra que cada empresa pode ter vrios projetos, mas um
tabela Projeto e Tarefa. Cada Empresa tambm pode ter vrios contatos, mas um
16 A prxima janela apenas mostra todas as tabelas que sero afetas com as
Agora que todas as tabelas esto criadas vamos voltar agora ao nosso assunto
Explorer clique com o boto direito sobre o nome do projeto, selecione Add e
mostra a imagem:
a prxima imagem:
String strConn;
strConn = @"Data
Source=.\SQLEXPRESS;AttachDbFilename=C:\Projetos\ControleProjetos\Cont
roleProjetos\Projetos.mdf;Integrated Security=True;User
Instance=True";
SqlConnection conn;
SqlConnection conn;
System.Data.SqlClient.SqlConnection conn;
Ou seja, vai precisar fazer referencia ao namespace na hora que for declarar cada
string de conexo:
String strConn;
strConn = @"Data
Source=.\SQLEXPRESS;AttachDbFilename=C:\Projetos\ControleProjetos\Cont
roleProjetos\Projetos.mdf;Integrated Security=True;User
Instance=True";
SqlConnection conn;
conn.ConnectionString = strConn;
Ns poderamos ter feito isso tudo em apenas uma linha, desta forma:
SqlCommand cmd;
cmd.Connection = conn;
conn.Open();
label1.Text = cmd.ExecuteScalar().ToString();
conn.Close();
Para que ele possa fazer isso voc precisa informar para o mesmo:
1. O comando SQL.
comando SQL.
As seguintes linhas de cdigo foram usadas para declarar uma varivel do tipo
SqlCommand cmd;
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 100
O comando SQL (SELECT COUNT) que vamos utilizar tem o objetivo de retornar o
cmd.Connection = conn;
O cdigo seguinte usado para abrir a conexo, executar o comando SQL e fechar
a conexo:
conn.Open();
label1.Text = cmd.ExecuteScalar().ToString();
conn.Close();
que encontrar.
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 101
frm.Show();
CadastroContato:
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 103
do Visual Studio 2005) localize a tabela Contato, clique com o boto direito sobre a
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 104
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 105
aplicao vai ser disponibilizada para vrios clientes o problema ainda maior
porque da forma que fizemos toda vez que mudar algum parmetro na string de
local que tivermos criado a string de conexo, compilar o programa denovo e ento
e que este local seja fcil de ser modificado sem que nossa aplicao precise ser
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 106
que fique acessvel para a aplicao. Esse arquivo o app.config, falamos sobre
primeiro capitulo.
ver no arquivo, voc vai precisar deste nome para acessar o contedo
programaticamente.
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 107
ControleProjetos.Properties.Settings.Default["ProjetosConnectionString
"].ToString();
strConn = @"Data
Source=.\SQLEXPRESS;AttachDbFilename=C:\Projetos\ControleProjeto
s\ControleProjetos\Projetos.mdf;Integrated Security=True;User
Instance=True";
strConn =
ControleProjetos.Properties.Settings.Default["ProjetosConnection
String"].ToString();
Agora toda vez que formos utilizar nossa string de conexo vamos usar o cdigo
manuteno futura.
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 108
Connection Pooling
Para finalizar este capitulo quero abordar um ltimo assunto que associado
Pooling) que atua como uma fila de conexes. Na pratica o que acontece que
quando voc fecha sua conexo com o banco de dados ela no fechada (isso no
quer dizer que voc no precise fechar a conexo) e sim fica disponvel no Pool de
conexes, quando uma nova conexo aberta verificado se tem uma conexo no
uma conexo disponivel ser aberta uma nova com o banco de dados. Isso quer
dizer que uma conexo pode ser reaproveitada atravs do recurso Connection
sempre com o mesmo objetivo. O provider para o SQL Server, por exemplo, s
tempo. Tambm temos um limite das conexes que podem ficar no Pool para
programadores.
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 109
Catalog=NomedoBancodeDados;Server=MeuServidorSQL;Pooling=False;"
timeout.
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 110
Capitulo 3
aprendemos no capitulo anterior para explorar um pouco essa grande novidade que
desconectado do banco de dados onde voc pode manipular dados sem que a
desfeita. Voc ento manipula os dados no objeto Dataset sem estar conectado
com o banco de dados. S quando voc desejar persistir as alteraes feitas ento
O objeto Dataset
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 111
Primeiro vou mostrar pra voc como criar um objeto DataSet programaticamente.
Logo depois voc vai conhecer os novos recursos que o Visual Studio 2005 tem
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 112
o seguinte cdigo:
String strConn =
ControleProjetos.Properties.Settings.Default["ProjetosConnectionString
"].ToString();
contato",conn);
da.Fill(ds);
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 113
dataGridView1.DataSource = ds.Tables[0];
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 114
String strConn =
ControleProjetos.Properties.Settings.Default["ProjetosConnectionString
"].ToString();
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 115
O objeto SqlDataAdapter pode ser novo para voc. Com o seguinte cdigo um
entanto a forma de usar bem diferente porque este objeto gerencia a conexo
contato",conn);
ele recupera do banco de dados em um objeto DataSet. Como pode ver, para
executar o mtodo Fill no necessrio nem abrir, nem fechar a conexo como
DataSet e a conexo desfeita do banco de dados. O cdigo seguinte foi usado para
da.Fill(ds);
Os dados que esto no objeto DataSet podem ser usados de diversas maneiras e
parmetro. Um objeto DataSet pode conter vrias tabelas, por isso importante
informar qual tabela utilizar no DataSource. Voc pode fazer isso de duas formas,
uma indicando o nome da tabela e outro o ndice da mesma. Como s temos uma
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 116
tabela no DataSet ela possui o ndice zero (0) que foi informado usando o cdigo
abaixo:
dataGridView1.DataSource = ds.Tables[0];
e assim por diante. Para dar um nome para uma tabela voc precisa passar mais
da.Fill(ds,"Contato");
Ento voc poderia ao invs de informar o ndice passar o nome da tabela como o
seguinte cdigo:
dataGridView1.DataSource = ds.Tables["Contato"];
Para adicionar uma segunda tabela no DataSet voc pode usar o mesmo objeto
ComboBox.
listBox1.DataSource = ds.Tables[0];
listBox1.DisplayMember = "Nome";
listBox1.ValueMember = "ContatoID";
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 117
7 Execute sua aplicao. Veja que agora o ListBox esta preenchido com o nome
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 118
ValueMember.
DisplayMember a coluna que vai ser exibida no controle. Para cada item exibido
mais comum como fizemos). Lembre-se que podemos ter dois clientes com o
mesmo nome, mas no com o mesmo cdigo. o cdigo que iremos recuperar do
controle se precisarmos recuperar outros valores da tabela clientes por ele ser
nico.
porque facilita a integrao entre sistemas. Para voc ver como os dados so
Click do Button1.
ds.WriteXml(@"c:\contato.xml");
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 119
Veja que o arquivo criado tem os dados da tabela conforme nosso comando SQL no
formato XML. Esse arquivo pode ser facilmente transportado ou usado por outras
aplicaes.
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 120
Voc pode utilizar o mtodo ReadXML para popular (carregar) o objeto DataSet
ds.ReadXml(@"c:\contato.xml");
10 - O DataSet tambm tem associado a ele um XML Schema (XSD) que serve
ds.WriteXmlSchema(@"c:\contato.xsd");
Se voc abrir o arquivo XSD criado no Visual Studio poder ver na janela Properties
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 122
Agora se voc abrir o arquivo XSD no Bloco de Notas ver o seguinte contedo:
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 123
quais colunas, seus tipos e outras propriedades que podem ser usadas para validar
arquivo XML poder tambm carregar o XSD do arquivo XML em questo. Para isso
ds.ReadXmlSchema(@"c:\contato.xsd");
Como comentamos um objeto DataSet pode armazenar mais do que uma tabela.
dt.TableName = "Estado";
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 124
dcEstadoID.ColumnName = "pkEstadoID";
dcEstadoID.DataType = System.Type.GetType("System.Int32");
Framework:
System.Boolean
System.Byte
System.Char
System.DateTime
System.Decimal
System.Double
System.Int16
System.Int32
System.Int64
System.SByte
System.Single
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 125
System.String
System.TimeSpan
System.UInt16
System.UInt32
System.UInt64
dcEstadoID.ReadOnly = true;
dcEstadoID.AllowDBNull = false;
registros com valores duplicados. Ela pode receber valor true ou false:
dcEstadoID.Unique = true;
dcEstadoID.AutoIncrement = true;
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 126
dcEstadoID.AutoIncrementStep = 1;
dcEstadoID.Caption = "Cdigo";
padro para a coluna. claro que no faz sentido usar essa propriedade com uma
dcEstadoID.DefaultValue = 1;
imagem:
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 127
dt.TableName = "Estado";
dcEstadoID.ColumnName = "pkEstadoID";
dcEstadoID.DataType = System.Type.GetType("System.Int32");
dcEstadoID.ReadOnly = true;
dcEstadoID.AllowDBNull = false;
dcEstadoID.Unique = true;
dcEstadoID.AutoIncrement = true;
dcEstadoID.AutoIncrementSeed = 1;
dcEstadoID.AutoIncrementStep = 1;
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 128
dcEstado.ColumnName = "Estado";
dcEstado.DataType = System.Type.GetType("System.String");
dcEstado.AllowDBNull = false;
dcEstado.Unique = true;
O cdigo acima cria uma DataTable chamada Estado e cria tambm duas
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 129
DataTable Estado, para isso usamos o mtodo Add como mostra o cdigo:
dt.Columns.Add(dcEstadoID);
dt.Columns.Add(dcEstado);
Seu painel de cdigo agora com o cdigo que adiciona as colunas na DataTable
Estado:
Agora que criamos nossa tabela (DataTable) vamos adicionar registros nela. Para
DataRow row;
row = dt.NewRow();
row["Estado"] = "PR";
dt.Rows.Add(row);
Como voc pode ver no cdigo acima, primeiro declaramos o DataRow (demos no
a coluna Estado. Se tivssemos mais colunas poderamos atribuir valor a cada uma
delas da mesma forma, apenas mundando o nome da coluna. Ento para finalizar
DataRow row;
row = dt.NewRow();
row["Estado"] = "PR";
dt.Rows.Add(row);
row = dt.NewRow();
row["Estado"] = "SP";
dt.Rows.Add(row);
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 131
que executado pelo evento button1_Click ele s esta disponvel para ser
acessado dentro deste mtodo. Ento antes de qualquer coisa vamos mover a linha
que cria objeto DataSet de dentro do evento button1_Click para fora do mesmo
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 132
ds.Tables.Add(dt);
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 133
Se voc aps utilizar o mtodo WriteXML agora ver que temos duas tabelas no
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 134
comboBox1.DataSource = ds.Tables["Estado"];
comboBox1.DisplayMember = "Estado";
comboBox1.ValueMember = "pkEstadoID";
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 135
dos botes do 1 ao 3 para testar. Agora seu DataSet usado tanto para
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 136
O objeto DataAdapter
entre o objeto DataSet e o banco de dados. Mas ele no serve apenas para fazer
consultas (comando SELECT), pode ter associado e ele tambm comandos para
SelectCommand
InsertCommand
UpdateCommand
DeleteCommand
contato",conn);
Connection (conn).
DeleteCommand que sero usados para inserir, atualizar e excluir dados do banco
todos os mtodos da classe. Para isso coloque o seguinte cdigo logo abaixo do que
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 138
o seguinte:
contato",conn);
da.SelectCommand.Connection = conn;
@DataNascimento, @Observacao)";
da.InsertCommand.Parameters.Add("@EmpresaID",
SqlDbType.Int, 4, "EmpresaID");
da.InsertCommand.Parameters.Add("@Nome",
da.InsertCommand.Parameters.Add("@Cargo",
da.InsertCommand.Parameters.Add("@Telefone",
da.InsertCommand.Parameters.Add("@Celular",
da.InsertCommand.Parameters.Add("@Endereco",
da.InsertCommand.Parameters.Add("@Cidade",
da.InsertCommand.Parameters.Add("@UF", SqlDbType.VarChar,
2, "UF");
da.InsertCommand.Parameters.Add("@CEP", SqlDbType.VarChar,
9, "CEP");
da.InsertCommand.Parameters.Add("@Email",
da.InsertCommand.Parameters.Add("@DataNascimento",
da.InsertCommand.Parameters.Add("@Observacao",
da.InsertCommand.Connection = conn;
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 141
da.InsertCommand.Parameters.Add("@Email",
acordo com o banco e dados (no caso do SQL Server o tipos esto disponveis no
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 142
@ContatoID";
da.UpdateCommand.Parameters.Add("@EmpresaID",
SqlDbType.Int, 4, "EmpresaID");
da.UpdateCommand.Parameters.Add("@Nome",
da.UpdateCommand.Parameters.Add("@Cargo",
da.UpdateCommand.Parameters.Add("@Telefone",
da.UpdateCommand.Parameters.Add("@Celular",
da.UpdateCommand.Parameters.Add("@Endereco",
da.UpdateCommand.Parameters.Add("@Cidade",
da.UpdateCommand.Parameters.Add("@UF", SqlDbType.VarChar,
2, "UF");
da.UpdateCommand.Parameters.Add("@CEP", SqlDbType.VarChar,
9, "CEP");
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 143
da.UpdateCommand.Parameters.Add("@DataNascimento",
da.UpdateCommand.Parameters.Add("@Observacao",
SqlDbType.Text, 2, "Observacao");
da.UpdateCommand.Parameters.Add("@ContatoID",
da.UpdateCommand.Connection = conn;
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 144
ContatoID = @ContatoID";
da.DeleteCommand.Parameters.Add("@ContatoID",
SqlDbType.Int, 4, "ContatoID");
da.DeleteCommand.Connection = conn;
A prxima imagem mostra seu painel de cdigo aps a insero do cdigo para o
DeleteCommand:
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 145
parmetro.
da.Update(ds.Tables[0]);
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 146
27 - Voc pode colocar o cdigo acima no mtodo que desejar em seus programas,
Note que necessrio informar qual objeto DataSet e sua respectiva tabela sero
28 - Vamos agora criar um DataSet utilizando o Visual Studio 2005, para isso na
janela Solution Explorer clique com o boto direito sobre o nome do projeto,
Add.
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 148
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 149
Contato.
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 150
Note que foi criado uma representao da tabela (objeto DataTable) chamada
objeto DataAdapter para permitir manipulao dos dados desta tabela no banco
de dados.
A prxima imagem mostra agora o nosso DataSet com as duas tabelas, note que
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 151
Esse tipo de DataSet criado pelo Visual Studio conhecido como DataSet tipado.
Isso porque o Visual Studio cria automaticamente uma classe que identifica a
estrutura das tabelas, colunas e linhas do DataSet, o que facilita o uso do mesmo
com o boto direito sobre Fill, GetData() e selecione Preview Data como mostra
a imagem:
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 152
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 153
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 154
DataSet tipado com mtodos que j nos ajudam a inserir e atualizar os dados.
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 155
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 156
imagem:
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 157
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 158
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 159
Antes de executar sua aplicao note que foi criado mais uma string de conexo
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 160
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 161
app.config para cada banco de dados que voc ira utilizar. Concordo que as duas
mostra a imagem:
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 162
isso:
mostra a imagem:
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 163
projetoTableAdapter.Update(dsControleProjetos.Projeto);
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 164
43 Teste novamente sua aplicao. Agora para salvar os dados apenas clique
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 165
Right e a propriedade Dock do mesmo controle para none para que ele preencha
Como voc viu com duas linhas de cdigo (sendo que uma nem foi ns que
CadastroContato.
O objeto TableAdapter
DataAdapter. Isso porque o TableAdapter uma classe criada pelo Visual Studio
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 166
Primeiro vamos criar uma consulta que retorna apenas o cdigo da empresa e o
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 167
uma store procedure no banco de dados para voc (segunda opo) ou voc pode
prxima imagem:
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 168
Agora voc precisa escolher que tipo de comando SQL voc deseja usar:
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 169
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 170
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 171
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 172
selecionados.
test-lo.
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 173
51 Clique em OK.
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 174
52 Clique em Next.
Agora voc precisa especificar o nome dos mtodos que sero utilizados para
recuperar dados.
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 175
54 Clique em Finish. (Se voc clicar em Next antes de Finish ser exibido um
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 176
Voc pode alterar a consulta novamente utilizando o mesmo assistente para isso
clique com o boto direito sobre o a mesma e selecione Configure como mostra a
prxima imagem:
56 Vamos agora adicionar uma consulta que retorna o cdigo e nome dos
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 177
novamente clique com o boto direito sobre Fill, GetData() s que desta vez em
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 178
registros.
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 179
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 180
Note na imagem acima que adicionei a clausula ORDER BY para ordenar por Nome
os projetos, ou seja, o resultado vai ser exibido em ordem alfabtica por Nome.
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 181
Tarefa informando o cdigo do mesmo. Para isso clique com o boto direito sobre
prxima imagem:
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 182
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 183
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 184
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 185
66 Clique em Next.
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 186
68 Clique em Next para visualizar o resumo do que ser feito atravs do Wizard
(Assistente):
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 187
69 Clique em Finish.
Para visualizar os dados voc pode clicar com o boto direito no mtodo que
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 188
Note que agora ser necessrio informar um valor para o parmetro TarefaID
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 189
registros (Update). Para isso clique com o boto direito sobre algum mtodo de
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 190
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 191
imagem:
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 192
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 193
73 Vamos alterar agora o comando Update sugerido pelo assistente para como
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 194
74 Clique em Next.
75 A prxima imagem mostra a tela que permite que voc altere o nome do
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 195
76 Agora temos um resumo das atividades que sero executadas pelo assistente.
Clique em Finish.
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 196
vez vamos utilizar Stored Procedure para voc se familiarizar com o uso das
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 197
78 Desta vez selecione a segunda opo que orienta o assistente a criar para ns
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 198
manipulao dos dados atravs dos mesmos. Eles permitem a validao dos dados
antes que os mesmos sejam inseridos no banco. Por estarem junto com o banco de
79 Selecione DELETE para o tipo de comando a ser criado como mostra a imagem
e clique em Next:
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 199
Como voc pode ver na prxima imagem, o assistente tambm j insere cdigo
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 200
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 201
81 Clique em Next.
de dados. Voc pode tambm visualizar o comando SQL que ser criado e
executado no banco de dados para a criao da stored procedure, para isso clique
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 202
A prxima imagem mostra o comando SQL que ser executado no banco de dados
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 203
imagem:
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 204
85 Clique em Next.
86 Agora sim, voc pode alterar o nome do comando que esta sendo criado.
Clique em Next.
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 205
87 Clique em next para visualizar o resumo das tarefas que sero executadas
pelo assistente.
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 206
88 Clique em Finish para concluir. O comando foi criar como mostra a imagem a
seguir. Note tambm que o cone de um comando que utiliza uma stored
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 207
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 208
(INSERT). Para isso novamente clique com o boto direito sobre algum mtodo de
90 Neste exemplo vamos criar e utilizar uma stored procedure tambm, por isso
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 209
91 Clique em Next.
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 210
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 211
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 212
94 Clique em Next.
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 213
em Next:
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 214
Finish.
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 215
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 216
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 217
Falta criarmos apenas duas Querys. Uma que retorna o total de tarefas de um
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 218
100 Selecione a segunda opo (SELECT which return a single value) porque
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 219
102 Adicione a clausula WHERE ao comando SQL como mostra a imagem abaixo.
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 220
e clique em Finish.
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 221
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 222
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 223
107 Clique novamente em Next para utilizar um SELECT que retorna um conjunto
de registros.
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 224
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 225
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 226
possuem mtodos para atualizao criados por padro como voc j sabe mas
criamos estes mtodos e vamos utiliza-los para que voc possa entender melhor
Para finalizar este capitulo note na janela Data Sources que temos dois DataSets
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 227
como fizemos no primeiro capitulo. Voc tem duas opes para a forma que sero
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 228
Voc tambm pode personalizar qual controle ser utilizando individualmente para
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 229
DataAdapter. Isso porque o TableAdapter uma classe criada pelo Visual Studio
imagem:
1 ListBox
2 DateTimePicker
1 TextBox
2 Button
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 230
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 231
ControleProjetos.dsControleProjetosTableAdapters
DataSet. Voc pode importar este namespace usando o comando using no topo
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 232
para manipular os dados da tabela Tarefa, para isso adicione o seguinte cdigo
dsControleProjetosTableAdapters.TarefaTableAdapter da = new
dsControleProjetosTableAdapters.TarefaTableAdapter();
117 Adicione tambm o seguinte cdigo que cria uma varivel que ser usada
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 233
voc compreenda aqui que voc poderia usar o mtodo Insert tranquilamente,
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 234
parmetros:
ProjetoID
Descricao
Inicio
Fim
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 235
this.dataFim.Value);
objeto MessageBox mostra uma mensagem informando que a tarefa foi inserida
com sucesso.
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 236
de digitar:
restante.
selecionado.
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 237
prxima imagem:
Note que para visualizar os eventos necessrio clicar no boto com um smbolo
de um raio.
frm.ProjetoID =
(int)this.dataGridView1.Rows[e.RowIndex].Cells[0].Value;
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 238
duplo no cabealho da linha (no lado direito). O cdigo que acabamos de digitar
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 239
123 Escolha uma data para inicio e outra para fim. Digite uma descrio para a
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 240
124 A prxima imagem mostra que a tarefa foi inserida com sucesso. Clique em
125 - Vamos adicionar agora o cdigo que lista as tarefas de acordo com o projeto
listBox1.DataSource = da.GetDataByProjetoID(ProjetoID);
listBox1.DisplayMember = "Inicio";
listBox1.ValueMember = "TarefaID";
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 241
mostra a imagem:
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 242
o seguinte cdigo:
using System.Data;
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 243
DataTable dt;
dt = da.GetDataTarefaID(tarefaID);
this.dataInicio.Value = (DateTime)dt.Rows[0]["Inicio"];
this.dataFim.Value = (DateTime)dt.Rows[0]["Fim"];
this.descricao.Text = dt.Rows[0]["Descricao"].ToString();
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 244
O mtodo acima recebe tarefaID por parmetro e usa o mesmo para recuperar os
(porque nunca teremos uma tarefa com o mesmo cdigo na tabela) usamos o
ndice 0 (zero) porque a primeira linha sempre tem ndice 0 (zero) como em um
array.
mostra a prxima imagem, ele apenas verifica se existe algum item no listBox1
primeira tarefa do listBox1. Com esse cdigo sempre que tivermos uma tarefa ela
if (listBox1.Items.Count > 0)
CarregarTarefa((int)listBox1.SelectedValue);
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 245
if (listBox1.SelectedValue.ToString() != "System.Data.DataRowView")
CarregarTarefa((int)listBox1.SelectedValue);
esta sendo criado, ou seja, quando o listBox1 esta sendo carregado pela primeira
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 246
131 Execute sua aplicao. Note que a primeira tarefa j aparece carregada e que
formulrio.
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 247
cdigo que prepara o formulrio para a insero de uma nova tarefa zerando os
if (button1.Text == "Adicionar")
button1.Text = "Cancelar";
button2.Text = "Inserir";
listBox1.Enabled = false;
dataInicio.Value = DateTime.Today;
dataFim.Value = DateTime.Today;
descricao.Text = "";
else
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 248
button1.Text = "Adicionar";
button2.Text = "Salvar";
listBox1.Enabled = true;
if (listBox1.Items.Count > 0)
CarregarTarefa((int)listBox1.SelectedValue);
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 249
propriedade Text do boto Salvar muda para Inserir. Se voc clicar em Cancelar
135 Vamos alterar o cdigo do evento button2_Click para que o mesmo alm
de adicionar tambm altere o a tarefa que esta sendo exibida. Para isso verificamos
para inserir uma nova tarefa, se no vamos executar cdigo para alterar a tarefa
selecionada. Segue o novo cdigo que deve ser inserido no evento button2_Click:
if (button2.Text == "Inserir")
da.InsertQuery(ProjetoID, this.descricao.Text,
this.dataInicio.Value, this.dataFim.Value);
button1.Text = "Adicionar";
button2.Text = "Salvar";
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 250
listBox1.DataSource =
da.GetDataByProjetoID(ProjetoID);
listBox1.Refresh();
else
da.UpdateQuery(ProjetoID, this.descricao.Text,
this.dataInicio.Value, this.dataFim.Value,
(int)listBox1.SelectedValue);
carregar novamente o listBox1 para que a nova tarefa seja listada, por isso
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 251
possibilidade de excluir uma tarefa indesejada. Para isso adicione um novo boto ao
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 252
if (listBox1.Items.Count > 0)
da.DeleteQuery((int)listBox1.SelectedValue);
listBox1.DataSource =
da.GetDataByProjetoID(ProjetoID);
listBox1.Refresh();
else
{
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 253
O cdigo acima utiliza o mtodo DeleteQuery para excluir uma tarefa. Mas antes
verifica se possui alguma tarefa para que possa ser excluda seno exibe a
mensagem a seguir:
A prxima imagem mostra a mensagem que exibida quando a tarefa for excluda
com sucesso.
percebeu o quanto esse objeto pode ser til e produtivo em suas aplicaes.
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 254
Capitulo 4
TableAdapter, mas esses objetos usam muito mais recursos do que o simples
imagine que voc tenha 1.000 usuarios no servidor com cada um deles com um
objeto DataSet passa a no ser interessante (veja bem, eu falei muitas vezes e
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 255
web necessrio voc pode utilizar variveis de sesso (session), por exemplo.
algumas aplicaes Windows porque no) voc pode utilizar o modelo conectado
no capitulo dois.
Connection ele executa comandos SQL que permitem recuperar, inserir, atualizar
Como falamos no capitulo dois, para executar o objeto Command voc tem trs
mtodos principais:
que encontrar.
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 256
Vamos agora aprender na pratica como utilizar o modelo conectado focando nos
prxima imagem mostra os controles que esto neste formulrio que foram usados
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 257
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 258
O label1 utiliza o cdigo seguinte que criamos no capitulo dois para recuperar o
consulte o capitulo dois por que agora vamos nos concentrar no aprendizado dos
String strConn;
strConn =
ControleProjetos.Properties.Settings.Default["ProjetosConnectionString
"].ToString();
SqlConnection conn;
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 259
conn.ConnectionString = strConn;
SqlCommand cmd;
cmd.Connection = conn;
conn.Open();
label1.Text = cmd.ExecuteScalar().ToString();
conn.Close();
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 260
using System.Data.SqlClient;
tambm mostra como organiza-los e quais devem ser os valores das propriedades
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 261
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 262
armazenar.
cmbEmpresa.
dsControleProjetosTableAdapters.ContatoTableAdapter da
= new dsControleProjetosTableAdapters.ContatoTableAdapter();
listBox1.DataSource = da.GetData();
listBox1.DisplayMember = "Nome";
listBox1.ValueMember = "ContatoID";
listBox1.Refresh();
A prxima imagem mostra seu painel cdigo com o mtodo que acabamos de
adicionar:
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 263
cmbEmpresa.Items.Clear();
dsControleProjetosTableAdapters.EmpresasTableAdapter da =
new dsControleProjetosTableAdapters.EmpresasTableAdapter();
cmbEmpresa.DataSource = da.GetDataForLists();
cmbEmpresa.DisplayMember = "CNPJ";
cmbEmpresa.ValueMember = "EmpresaID";
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 264
parmetro. Esse mtodo vai utilizar o modelo conectado atravs dos objetos
SqlConnection(ControleProjetos.Properties.Settings.Default["ProjetosCo
nnectionString"].ToString());
SqlDataReader dr;
conn.Open();
dr = cmd.ExecuteReader();
if (dr.HasRows)
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 265
dr.Read();
txtNome.Text = dr["Nome"].ToString();
cmbEmpresa.SelectedValue = dr["EmpresaID"].ToString();
txtCargo.Text = dr["Cargo"].ToString();
txtTelefone.Text = dr["Telefone"].ToString();
txtCelular.Text = dr["Celular"].ToString();
txtEndereco.Text = dr["Endereco"].ToString();
txtCidade.Text = dr["Cidade"].ToString();
txtUF.Text = dr["UF"].ToString();
txtCEP.Text = dr["CEP"].ToString();
txtEmail.Text = dr["Email"].ToString();
txtNascimento.Text =
DateTime.Parse(dr["DataNascimento"].ToString()).ToShortDateString();
txtObservacao.Text = dr["Observacao"].ToString();
conn.Close();
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 266
Para utilizar o objeto Command precisamos informar o comando SQL e qual objeto
Connection ele deve utilizar para executar o comando. Fizemos isso utilizando a
" + contatoID;
cmd.Connection = conn;
SqlDataReader dr;
conn.Open();
dr = cmd.ExecuteReader();
por exemplo).
dr.HasRows
dr.Read();
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 268
frente e no modo de leitura apenas. Isso quer dizer que no podemos alterar
registros usando o DataReader e nem voltar para traz na leitura, apenas para a
frente. Toda vez que executamos o mtodo Read ele move para o prximo
registro.
uma vez como fizemos no exemplo. Isso porque no inicio o DataReader aponta
para um local conhecido como BOF (Begin Of File) que no tem nenhum dado.
Quando usado o mtodo Read pela primeira vez o cursor ento posicionado no
primeiro registro. Cada vez que o mtodo Read for executado o cursor move para
ultrapassar o ltimo registro. Neste caso mtodo Read retorna o valor False. Isso
permite que voc utilize esse mtodo para varrer toda uma tabela atravs de uma
while (dr.Read()) {
listBox1.Items.Add(dr["Nome"].ToString());
coluna:
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 269
txtNome.Text = dr[0].ToString();
O ndice 0 (zero) ser o Nome e o 1 (um) o Telefone ou seja, a ordem dos ndices
Sempre necessrio fechar a conexo quando a mesma no for mais ser utilizada
conn.Close();
CarregarContatos();
CarregarEmpresas();
if (listBox1.Items.Count > 0)
CarregaContato((int)listBox1.SelectedValue);
Se voc executar e testar sua aplicao agora como mostra a prxima ser exibido
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 271
contato no listBox1 sejam exibidos seus dados nos controles a direita, para isso de
if (listBox1.SelectedValue.ToString() != "System.Data.DataRowView")
CarregaContato((int)listBox1.SelectedValue);
A prxima imagem mostra seu painel de cdigo com as instrues que acabamos
que o formulrio esta sendo criado, ou seja, quando esta o listBox1 esta sendo
carregado pela primeira vez. Sem esse if teramos um erro ao abrir o formulrio.
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 272
Se voc testar sua aplicao agora poder navegar entre os contatos cadastrados
no listBox1 de forma que seus dados sejam exibidos nos controles conforme
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 273
Lembre-se que ser necessrio utilizar sempre o objeto DataReader quando voc
caso.
Command que sempre usado quando formos utilizar os comandos SQL para
if (btnAdicionar.Text == "Adicionar")
btnAdicionar.Text = "Cancelar";
btnInserir.Text = "Inserir";
listBox1.Enabled = false;
txtNome.Text = "";
cmbEmpresa.SelectedIndex = 0;
txtCargo.Text = "";
txtTelefone.Text = "";
txtCelular.Text = "";
txtEndereco.Text = "";
txtCidade.Text = "";
txtUF.Text = "";
txtCEP.Text = "";
txtEmail.Text = "";
txtNascimento.Text = "";
txtObservacao.Text = "";
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 274
else
btnAdicionar.Text = "Adicionar";
btnInserir.Text = "Salvar";
listBox1.Enabled = true;
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 275
16 Vamos agora implementar o cdigo que permite inserir e atualizar dados. Para
isso de um clique duplo sobre o boto btnInserir e digite o seguinte cdigo dentro
if (btnInserir.Text == "Inserir")
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 276
txtObservacao.Text + "')";
btnAdicionar.Text = "Adicionar";
btnInserir.Text = "Salvar";
listBox1.Enabled = true;
else
listBox1.SelectedValue.ToString();
SqlConnection(ControleProjetos.Properties.Settings.Default["ProjetosCo
nnectionString"].ToString());
conn.Open();
cmd.ExecuteNonQuery();
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 277
CarregarContatos();
MessageBox.Show(strMensagem);
Note que primeiramente declaramos duas variveis, uma que armazena o comando
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 278
if (btnInserir.Text == "Inserir")
btnAdicionar.Text = "Adicionar";
btnInserir.Text = "Salvar";
listBox1.Enabled = true;
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 279
criar uma string com o comando a ser executado com os valores que sero
atualizados. Note aqui a claususa WHERE que permite identificar qual contato ter
listBox1.SelectedValue.ToString();
O que fizemos at aqui foi apenas montar o comando apropriadado, voc pode
fazer da maneira que desejar, mas lembre-se que ser necessrio informar o
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 280
SqlConnection(ControleProjetos.Properties.Settings.Default["ProjetosCo
nnectionString"].ToString());
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();
ter sido feita uma insero necessrio que o novo contato seja exibido no
usurio:
CarregarContatos();
MessageBox.Show(strMensagem);
if (listBox1.Items.Count > 0)
SqlConnection(ControleProjetos.Properties.Settings.Default["ProjetosCo
nnectionString"].ToString());
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 281
else
O cdigo acima apenas verifica se existe algum registro no listBox1 para saber se
algo pode ser excludo e se sim utiliza o objeto Command com o mtodo
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 282
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 283
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 284
imagem:
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 285
Contatos.
frm.ShowDialog();
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 286
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 287
diretamente os valores criando uma string do comando SQL. Esta uma forma
prtica e rpida, mas em uma aplicao WEB no muito segura porque permite o
uso de injeo de SQL, uma tcnica utilizada por Hackers para invadir seu site ou
aplicao web. Para evitar isso podemos utilizar parmetros, como fizemos com o
que mais simples para que voc possa compreender, mas voc pode aplicar os
conhecimentos adquiridos aqui com os outros comandos. Segue como ficaria nosso
SqlConnection(ControleProjetos.Properties.Settings.Default["ProjetosCo
nnectionString"].ToString());
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 288
cmd.Parameters.Add("@ContatoID", SqlDbType.Int, 4,
"ContatoID");
cmd.Parameters["@ContatoID"].Value =
(int)listBox1.SelectedValue;
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();
CarregarContatos();
Note que no cdigo acima mudamos apenas uma linha de cdigo (a que atribui o
cmd.Parameters.Add("@ContatoID", SqlDbType.Int, 4,
"ContatoID");
cmd.Parameters["@ContatoID"].Value =
(int)listBox1.SelectedValue;
sempre ter seu nome antecedido pelo smbolo de @. Eu costumo criar meus
parmetros sempre com o mesmo nome do campo que eles representam para
facilitar a identificao.
Access no suporta nome de parmetros como usamos aqui mas voc deve seguir
Todos os parmetros que nos criamos no comando SQL precisam ser criados e
seguinte cdigo:
Teremos uma linha de cdigo destas para cada parmetro do comando SQL, no
o nome do mesmo que precisa ser idntico ao usado no comando (menos no caso
do Acess), o tipo de dado que o parmetro recebe de acordo com o banco e dados
representa.
Depois dos parmetros criados precisamos informar um valor para cada um deles.
cmd.Parameters["@ContatoID"].Value = (int)listBox1.SelectedValue;
mesmo e quem recebe o valor a propriedade Value. O valor deve ser do tipo de
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 290
dados que o parmetro aceita, ou seja, o tipo que foi definido quando criamos o
parmetro.
Se voc desejar pode alterar o cdigo para excluso do formulrio como mostra a
prxima imagem:
Para finalizar este capitulo quero que voc saiba que pode utilizar ao invs de um
comando SQL uma Stored Procedure em seus programas. Para isso voc precisa
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 291
Capitulo 5
bancos de dados
esto associados a:
esta disponvel.
Por sua vez, os erros mais comuns quando tentamos executar um comando SQL
Para tratar erros com manipulao de dados voc pode usar a estrutura de
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 292
conn.Open();
catch (Exception e)
MessageBox.Show(e.Message);
tratar erros na hora da conexo. No cdigo acima caso ocorra um erro a mensagem
dados que voc esta utilizando) ajuda a determinar qual erro esta ocorrendo.
O seguinte cdigo demostra como utilizar esta classe para tratar erros usando, por
aplicao de exemplo.
try
conn.Open();
dr = cmd.ExecuteReader();
if (dr.HasRows)
dr.Read();
txtNome.Text = dr["Nome"].ToString();
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 293
dr["EmpresaID"].ToString();
txtCargo.Text = dr["Cargo"].ToString();
txtTelefone.Text = dr["Telefone"].ToString();
txtCelular.Text = dr["Celular"].ToString();
txtEndereco.Text = dr["Endereco"].ToString();
txtCidade.Text = dr["Cidade"].ToString();
txtUF.Text = dr["UF"].ToString();
txtCEP.Text = dr["CEP"].ToString();
txtEmail.Text = dr["Email"].ToString();
txtNascimento.Text =
DateTime.Parse(dr["DataNascimento"].ToString()).ToShortDateString();
txtObservacao.Text = dr["Observacao"].ToString();
catch (System.Data.SqlClient.SqlException e)
switch (e.Number)
case 17:
break;
case 156:
case 170:
break;
case 207:
break;
case 208:
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 294
break;
case 18452:
break;
case 18456:
MessageBox.Show("Password invalido");
break;
case 4060:
break;
catch (Exception e)
MessageBox.Show(e.Message);
finally
if (conn.State == ConnectionState.Open)
conn.Close();
retorna o numero do erro voc tem a sua disposio a propriedade Message que
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 295
LineNumber que retorna a linha do comando SQL ou Store Procedure que contem
o erro.
catch (System.Data.SqlClient.SqlException e)
switch (e.Number)
case 17:
break;
case 156:
case 170:
break;
case 207:
break;
case 208:
break;
case 18452:
break;
case 18456:
MessageBox.Show("Password invalido");
break;
case 4060:
break;
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 296
temos um outro catch no exemplo para tratar erros que a classe do Sql Server no
consegue tratar. Note que este catch deve estar sempre aps a classe
especializada porque ele trata qualquer erro de forma que o SqlException nunca
catch (Exception e)
MessageBox.Show(e.Message);
importante que voc verifique se a mesma esta aberta porque o bloco Finally
sempre executado, com erro ou no, ento se na hora que voc tentou abrir a
conexo teve um erro e tratou o mesmo agora conexo esta fechada de forma
que se voc executar o fechamento novamente vamos ter um novo erro, s que
finally
if (conn.State == ConnectionState.Open)
conn.Close();
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 297
Para uma lista completa das propriedades da classe SqlException voc pode
Capitulo 6
Transaes
compra e parte para finalizar o pedido. Para inserir o pedido no banco de dados
voc tem duas tabelas, uma que armazena os pedidos e outra os itens dos pedidos.
Ento voc precisa adicionar valores como numero do pedido, data, forma de
adicionados na tabela itens de pedido com suas respectivas quantidades, cada uma
quero que voc entenda que para inserir um pedido precisamos manipular duas
tabelas ao mesmo tempo, inserir o pedido e os itens. Vamos supor que o pedido foi
inserido corretamente, mas durante a insero dos itens ocorreu um erro. Foi
inserido o pedido, mas sem os produtos ou sem todos os produtos. Agora voc tem
isso pode lhe causar? Reclamaes... pedidos entregues incompletos e etc... Como
podemos contornar este problema sendo que antes de inserir um item de pedido
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 298
precisamos ter inserido j o pedido para termos o cdigo do mesmo que ser usado
erro tudo o que foi feito desfeito (conhecido como Roll Back) e se tudo ocorrer
banco de dados.
que uma transao ter sobre outras transaes que tiverem sendo
frequentemente tenta acessar dados que esto em uso por outra transao,
Para saber mais sobre isolao voc pode utilizar a documentao do Visual
devem ser garantidos pelo sistema mesmo em caso de uma falha, por
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 299
O processo de execuo de uma transao local pode ser definido em cinco passos:
escopo da transao.
O seguinte cdigo utiliza os passos acima para executar uma transao. Neste
exemplo para simplificar eu utilizei uma mesma tabela no banco de dados para que
voc possa se desejar testa-la na aplicao exemplo sem criar outras tabelas ou
SqlConnection(ControleProjetos.Properties.Settings.Default["ProjetosCo
nnectionString"].ToString());
conn.Open();
tran);
try
cmd1.ExecuteNonQuery();
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 300
tran.Commit();
MessageBox.Show("Sucesso!!!(Commit)");
catch
tran.Rollback();
MessageBox.Show("Erro!!!(Roll Back)");
finally
if (conn.State == ConnectionState.Open)
conn.Close();
Note que foi necessrio informar mais um parametro quando criamos os objetos
cmd1.Transaction = tran;
para tratar erros ou no usar o mtodo Rollback e tiver algum erro na execuo
automatica.
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 301
Capitulo 7
Nossa aplicao de exemplo esta quase pronta, apenas para termin-la vamos
neste capitulo relembrar alguns aspectos importantes do curso. Claro que devido a
modelo mais organizado e voc vai criar mais mtodos e algumas classes que o
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 302
Na janela Data Sources note que temos os dois DataSets criados na nossa
aplicao e que dentro deles temos os seus respectivos DataTables. Se voc clicar
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 303
Note que agora o cone que identifica o DataTable muda para representar a opo
escolhida:
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 304
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 305
O boto que acabamos de adicionar permitira abrir a janela que cadastra os tipos
frm.ShowDialog();
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 306
this.tipoEmpresaTableAdapter.Fill(this.projetosDataSet.TipoEmpresa);
this.comboBox1.Refresh();
adicional:
this.tipoEmpresaTableAdapter.Fill(this.projetosDataSet.TipoEmpresa);
this.comboBox1.Refresh();
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 307
frm.ShowDialog();
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 308
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 309
Agora a partir do formulrio de projetos voc pode navegar e abrir qualquer outro
Para sua aplicao ficar completa falta implementar validaes e formatar melhor
cada um dos controles tem muitas propriedades, mtodos e eventos que podem ser
utilizados. Mas nosso objetivo com o material foi atingido. Os conhecimento que
voc aprendeu aqui lhe do base para desenvolver suas aplicao e no faltam
ASP.NET, Web Services e aplicaes para dispositivos moveis. O mesmo serve para
curso como exemplo uma aplicao Windows e o banco de dados SQL Server.
Autor: Herbert Moroni Cavallari da Costa Gois blog: www.moroni.com.br Pgina 310