Ver Mensaje Individual
  #40  
Antiguo 29-04-2023
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.043
Reputación: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
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
    { Private declarations }
  public
    { Public declarations }
  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.
Archivos Adjuntos
Tipo de Archivo: zip test.zip (1,70 MB, 1 visitas)
Responder Con Cita