CONCEITUAL - FORMA DE ACESSO AO BANCO DE DADOS
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
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
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.
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.
Alexandre,
Muito obrigado pela ajuda.
Qual a diferença entre utilizar o OLEDB e o ADO.NET? Existe algo relacionado a performance?
Muito obrigado pela ajuda.
Qual a diferença entre utilizar o OLEDB e o ADO.NET? Existe algo relacionado a performance?
sim, a performance do ado.net é bem melhor que oledb por ser uma fonte de dados que vc pode utilizar nativamente. sqlclient, sqloracle, etc...
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
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
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
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
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:
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.
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.
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
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
Desculpe Mordor, acabei de ver o "mais detalhes..."
Mordor,
Essa biblioteca não é compatÃÂÂvel com a versão express?
Obrigado
Felipe Cabrera
Essa biblioteca não é compatÃÂÂvel com a versão express?
Obrigado
Felipe Cabrera
Tópico encerrado , respostas não são mais permitidas