Ir para o conteúdo
diogoarsousa

Um Recordset que vai ficando cada vez mais lento

Mensagens Recomendadas

diogoarsousa

Boa tarde.

Fiz uma rotina em VB.NET 2003 que acede a uma base de dados Access via ADO.

Primeiro acede a uma tabela com cerca de 100 registos onde vou buscar o valor do campo ID.

        rst_GC = New ADODB.Recordset()

        Sqlstring = "SELECT ID FROM Grandes_Consumidores "

        rst_GC.Open(Sqlstring, "DSN=zmc_2006", ADODB.CursorTypeEnum.adOpenKeyset, ADODB.LockTypeEnum.adLockOptimistic, ADODB.CommandTypeEnum.adCmdText)

Depois, acede a uma segunda tabela com várias dezenas de milhar de registos através do ID, para retornar valores de determinados campos de determinados campos - no caso, um recorset com cerca de 400 registos:

           rst = New ADODB.Recordset()

            Sqlstring = "SELECT Data FROM Grandes_Consumidores_Caudais " & _
            " WHERE Data >= " & CStr(Minha_Data) & " AND " & _
            " ID = " & CStr(ID)

            rst.Open(Sqlstring, "DSN=zmc_2006", ADODB.CursorTypeEnum.adOpenKeyset, ADODB.LockTypeEnum.adLockOptimistic, ADODB.CommandTypeEnum.adCmdText)

Depois faço determinadas operações e apago o Recorset:

                rst.Close()
                rst = Nothing

Acontece que quando executo a rotina, a criação do segundo recorset vai-se tornando cada vez mais lenta e a certa altura recebo a mensagem de erro:

An Unhandled Exception of Type

'Sistem.Runtime.InteropServices.Comexception'

ocurred in Project1.exe

Additional Information: [Microsoft][Controlador Microsoft Access de ODBC]

Demasiadas tarefas Cliente.

O que é que eu estou a fazer de errado?

Obrigado.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Kissema
'Em vez de criar vários objectos "RecordSet " em cada chamada:
  rst_GC = New ADODB.Recordset()
  rst = New ADODB.Recordset()

'tenta usar apenas um objecto declarando-o como uma variável global  
rst = New ADODB.Recordset()
'e depois basta usá-lo apenas. Consome menos a RAM


@ pr@tic@ f@z o m&str&

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
diogoarsousa

Obrigado às duas pessoas que responderam. Optei por enviar o resultado dos recordsets para arrays e trabalhar com estes.

Quanto à: "Colocas esse processo em threads..", como é que isso se faz?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.