Announcement

Collapse
No announcement yet.

InterBase API und Delphi

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • InterBase API und Delphi

    Wo kann ich ein vollständiges (funktionsfähiges) Beispiel in Delphi 2.0 finden, das folgende Funktionen aus InterBase API aufruft:

    isc_attach_database()

    isc_detach_database()

    isc_start_multiple() (mit tpb!)

    isc_commit_transaction()

    isc_rollback_transaction() ?

    Ich habe versucht, die Beispiele aus dem Buch InterBase 4.x/5 von Paul Beach/Jöpi Janning/Holger Klemt, wo alles klar schien, zu implementieren. Leider funktioneiren sie bei mir nicht.

    Eventuell würde mich ein Unit mit diesen Funktionen interessieren.

  • #2
    Hallo,

    der folgende Auszug stammt aus dem Beispielprogramm <i>IBTransaction.dpr</i> aus meinem Buch <b>Client/Server Datenbankentwicklung mit Delphi</b>:
    <pre>
    function TFormMain.Connect(sDBName : String;
    sUsername: String;
    sPassword: String): Boolean;
    var
    szDBName : array[0..255] of char;
    ibStatus : status_vector;
    ibCode : isc_status;
    begin
    if bConnected
    then Disconnect;
    FillChar(szDBName, sizeof(szDBName), #0);
    StrPCopy(szDBName, sDBName);
    DBHandle := nil;
    FillChar(DPB_Buffer, sizeof(DPB_Buffer), #0);
    // Offset initialisieren
    DPB_BufPtr := 0;
    // Versionnummer ablegen
    DPB_Buffer[0] := char(isc_dpb_version1);
    // Offset aktualisieren
    Inc(DPB_BufPtr);
    // DPB-Struktur mit dem Usernamen belegen
    DPB_Buffer[DPB_BufPtr] := Char(isc_dpb_user_name);
    Inc(DPB_BufPtr);
    DPB_Buffer[DPB_BufPtr] := Char(Length(sUsername));
    Inc(DPB_BufPtr);
    StrPCopy(@DPB_Buffer[DPB_BufPtr], sUsername);
    Inc(DPB_BufPtr, Length(sUsername));
    // DPB-Struktur mit dem Paßwort belegen
    DPB_Buffer[DPB_BufPtr] := Char(isc_dpb_password);
    Inc(DPB_BufPtr);
    DPB_Buffer[DPB_BufPtr] := Char(Length(sPassword));
    Inc(DPB_BufPtr);
    StrPCopy(@DPB_Buffer[DPB_BufPtr], sPassword);
    Inc(DPB_BufPtr, Length(sPassword));
    // Connect zur Datenbank
    ibCode := isc_attach_database(@ibStatus, 0, @szDBName, @DBHandle,
    DPB_BufPtr, @DPB_Buffer);
    if ibCode <> 0
    then HandleIBErrors(@ibStatus, nil)
    else
    begin
    bConnected := True;
    StatBar.Panels[0].Text := 'Connected';
    StatBar.Panels[1].Text := Format('User %s connected mit %s',
    [sUsername, sDBName]);
    end;
    Result := bConnected;
    ...
    end;

    procedure TFormMain.ButtonStartClick(Sender: TObject);
    var
    ibStatus : status_vector;
    ibCode : isc_status;
    aTEB : isc_teb;
    begin
    TRHandle := nil;
    aTEB.db_ptr := @DBHandle;
    aTEB.tpb_len := 0;
    aTEB.tpb_ptr := nil;
    ibCode := isc_start_multiple( @ibStatus, @TRHandle, 1, @aTEB);
    if ibCode <> 0
    then HandleIBErrors( @ibStatus, nil)
    else StatBar.Panels[1].Text := 'Transaktion gestartet';
    end;

    procedure TFormMain.ButtonCommitClick(Sender: TObject);
    var
    ibStatus : status_vector;
    ibCode : isc_status;
    begin
    ibCode := isc_commit_transaction( @ibStatus, @TRHandle);
    if ibCode <> 0
    then HandleIBErrors(@ibStatus, nil)
    else StatBar.Panels[1].Text := 'Transaktion via COMMIT beendet';
    end;

    procedure TFormMain.ButtonRollbackClick(Sender: TObject);
    var
    ibStatus : status_vector;
    ibCode : isc_status;
    begin
    ibCode := isc_rollback_transaction( @ibStatus, @TRHandle);
    if ibCode <> 0
    then HandleIBErrors( @ibStatus, nil)
    else StatBar.Panels[1].Text := 'Transaktion via ROLLBACK beendet';
    end;

    (* Achtung! Jeder Wert in der Tabellenspalte "COUNTRY" muß
    eindeutig sein, d.h. jeder erneute Versuch, den
    gleichen Wert zu speichern, provoziert das Veto des
    InterBase. *)

    procedure TFormMain.ButtonInsertClick(Sender: TObject);
    var
    ibStatus : status_vector;
    ibCode : isc_status;
    begin
    ibCode := isc_dsql_execute_immediate(@ibStatus, @DBHandle, @TRHandle, 0,
    PChar(EditSQL.Text), 1, nil);
    if ibCode <> 0
    then HandleIBErrors(@ibStatus, TRHandle)
    else StatBar.Panels[1].Text := 'Datensatz hingefügt';
    end;
    </pre>
    Im Projektverzeichnis der CDROM ist auch die Import-Unit <b>Ibprocs.pas</b> zu finden, die extra für Delphi 2 ausgelegt ist (die aber auch mit den anderen 32-Bit-Versionen von Delphi funktioniert)

    Comment

    Working...
    X