CONCEITUAL - FORMA DE ACESSO AO BANCO DE DADOS

USUARIO.EXCLUIDOS 23/04/2007 14:57:18
#213385
Senhores,

Estou iniciando com o .NET. Quando comecei com o VB criei uma forma de acesso a banco de dados que achava a mais correta e depois de muito tempo descobri que existiam formas melhores de fazer. Porém, depois de 3 anos ficaria difícil mudar todos os projetos e isso está funcionando faz uns 8 anos! Não gostaria de cometer o mesmo erro, portanto, se alguém puder contribuir... Depois faço um resumo e coloco nas dicas.

Perguntas:

1. O que é melhor: abrir o banco toda vez que o sistema for acessar alguma informação ou manter o acesso ao banco aberto durante toda a execução do programa?

2. é melhor colocar a variável de conexão em um módulo, incluindo funções de execução de comandos e abertura de banco ou seria melhor te-los em uma classe? Aí seria obviamente necessário instanciar essa classe sempre que fosse acessar alguma coisa no BD.

3. Sempre que eu abrir um recordset eu devo instanciar a variável e depois mata-la ou devo deixar a variável carregada durante toda a execução do projeto?

4. O Garbagge Collector irá matar as classes instanciadas nos módulos ou só quando eu instanciar uma classe em um formulário, por exemplo?

5. O que é melhor utilizar: OLEDB ou ODBD?

Agradeço qualquer ajuda.

Felipe
USUARIO.EXCLUIDOS 23/04/2007 17:00:47
#213409
Minhas opnioes
1-Eu so abro o banco de dados uma vez, e fecho quando acaba a execução do sistema, acho que nao tem necessidade de abrir e fechar o banco toda hora que for precisa dele.

2-Eu tenho os 2 modelos, mas prefiro deixar em um modulo.bas, por ser mais facil de dar manutenção.

3-O Recordset sempre que uso ja mato ele logo em seguinda, para nao deixar carregar muito espaço de memoria.

4-Assim que vc nao estiver mais usando a classe ele mata ela, tanto no modulo quando no form.

5-Olha provedor eu uso o ADO.NET ou ADO, nao trabalho com aledb nem odbc.
USUARIO.EXCLUIDOS 23/04/2007 17:12:06
#213415
Alexandre,

Muito obrigado pela ajuda.

Qual a diferença entre utilizar o OLEDB e o ADO.NET? Existe algo relacionado a performance?
USUARIO.EXCLUIDOS 23/04/2007 17:35:19
#213424
sim, a performance do ado.net é bem melhor que oledb por ser uma fonte de dados que vc pode utilizar nativamente. sqlclient, sqloracle, etc...
USUARIO.EXCLUIDOS 23/04/2007 17:43:10
#213427
Ok.

Vou pesquisar como utilizar.. estou engatinhando... rs

O .Net tem vários "mimos" que facilitam a programação, desde o desenho das telas até a organização do código. Estou gostando.

Você sabe se existe alguma limitação por estar usando a versão Express?

Obrigado


USUARIO.EXCLUIDOS 23/04/2007 18:05:03
#213433
Prezado amigo do Chaves (rs)

Obrigado pela resposta!

Eu tenho diversas funções em VB6. Por exemplo, tenho uma função para colocar a data no formato certo para o banco de dados, função para pegar o próximo valor em um determinado campo, funções de localização, carregamento de combos e lists, e outras... Essas funções eu devo manter em um módulo, mesmo no .Net, correto?

Pelo que eu estou entendendo, existem várias maneiras de acesso a dados. Pelo que identifiquei inicialmente:
1. ODBC
2. OLEDB
3. ADO
4. ADO.net
5. .Net Provider

A princípio, parece-me que a 1 e 2 são mais antigas, utilizadas desde os VB6 e devem ter sido mantidas no .Net apenas por um questão de compatibilidade, correto?

Entre ADO.net e .Net Provider... De acordo com a base de dados que eu for utilizar devo eleger a melhor alternativa? Estou procurando iniciar um trabalho com o DB2 Express. Atualmente estou utilizando o PostgreSQL.

Quanto a utilizar 3 camadas, hoje em dia faço isso no VB6. Tenho sempre uma classe para um form... ou mais de um form para 1 classe. Só a classe grava e consulta o banco. O form alimenta e consulta as propriedades da classe. Isso deve ser mantido, correto?

