Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   TADODataset "salta" la primera tupla del resultado. (https://www.clubdelphi.com/foros/showthread.php?t=96655)

Christian24 26-03-2024 13:53:04

TADODataset "salta" la primera tupla del resultado.
 
Buenas, foro. Es mi primer mensaje aquí, aunque os llevo leyendo bastante tiempo.

Tengo un problema en una aplicación en la que estoy trabajando en Delphi6. Estoy pasando una serie de módulos de dbf a SQL Server.

Estoy con un módulo de reporting que por una serie de necesidades ya existentes en la aplicación, me fuerza a generar una query con bastantes left join (>15) y bastantes cláusulas en el where según los filtros indicados por el usuario. Hablamos de una tabla que potencialmente (según la instalación), puede tener más de 30 millones de tuplas.

Actualmente, estoy generando dinámicamente un ADODataset, con los siguientes parámetros:
Código Delphi [-]
dataset.CommandTimeout := 900;
dataset.CommandText := [query];
dataset.CursorLocation := clUseServer;
dataset.CursorType := ctOpenForwardOnly;
dataset.EnableBCD := False;
dataset.LockType := ltReadOnly;

Y, posteriormente, hago un loadFromDataset para cargarlo en una tKbmMemTable:
Código Delphi [-]
memTable.LoadFromDataSet(dataset, [mtcpoProperties]);


Con esto la query ejecuta con ligera rapidez (dentro de las circunstancias). Sin embargo, me encuentro que *siempre* se salta el primer registro. Si copio el commandtext que también genero dinámicamente, y lo ejecuto directamente en el mssms, veo que la primera tupla que me arroja directamente la consulta, nunca me la trae el ADODataset, sólo los registros posteriores.

Si pruebo otras configuraciones, como clUseClient, la query me trae los resultados esperados pero es significativamente más lenta, o incluso me arroja un fuera de memoria sin llegar a traer nada.

Como apunte, es el dataset directamente el que "salta" la primera tupla. Es decir, ocurre antes del loadFromDataSet.

Además, he probado a abrir el dataset antes de cargar en la tabla de memoria, hacer first / next, pero tampoco solventa el problema.

¿Alguien sabría echarme un cable para entender la naturaleza del problema?

Gracias de antemano.

marco3k 26-03-2024 15:29:05

Hola, no me ha ocurrido ese tipo de inconvenientes y siempre uso los cursores del lado del cliente para hacer llenar el adodataset, si dices que es lento la consulta, quizas algun campo donde ejecutas un where no esta indexado y por eso se ejecuta lento, revisa los campos donde haces where y que esten indexados.

Neftali [Germán.Estévez] 26-03-2024 17:04:43

es un problema conocido y antiguo de los componentes ADO.
Aquí tienes un par de páginas donde se habla del tema y se dan algunas soluciones. Revísalas con cariño:
https://borland.public.delphi.databa...onous-fetching
https://supportcenter.devexpress.com...s-ado-datasets

Aunque si buscas referencias a este problema seguro que encuentras más fuentes donde se describe.

Christian24 27-03-2024 16:34:39

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 555136)
es un problema conocido y antiguo de los componentes ADO.
Aquí tienes un par de páginas donde se habla del tema y se dan algunas soluciones. Revísalas con cariño:

Aunque si buscas referencias a este problema seguro que encuentras más fuentes donde se describe.

¡Muchas gracias, Neftali!

Estuve googleando antes de preguntar por aquí pero no encontré casi nada, el primer enlace que me pasaste me vino de perlas, con eso conseguí solventar el problema.

Un saludo.


La franja horaria es GMT +2. Ahora son las 17:46:41.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi