La Web del Programador: Comunidad de Programadores
 
    Pregunta:  21252 - DUDAS TQUERY
Autor:  David Sauce
Hola.

Recurro a este foro porque tengo problemas cuando uso el objeto TQuery.
Bueno, la duda es que no se si lo uso bien. Aqui pongo un ejemplo de codigo tipo de los que uso. Estan dentro de bucles, por lo que se ejecutan muchisimas veces.

with Query_GC100W2 do begin
close;
if prepared then
unprepare;
sql.clear;
sql.add('SELECT AR_PRIXACH,FA_CODEFAMILLE FROM
F_ARTICLE WHERE AR_REF = :AR_REF');
ParamByName('AR_REF').AsString :=
trim(Query_MDB2['ARTLAN']);
if not prepared then
prepare;
open;
end;

Con esto funciona, pero no se si es todo lo eficiente y correcto que debiera, ya que cuando uso mucho objetos TQuery en un mismo programa, que acceden a tablas muy grandes, llega un momento que el sistema se colapsa y me da un mensaje de FALTA DE MEMORIA. Supongo que será porque no la libero o algo así.

¿Alguien podría ponerme un ejemplo de como usar un objeto TQuery de la manera más eficiente y correcta posible?

Tengo muchas dudas:
¿Es necesario hacer el prepare siempre?
¿Es necesario hacer el unprepare siempre como lo hago yo?
¿Podrías ponerme un ejemplo de utilización de esto?
¿Se nota realmente el uso de estos dos métodos?
¿Es convenciente usarlos?
¿Donde debería usar el metodo Free?
¿Me falta algo en el código para que el uso del objeto TQuery sea todo lo correcto y eficiente

  Respuesta:  Juan Jose Ochoa
La manera más eficiente es la siguiente:

with Query_GC100W2 do
begin
close;
// if prepared then ----> NO LO USES
// unprepare; ------> NO LO USES
sql.clear;

// NO LE PONGAS PARAMETROS AQUI ADENTRO, USA LOS VALORES DIRECTAMENTE

sql.add('SELECT AR_PRIXACH,FA_CODEFAMILLE FROM F_ARTICLE WHERE AR_REF = ' + Query_MDB2ARTLAN.Value);

// ParamByName('AR_REF').AsString := ------> NO LO USES
// trim(Query_MDB2['ARTLAN']); ------> NO LO USES
// if not prepared then ------> NO LO USES
// prepare; ------> NO LO USES
open;
end;

Esa es la mejor manera y haces trabajar menos al query.