Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Cuál es la mejor forma de conectar la base de datos a mi programa? (https://www.clubdelphi.com/foros/showthread.php?t=47718)

martinzcr 05-09-2007 19:30:50

Cuál es la mejor forma de conectar la base de datos a mi programa?
 
Hola a todos!

Quisiera su opinión sobre lo siguiente: cuál es la mejor forma de conectar (y trabajar) la base de datos a mi programa?? :confused:

Les comento por donde viene la cuestión... Tengo un programa desarrollado en Delphi que trabaja con una base de datos Firebird. Para conectarme a la base de datos utilizo los componentes FIBPlus (base de datos, transacciones y datasets). En algún momento he utilizado los IBComponents que vienen en las paletas de controles estandard de Delphi.
En este momento la dirección de la base de datos en un archivo ini y la conexión y activación de datasets la hago al iniciar el programa.
Nunca trabaje con ODBC. Me comentaron por ahí que tal vez era más rápido (o más eficiente) trabajar con esta forma de conexión.
Quisiera saber la opición de ustedes, si han trabajado con las dos modalidades y si hay diferencias sustanciales de rendimiento.

Desde ya les agradezco! :rolleyes:

maeyanes 05-09-2007 19:34:06

Hola...

Es mejor trabajar con componentes de acceso nativo, como los IBX y FIBPlus que con ODBC, ya que con ODBC obtienes una capa extra lo que le resta velocidad...


Saludos...

Casimiro Notevi 05-09-2007 21:18:43

Tal y como comenta maeyanes, lo más rápido es lo más directo, y ahora mismo, lo mejor, lo más rápido, avanzado, seguro, potente, útil, cómodo (y no muy caro) es FIBplus.

martinzcr 05-09-2007 22:24:54

DataSets o Querys??
 
Gracias por la info... Va otra consulta

Tengo varios procesos de inserción de datos dentro de ciclos (por ejemplo guardar detalles de facturas, etc.). He probado hacer la inserción utilizando un DataSet y tmbien lo he hecho con un Query... un ejemplo

Utilizando DataSet...

Código Delphi [-]
while not DetalleTemporal.Eof() do begin
   
   DSetDetalle.Append;
   DSetDetalleCOD_ARTICULO.AsString := DetalleTemporalCOD_ARTICULO.AsString;
   DSetDetalleCANTIDAD.AsCurrency   := DetalleTemporalCANTIDAD.AsCurrency;
   ...otros campos...
   
   DSetDetalle.Post;
   DetalleTemporal.Next;
end;

Utilizando Query...

Código Delphi [-]
Query.Close;
Query.SQL.Clear;
Query.SQL.Add('insert into DETALLE_FACTURA (');
Query.SQL.Add('COD_ARTICULO, CANTIDAD, CAMPO_X...)');
Query.SQL.Add('values (:vCOD_ARTICULO, :vCANTIDAD, :vCAMPO_X...)');
while not DetalleTemporal.Eof() do begin
   
   Query.ParamByName('vCOD_ARTICULO').AsString := DetalleTemporalCOD_ARTICULO.AsString;
   Query.ParamByName('vCANTIDAD').AsCurrency   := DetalleTemporalCANTIDAD.AsCurrency;
   ...otros campos..
   DetalleTemporal.Next;
end;

No he encontrado como medir el rendimiento de este código... Quisiera saber si alguien sabe o tiene algúna idea de cúal de las dos opciones es la más eficiente.

Desde ya les agradezco por la ayuda.

Saludos!

Casimiro Notevi 05-09-2007 22:31:56

Intenta hacer una prueba insertando una cantidad grande de registros.
De todas formas se supone que el query es más eficiente en estos casos.
Ya nos contarás.

martinzcr 05-09-2007 22:53:27

Buena idea!

Voy a armar una demo que me cargue unos 100.000 registros con las 2 modalidades y le tomo el tiempo. Cuando termine les cuento los resultados...

MON___ 06-09-2007 13:20:03

Como te han dicho prueba con una gran cantidad de registros. No obstante y dada mi experiencia (hace tiempo lo probé insertando una gran cantidad de registros en una tabla con unos 30 campos) me resulto más eficiente el empleo de TQUERY con el correspondiente SQL.

Un saludo y comenta tus resultados

duilioisola 06-09-2007 13:45:52

Ten en cuenta el tema de transacciones

Código:

Query.Close;
Query.SQL.Clear;
Query.SQL.Add('insert into DETALLE_FACTURA (');
Query.SQL.Add('COD_ARTICULO, CANTIDAD, CAMPO_X...)');
Query.SQL.Add('values (:vCOD_ARTICULO, :vCANTIDAD, :vCAMPO_X...)');
while not DetalleTemporal.Eof() do begin
  if not Query.Transaction.InTransaction then Query.Transaction.StartTransaction; //agregado
  Query.ParamByName('vCOD_ARTICULO').AsString := DetalleTemporalCOD_ARTICULO.AsString;
  Query.ParamByName('vCANTIDAD').AsCurrency  := DetalleTemporalCANTIDAD.AsCurrency;
  ...otros campos..
  Query.Transaction.Commit; // agregado
  DetalleTemporal.Next;
end;

Si hay más de un usuario cargando datos, el hecho de que inserten al mismo tiempo y no cierren transacciones puede hacer más cada vez más lento la inserción de registros.

martinzcr 06-09-2007 16:28:41

Hola Amigos:

Hice la prueba con una tabla con 40 campos (20 varchar y 20 float). Probe varias veces hacer la inserción con Query y con Dataset (probe 10000 registros). Definitivamente, fue más rápida la inserción con los Querys (según mis pruebas un 15% más rápido mas o menos).

Respecto de las transacciones, en el evento AfterExecute coloco siempre este código:

Código Delphi [-]
procedure TFDatos.Query_PruebaAfterExecute(Sender: TObject);
begin
     if not Transaccion.Active then
        Transaccion.Active := True;
     Transaccion.Commit;
end;

Gracias por la colaboración!


La franja horaria es GMT +2. Ahora son las 20:12:54.

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