Muito obrigado pela colaboração!

Felipe Cabrera
MORDOR 23/04/2007 18:07:51
#213434
1- Feche a conexão após cada consulta. Criar conexões é um processo custoso para o sistema, então use o recurso de Connection Pooling para otimizar a criação de conexões.

2- Recomendo a utilização do Data Access Application Block da Enterprise Library, facilita muito o uso, é só criar o arquivo de configuração, adicionar as referências ao projeto e usar códigos simples como esse:

// Na camada de dados faz uma consulta de cliente pelo código
public static Cliente GetCliente(int clienteId)
{
// Não há de código de conexão no projeto, está tudo encapsulado no DAAB
Cliente cliente = null;
Database database = DatabaseFactory.CreateDatabase();

using (DbCommand command = database.GetStoredProcCommand("sp_clientes_query"))
{
database.AddInParameter(command, "cliente_id", DbType.Int32, cliente_id);

DbDataReader reader = (DbDataReader) database.ExecuteReader(command);

if (reader.Read())
{
cliente = new Cliente();
cliente.ClienteId = Convert.ToInt32(reader["cliente_id"]);
cliente.Nome = Convert.ToString(reader["cliente_nome"]);

reader.Close();
}
}

return cliente;
}


// Na camada de apresentação (Form)
int clienteId = int.Parse(this.txtCodigoCliente.Text.Trim());
Cliente cliente = ClientesData.GetCliente(clienteId);


Mais detalhes em:
Patterns & practices – Enterprise Library

3- Não fique usando variáveis globais como recordsets e conexões indiscriminidamente, crie e elimine variáveis no ponto mais próximo de sua utilização. Veja no código acima como é limpo, não preciso de nenhum módulo para criar conexão no meu projeto, o DAAB já encapsula tudo pra mim seguindo as melhores práticas para esse tipo de tarefa, só preciso de um arquivo de configuração.

4- O GC irá matar instâncias de variáveis quando não encontrar nenhuma referência a elas, mas chame o método Dispose de qualquer classe sempre que disponível ao terminar de usá-la para eliminar recursos adicionais.

5- Você ainda utiliza ODBC e OLEDB no ADO.NET, o que você não deve fazer é ficar usando as bibliotecas antigas importando o MDAC como objeto COM no projeto e sim usar as classes do .NET. OLEDB sempre foi considerado melhor que ODBC.
USUARIO.EXCLUIDOS 23/04/2007 18:26:46
#213437
Mordor,

Obrigado pela colaboração. Tenho algumas dúvidas quanto a seus comentários...

1. Se criar novas conexões é custoso para o sistema, então sua sugestão é manter a conexão com o banco de dados aberta?

2. O Data Access Application Block da Enterprise Library é uma biblioteca que deve ser adquirida ou é nativa no .Net? Onde eu posso consegui-la para realizar testes?

3. Eu geralmente crio uma varivael reader (antigamente um recordset), uma connection e uma command.Utilizo apenas elas em todo os sistema. Hoje, no VB6, eu mantenho-as instanciadas e apenas abro o SQL no recordset quando vou utilizar e uso o método execute da conexao para os inserts, updates e deletes. No . Net já ví que a coisa é diferente... Mas manter apenas 1 variável de cada tipo vc considera que seja adequado? Quanto às funções, desconheço outras maneiras de mante-las exceto nos módulos. Vc tem alguma sugestão?

4. O dispose seria semelhante a um set classe = nothing?

5. Fiz a conexão da seguinte maneira:

[txt-color=#3333ff]Sub AbrirBanco()

Sql = "Provider=PostgreSQL;data source=192.168.0.2;location=sistema;User ID=felipe;password=1234"
DbConn = New OleDb.OleDbConnection(Sql)
DbConn.Open()

End Sub[/txt-color]

O que você acha?

Muito obrigado novamente pela colaboração!

Abraço

Felipe Cabrera
USUARIO.EXCLUIDOS 23/04/2007 18:28:19
#213438
Desculpe Mordor, acabei de ver o "mais detalhes..."
USUARIO.EXCLUIDOS 23/04/2007 18:32:35
#213439
Mordor,

Essa biblioteca não é compatível com a versão express?

Obrigado

Felipe Cabrera
Página 1 de 2 [17 registro(s)]
Tópico encerrado , respostas não são mais permitidas