27/10/12
Desconectado de Acesso ao Banco de Dados « Felipe Pimentel
Felipe Pimentel
1. Início
Dando continuidade à nossa série de artigos, neste post vamos mostrar alguns exemplos de como
podemos estabelecer uma conexão e manipular dados no modelo desconectado. No artigo
anterior já discutimos as vantagens e desvantagens deste modelo, vide url:
http://fpimentel88.wordpress.com/2009/01/18/aprendendo-c-parte-1-acessando-um-banco-sql-
server-2005-com-adonet/ (http://fpimentel88.wordpress.com/2009/01/18/aprendendo-c-parte-1-
acessando-um-banco-sql-server-2005-com-adonet/)
A idéia do modelo desconectado é bastante simples: Recuperar dados do banco para a memória, e
manipulá-los sem ser necessário fazer novas requisições à database.
Para fazer isto, nós utilizamos algumas classes já discutidas no post anterior, que são eles:
1. SqlConnection – Objeto responsável por saber e mantér conexão com o banco de dados.
2. DataSet – Estrutura complexa que irá representar nossos dados em memória.
3. SqlDataAdapter – É uma ponte entre o Dataset e o SqlConnection. É o objeto responsável pelo
fluxo de dados entre a memória e o banco, e vice-versa.
3. Começando a codificar
O fluxo básico de qualquer modelo desconectado é sempre o mesmo: Resgata Dados –> Manipula
dados –> Sincroniza dados com banco.
Nesses nossos exemplos iremos utilizar a mesma estrutura do banco que o post anterior, ou seja,
as nossas operações serão em cima de nossa tabela “Pessoa”.
…wordpress.com/…/aprendendo-c-parte-2-modelo-desconectado-de-acesso-ao-banco-de-dados/ 1/17
2): Modelo
27/10/12
Desconectado de Acesso ao Banco de Dados « Felipe Pimentel
Caso não tenha acompanhado o primeiro post, volto à repetir: deem, nem que seja rapidamente,
uma lida no mesmo.
Vamos ser bastante direto nesse post, enrolando menos e fazendo mais exercícios práticos. Logo, o
nosso código para resgatar valores para a memória é:
2: {
5:
6: //
8: //
10:
11: //
13: //
15:
16: //
18: //
20:
21: //
…wordpress.com/…/aprendendo-c-parte-2-modelo-desconectado-de-acesso-ao-banco-de-dados/ 2/17
2): Modelo
27/10/12
Desconectado de Acesso ao Banco de Dados « Felipe Pimentel
23: //
24: adapter.Fill(ds);
25: }
Viram como é simples? Pois é. Seis linha de código e já temos os dados em mãos. Acho que não
tem nem o que explicar desse código, pois creio que todos entenderam que o SqlDataAdapter
funciona como uma ponte de dados entre banco e memória.
- “Opa Felipe. Mas esse seu código vai dar erro!!! Você esqueceu de abrir a conexão!!!”
Ao se utilizar o DataAdapter não precisamos ficar preocupado em abrir e fechar conexões. Pois,
por debaixo dos panos o adapter irá abrir a conexão, logo após irá executar o comando e em
seguida irá fechar a conexão com o banco, sendo tudo isso invisível ao usuário.
Um fato importante no SqlDataAdapter é que após executar o comando, ele deixa a conexão no
mesmo estado que ela se encontrava. Ou seja, caso a conexão se encontrasse aberta ao executar a
instrução “adapter.Fill(ds)” , o SqlDataAdapter permaneceria com a mesma aberta ao final do
comando.
- “Humm… Certo! Entendi! Trouxemos os dados do banco para o dataset, mas como consigo
listá-los?”
Como eu disse, o DataSet tem uma estrura semelhante ao banco, com tabelas, linhas, colunas. Da
seguinte maneira:
…wordpress.com/…/aprendendo-c-parte-2-modelo-desconectado-de-acesso-ao-banco-de-dados/ 3/17
2): Modelo
27/10/12
Desconectado de Acesso ao Banco de Dados « Felipe Pimentel
(http://fpimentel88.files.wordpress.com/2009/01/screenshot014.jpg)
Sabendo disso, podemos exibir nossos dados pegando a nossa primeira tabela do DataSet que é a
tabela de pessoa, em seguida podemos iterar nas linhas da mesma, da seguinte maneira:
2: {
5:
6: //
8: //
10:
…wordpress.com/…/aprendendo-c-parte-2-modelo-desconectado-de-acesso-ao-banco-de-dados/ 4/17
2): Modelo
27/10/12
Desconectado de Acesso ao Banco de Dados « Felipe Pimentel
11: //
13: //
15:
16: //
18: //
20:
21: //
23: //
24: adapter.Fill(ds);
25:
26: //
28: //
30:
31: //
33: //
35: {
36: //
…wordpress.com/…/aprendendo-c-parte-2-modelo-desconectado-de-acesso-ao-banco-de-dados/ 5/17
2): Modelo
27/10/12
Desconectado de Acesso ao Banco de Dados « Felipe Pimentel
38: //
40: }
41: }
Observe que as linhas estam indexadas. Ou seja, ao fazer “row[‘nome’]”, estou pegando o
nome de uma determinada linha.
Como falamos anteriormente, os dados serão manipulados em memória, ou seja, iremos adicionar
uma nova pessoa diretamente na DataTable.
Isso é bastante simples de se fazer. Básicamente, o objeto adapter possui um método chamado
Update, que recebe um DataSet como parâmetro, e com base nesse DataSet o Adapter faz as
modificações necessárias.
(http://fpimentel88.files.wordpress.com/2009/01/screenshot0011.jpg)
A resposta para essa pergunta, também é simples. Cada DataRow possui uma propriedade
chamada “RowState” e de acordo com seu valor o SqlDataAdapter irá tomar as providências
necessárias na hora da sincronização com o banco. A propriedade “RowState” pode assumer os
seguintes valores:
…wordpress.com/…/aprendendo-c-parte-2-modelo-desconectado-de-acesso-ao-banco-de-dados/ 6/17
2): Modelo
27/10/12
Desconectado de Acesso ao Banco de Dados « Felipe Pimentel
- “Que ótimo!!! Então quer dizer que só preciso chamar o Update() e pronto?”
Bem caros leitores, não é bem assim. Nem tudo é mar de rosas.
Antes de chamarmos o método Update() devemos configurar o nosso DataAdapter para que ele
aceite todos os comando (INSERT, UPDATE, DELETE).
Isso precisa ser feito, porque quando chamamos o método Update, ele sabe o que deve fazer com
cada linha. Ele sabe que deve inserir um linha, remover outra e talvez atualizar outra, por
exemplo. Mas o SqlDataAdapter por se só não sabe como fazer isto. Ou seja, ele sabe o que
precisa fazer, mas não como fazer. É por isto que devemos configurar cada comando. E isto é
feito da seguinte maneira:
2: {
6: cmd.Parameters.Add("dataNascimento", SqlDbType.SmallDateTime,
9: adapter.InsertCommand = cmd;
10: }
Este método é o respónsavel por configurar os comandos do SqlDataAdapter (Observe que fiz
apenas o insert, os outros comandos deixo como atividade para vocês);
Então com base em tudo que conversarmos, vamos finalmente inserir uma nova linha em nossa
DataRowCollection e em seguida sincronizar com o banco. Nosso código final ficará da seguinte
maneira:
2: {
4: Console.WriteLine("Nome ");
5: pessoa.Nome = Console.ReadLine();
6: Console.WriteLine("Email ");
7: pessoa.Email = Console.ReadLine();
8: Console.WriteLine("Sexo (M ou F) ");
9: pessoa.Sexo = Convert.ToChar(Console.ReadLine());
13: }
14:
16: {
17: //
19: //
21:
22: //
24: //
26:
…wordpress.com/…/aprendendo-c-parte-2-modelo-desconectado-de-acesso-ao-banco-de-dados/ 8/17
2): Modelo
27/10/12
Desconectado de Acesso ao Banco de Dados « Felipe Pimentel
32:
35: }
36:
38: {
41:
42: //
43: //Instância objeto que irá manipular e manter conexão com banco
44: //
46:
47: //
49: //
51:
52: //
54: //
56:
57:
9/17
2): Modelo
27/10/12
Desconectado de Acesso ao Banco de Dados « Felipe Pimentel
58: //
60: //
62:
63: //
65: //
66: adapter.Fill(ds);
67:
68: //
70: //
72:
73: //
76: //
78:
79: //
81: //
…wordpress.com/…/aprendendo-c-parte-2-modelo-desconectado-de-acesso-ao-banco-de-dados/ 10/17
2): Modelo
27/10/12
Desconectado de Acesso ao Banco de Dados « Felipe Pimentel
87:
88: //
91: //
92: dtPessoa.Rows.Add(drNewPessoa);
93:
94: //
96: //
97: adapter.Update(ds);
98:
100: }
Então agora o noso código já adiciona registros no banco. Não vou fazer as próximas operações,
espero que vocês façam. Qualquer dúvidam podem comentar, ou então entrar em contato por
email.
4. Finalizando
Para finalizar vamos fazer um exemplo do que podemos fazer manipulando os estados das
linhas.
Isso mesmo!!! Nenhuma linha será atualizada, pois o SqlDataAdapter só irá modificar no banco
as linhas que estiverem com valores diferentes de “Unchanged”. Para vocês verem que isso
acontece, rodem o seguinte código:
…wordpress.com/…/aprendendo-c-parte-2-modelo-desconectado-de-acesso-ao-banco-de-dados/ 11/17
2): Modelo Desconectado de Acesso ao Banco de Dados « Felipe Pimentel
2: {
4: Console.WriteLine("Nome ");
5: pessoa.Nome = Console.ReadLine();
6: Console.WriteLine("Email ");
7: pessoa.Email = Console.ReadLine();
8: Console.WriteLine("Sexo (M ou F) ");
9: pessoa.Sexo = Convert.ToChar(Console.ReadLine());
13: }
14:
16: {
17: //
19: //
21:
22: //
24: //
26:
…wordpress.com/…/aprendendo-c-parte-2-modelo-desconectado-de-acesso-ao-banco-de-dados/ 12/17
2): Modelo
27/10/12
Desconectado de Acesso ao Banco de Dados « Felipe Pimentel
32:
35: }
36:
38: {
41:
42: //
43: //Instância objeto que irá manipular e manter conexão com banco
44: //
46:
47: //
49: //
51:
52: //
54: //
13/17
2): Modelo
27/10/12
Desconectado de Acesso ao Banco de Dados « Felipe Pimentel
56:
57:
58: //
60: //
62:
63: //
65: //
66: adapter.Fill(ds);
67:
68: //
70: //
72:
73: //
76: //
78:
79: //
81: //
…wordpress.com/…/aprendendo-c-parte-2-modelo-desconectado-de-acesso-ao-banco-de-dados/ 14/17
2): Modelo
27/10/12
Desconectado de Acesso ao Banco de Dados « Felipe Pimentel
87:
88: //
91: //
92: dtPessoa.Rows.Add(drNewPessoa);
93:
94: drNewPessoa.AcceptChanges();
95:
96: //
98: //
99: adapter.Update(ds);
100:
102: }
Note que a linha jamais será adicionada, pois estou dando um “AcceptChanges()” antes de dar
um “Update()” no Adapter!!!
http://cid-2d6d3503299ba131.skydrive.live.com/self.aspx/Artigos/AcessoBancoDadosII.rar
(http://cid-2d6d3503299ba131.skydrive.live.com/self.aspx/Artigos/AcessoBancoDadosII.rar)
Essa entrada foi publicada em 0, 20 \20\UTC janeiro \20\UTC 2009 às 4:51 am e arquivada em
…wordpress.com/…/aprendendo-c-parte-2-modelo-desconectado-de-acesso-ao-banco-de-dados/ 15/17
2): Modelo
27/10/12
Desconectado de Acesso ao Banco de Dados « Felipe Pimentel
c#. Você pode acompanhar qualquer resposta para esta entrada através do feed RSS 2.0. Você
pode deixar uma resposta, ou trackback do seu próprio site.
2. Ronaldo disse:
março 2, 2009 às 11:25 am
Parabéns Felipe, já fazia algum tempo que eu procurava entender este assunto, mas não
conseguia achar um artigo claro como este seu, parabéns continue escrevendo!
3. estrelinha disse:
março 11, 2009 às 11:08 am
Filipe os meus mais sinceros parabém por esta sua iniciativa.
porque não postar um exemplo onde demostre uma aplicação windows Forms aplications..
tipo criar um formulário e carregar em combobox os dados de uma coluna de uma tabela da
base dados estudobog.
;)
6. Alane disse:
setembro 9, 2010 às 10:14 pm
Muito bacana, é bom termos conceitos detalhados de cada objeto do ADO e .NET, as vezes
temos o conjunto em funcionamento, mas não sabemos teoricamente como as coisas
funcionam internamente. Muito bom mesmo !
…wordpress.com/…/aprendendo-c-parte-2-modelo-desconectado-de-acesso-ao-banco-de-dados/ 16/17
7. Rhone disse:
abril 18, 2011 às 1:11 pm
Bom dia.
8. Ricardo disse:
abril 23, 2011 às 1:38 pm
Muito bom o artigo!
Continue escrevendo ..
[]s