Veamos, esto es fácil, te he preparado un sencillo proyecto y te lo adjunto aquí.
No sé qué versión usas de firebird, yo ahora mismo tengo la 2.5 y no existen los campos boolean, así que utilizo integer con 0/1 (0=false 1=true)
Código:
CREATE TABLE PRUEBAS (
ID BIGINT DEFAULT 0 NOT NULL,
MYINT INTEGER DEFAULT 0 NOT NULL,
MYFLOAT FLOAT DEFAULT 0 NOT NULL,
MYBOOL integer DEFAULT 0 NOT NULL,
MYSTRING CHAR(1) DEFAULT '!' NOT NULL);
Luego, en el proyecto te he corregido algunas cosas y en lugar de crear dinámicamente los componentes, los he creado en tiempo de diseño.
Fíjate en los parámetros del IBDatabase y en los del IBTransaction.
El IBDatabase le pongo la propiedad "login prompt" a false, para que no pregunte el password cada vez.
Código:
user_name=sysdba
password=masterkey
Y los parámetros del IBTransaction, elijo "Read commited" y automáticamente se rellenan estos parámetros:
Código:
read_committed
rec_version
nowait
Conecto a la BD en el oncreate y desconecto en el onclose. El código es este:
Código Delphi
[-]unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, IBDatabase, IBQuery, IBSQL, DB, IBCustomDataSet;
type
TForm2 = class(TForm)
Button1: TButton;
IBDatabase1: TIBDatabase;
IBTransaction1: TIBTransaction;
IBQuery1: TIBQuery;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
public
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
procedure TForm2.Button1Click(Sender: TObject);
Var
I, J:Integer;
dIni, dFin : Double;
Begin
dIni := now();
IBQuery1.Close;
IBQuery1.SQL.Text := 'INSERT INTO Pruebas (Id, MyInt, MyFloat, MyBool, MyString) VALUES (:Id, :MyInt, :MyFloat, :MyBool, :MyString)';
IBQuery1.Prepare;
try
For I := 0 To 9 Do
Begin
For J := 1 To 10000 Do
Begin
IBQuery1.Params.ParamByName('id').AsInteger := i *10000 +j;
IBQuery1.Params.ParamByName('MyInt').AsInteger := Random(1000);
IBQuery1.Params.ParamByName('MyFloat').AsFloat := Random * 1000;
IBQuery1.Params.ParamByName('MyBool').AsInteger := Random(2);
IBQuery1.Params.ParamByName('MyString').AsString := Char(Random(25) + 65);
IBQuery1.ExecSQL;
End;
IBQuery1.Transaction.CommitRetaining;
end;
finally
dFin := now();
end;
ShowMessage( FloatToStr(dFin-dIni) );
End;
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if IBTransaction1.InTransaction then
IBTransaction1.Commit;
IBTransaction1.Active:=False;
IBDatabase1.Close;
end;
procedure TForm2.FormCreate(Sender: TObject);
begin
IBDatabase1.Connected:=true;
IBTransaction1.Active:=true;
end;
end.
Y si lo ejecutas, obviamente, esto es una broma para firebird, en mi equipo tarda menos de 2 segundos.