none
Acessando a banco de dados RRS feed

  • Pergunta

  • Estou fazendo um programa que acessa banco de dados do Access usando C#, e uso muitos Métodos que acessam o banco de bados e em cada método tenho que criar uma nova conexão, e isto torna o programa lento.
    Será que dá pra manter uma conexão aberta durate todo programa?
    Desde já grato pela compreensão.
    quarta-feira, 15 de abril de 2009 14:49

Respostas

  • Valeu pessoal, agora estou estudando o DataSet e descobri que posso criar um XML baseado nos dados da minha consulta usando o Método string GetXml(), então eu pensei em usar o XML gerado para as operações no programa, só não sei como faço para atualizar os valores no banco de dados no fim do programa. Obrigado!
    segunda-feira, 20 de abril de 2009 17:02

Todas as Respostas

  • Vc diz criar nova conexão ou abrir nova conexão?

    Tem como vc postar um trecho do código? Access por si só é muito lento. O performance de um banco access comparado com SQL é sofrível.

    Dependendo do seu caso, vale a pena trazer os dados para a memória. Vc faz uma leitura inicial no banco e depois passa a fazer consultas, inserção, atualização e deleção em memória. E posteriormente vc devolve esses dados para o banco.

    Um abraço

    Visite meu blog - http://dicasdecodigo.blogspot.com/
    quarta-feira, 15 de abril de 2009 17:00
  • Eu crio nova conexão, porque uso vários métodos em várias classes.
    Um dos métodos é mais ou menos assim:

                string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Ole DB Services=-4; Data Source=C:\\Inetpub\\wwwr" +
                    "oot\\DOTNET\\PTM\\VB\\bd.mdb";
                System.Data.IDbConnection dbConnection = new System.Data.OleDb.OleDbConnection(connectionString);
    
                string queryString = QueryStr;
                System.Data.IDbCommand dbCommand = new System.Data.OleDb.OleDbCommand();
                dbCommand.CommandText = queryString;
                dbCommand.Connection = dbConnection;
    
                dbConnection.Open();
                System.Data.IDataReader dataReader = dbCommand.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
    
                return dataReader;
            }
    


    eu gostaria de trazer os dados na memória, e já tentei usar o DataSet, só que tenho problemas em usar o DataSet.
    Obrigado!

    quinta-feira, 16 de abril de 2009 15:43
  • Lemol,

    Você esta fechando suas conexões após consumi-las?
    Não é necessário instaciar um string de conexão por métodos, você pode joga-la em um arquivo de configuração.
    Crie um método (uma Factory) para  fazer essas operações repetitivas de abrir conexão, fechar conexão, receber a string de conexão;
    Quais os problemas que você tem em persistir os dados retornados do banco em um DataSet?

    Att,
    Leonardo C. Pereira
    Analista Desenvolvedor .Net

    (ps:)
    Por gentileza, favor classificar a mensagem quanto utilidade.
    sexta-feira, 17 de abril de 2009 19:39
  • Valeu o esclarecimento Leonardo! Mas, será que dá pra manter uma conexão aberta durante todo o programa, e ser acessado por vários métodos de classes diferentes ou Assemblies diferentes, como se fazia no VB6. Obrigado!
    sábado, 18 de abril de 2009 10:17
  • Lemol,

    Concordo com o Leonardo, use o DataSet..-> Lembre se sempre de fechar as conexões quando sair do banco ou seja.. lêia e saia.. rs :)


    Usando seu exemplo vc pode usar o using pois ele possui um IDisposable para finalizar os objetos, este deve ser a causa da lentidão ai:



    using (System.Data.IDbConnection dbConnection = new System.Data.OleDb.OleDbConnection(connectionString))
                {
                    string queryString = QueryStr;
                    using (System.Data.IDbCommand dbCommand = new System.Data.OleDb.OleDbCommand())
                    {
                        dbCommand.CommandText = queryString;
                        dbCommand.Connection = dbConnection;
                        dbConnection.Open();
                        using (System.Data.IDataReader dataReader = dbCommand.ExecuteReader(System.Data.CommandBehavior.CloseConnection))
                        {
                            return dataReader;
                        }
                    }
    
                }
    Abraço
    Nelson Borges - Analista de Sistemas
    sábado, 18 de abril de 2009 14:41
  • Lemol,

    Sim é possível, mas vejamos um detalhe muito importante. Uma das maiores evoluções do ADO.NET Framework 2.0 foi a possibilidade de trabalhar com dados desconectados (DataSet).  Imagine que sua aplicação mantêm uma conexão em aberto e seu banco só permite um determinado número de conexões. Se muitos usuários estiverem utilizando sua aplicação, concorda que alguem vai ficar de fora?

    Trabalhar com dados desconectados nos trás muitos benefícios. Usar DataReader como se trabalhava com os recordsets do ASP 3.0 tradissional é involução, e acredite é mesmo (trabalhei muitos anos desenvolvendo em ASP, imagine como amo de paixão um DATASET, até mais do que ORM, Linq, Nhinbernate, etc). 

    Minha opnião pessoal é que até hoje nada superou o bom e novo DataSet. Se utilizar os recursos do enterprise library com ele sua aplicação fica supinpa.
    ORM é bom para desenvolvedores que não sabem muito Banco de Dados (stored Procedures, triggers, e querys complexas).

    Tudo que honera processamento deve ser bem pensado na utilização, isso engloba manter conexão aberta adieterno, e a maioria dos ORMs.

    []'s
    Att,
    Leonardo C. Pereira
    Analista Desenvolvedor .Net

    (ps:)
    Por gentileza, favor classificar a mensagem quanto utilidade.
    segunda-feira, 20 de abril de 2009 12:12
  • Valeu pessoal, agora estou estudando o DataSet e descobri que posso criar um XML baseado nos dados da minha consulta usando o Método string GetXml(), então eu pensei em usar o XML gerado para as operações no programa, só não sei como faço para atualizar os valores no banco de dados no fim do programa. Obrigado!
    segunda-feira, 20 de abril de 2009 17:02