2009-09-30 12 views
5

Tenía un programa Delphi 4 que desarrollé hace muchos años que usaba Opus DirectAccess para buscar secuencialmente a través de una base de datos de Microsoft Access y recuperar los registros deseados. Delphi 4 no tenía ADO, por eso estaba usando DirectAccess.¿Por qué desacelera el procesamiento de registro ADO Next en Delphi?

Pero ahora me he actualizado a Delphi 2009 y he convertido el programa para usar ADO. Lo que encontré fue que el ciclo de la tabla (de unos 100.000 registros) comienza tan rápido como lo hizo en DirectAccess, pero luego comienza a ralentizarse y se vuelve cada vez más lento a medida que pasa por la tabla. El bucle básico es:

ArticlesTable.First; 
while not Cancel and not ArticlesTable.Eof do begin 

    (See if the current record has criteria desired) 
    (If so, process the record) 

    ArticlesTable.Next; 
end; 

Básicamente, simplemente procesa los registros secuencialmente utilizando el método .Next.

Entonces, ¿por qué se está desacelerando, y cómo puedo recodificar esto para que no se ralentice?

Respuesta

10

Debe llamar a DisableControls en todos los conjuntos de datos ADO si no está utilizando controles conscientes de DB en el conjunto de datos.

De lo contrario, la velocidad es una mierda.

consulte this article para más detalles.

Como alternativa, utilice la propiedad ADO conjunto de registros internos

while Not ADOQuery1.Recordset.EOF do 
begin 
    ADOQuery1.Recordset.Movenext; 
end; 
+0

Añadiendo "ArticlesTable.DisableControls;" antes de "ArticlesTable.First"; arregló el problema ¡Perfecto! Muchas gracias! – lkessler

1

Además, puede cambiar el CursorType propiedad de nuestro componente de acceso (TADOTable/TADOQuery/...).

Pruebe ctOpenForwardOnly para mejorar el rendimiento; Es posible que necesite desconectar de DBGrid (si ha conectado uno) y reconectarse al salir del ciclo.

Atentamente.

+0

Lo intenté cuando estaba tratando de solucionar el problema antes de hacer la pregunta. Pero no tuvo ningún efecto notorio. – lkessler

Cuestiones relacionadas