Te dejo un ejemplo que funciona en Delphi 6 con los componentes Interbase.
La base de datos es Firebird 2.5
Es un bucle de 10.000 inserciones que se repite 10 veces (100.000 inserciones).
Este es el log (unos 30 segundos).
Es importante en las inserciones masivas no hacer commit por cada registro. En el ejemplo se realizan cada 10.000 inserciones. Debes ver cuál es el mejor intervalo para tus datos.
Código:
Log:
15:48:49 Inicio
15:48:52 Bucle 0
15:48:56 Bucle 1
15:48:59 Bucle 2
15:49:02 Bucle 3
15:49:05 Bucle 4
15:49:08 Bucle 5
15:49:11 Bucle 6
15:49:14 Bucle 7
15:49:17 Bucle 8
15:49:20 Bucle 9
15:49:20 Fin
En vez de los bucles, deberías modificarlo para recorrer el CSV calculando lo que necesites.
El SQL para el INSERT también deberás modificarlo según tus necesidades...
Código Delphi
[-]
procedure TFMPruebas.BInsMasivaClick(Sender: TObject);
var
IBDB: TIBDatabase;
IBT: TIBTransaction;
IBQ: TIBQuery;
i, j: integer;
begin
inherited;
IBDB := TIBDatabase.Create(Self);
IBT := TIBTransaction.Create(Self);
try
IBDB.DatabaseName := '192.168.0.1:C:\Datos\Base.FDB';
IBDB.DefaultTransaction := IBT;
IBT.DefaultDatabase := IBDB;
IBDB.Connected := True;
IBT.StartTransaction;
IBQ := TIBQuery.Create(Self);
try
IBQ.DataBase := IBDB;
IBQ.Transaction := IBT;
IBQ.SQL.Text := 'INSERT INTO TMP_TEMPORALES (NOMBRE, ENTRADA) VALUES (:NOMBRE, :ENTRADA)';
MDebug.Lines.Add(FormatDateTime('hh:nn:ss', Now) + ' Inicio');
for i := 0 to 9 do
begin
for j := 1 to 10000 do
begin
IBQ.Params.ParamByName('NOMBRE').AsString := IntToStr(i*10000 + j);
IBQ.Params.ParamByName('ENTRADA').AsInteger := i*10000 + j;
IBQ.ExecSQL;
end;
IBQ.Transaction.Commit;
IBQ.Transaction.StartTransaction;
MDebug.Lines.Add(FormatDateTime('hh:nn:ss', Now) + ' Bucle '+IntToStr(i));
end;
MDebug.Lines.Add(FormatDateTime('hh:nn:ss', Now) + ' Fin');
finally
IBQ.Free;
end;
finally
IBDB.Free;
IBT.Free;
end;
end;