Announcement

Collapse
No announcement yet.

StoredPorcedure speichert aus Delphi/JBuilder keinen neuen Datensatz in Interbase

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

  • StoredPorcedure speichert aus Delphi/JBuilder keinen neuen Datensatz in Interbase

    eMail: [email protected]

    Problem:
    Speichern von Delphi in eine Interbase-5-Datenbank mit einer Stored Procedure.
    In den verschiedenen Quellen wird beschrieben, wie in Interbase mit GEN_Id eine eindeutige ID-Nummer automatisch zugewiesen
    werden kann.
    Mit WISQL-Befehlen INSERT ........ und einem Trigger funktioniert dies auch einwandfrei.
    Allerdings beim Aufruf der Stored Procedure mit Delphi (siehe unten, getestet mit Delphi 3 und Delphi 4 und auch mit Jbuilder 3.5) wird
    dann zwar kein Fehler gemeldet, aber es wird auch kein Datensatz in Interbase abgespeichert.
    Wenn ich das ID-Feld explizit vorgebe (ohne GEN_ID), dann wird der Datensatz übrigens gespeichert. ??

    Hat jemand eine Lösung?

    STORED PROCEDURE/Interbase
    CREATE DOMAIN D_INDEX AS INTEGER NOT NULL;
    CREATE DOMAIN D_DATE AS DATE default 'now';
    CREATE DOMAIN D_COMMENT AS CHAR(30) CHARACTER SET ISO8859_1; /* Table: T_DC_LOG, Owner: SYSDBA */
    CREATE TABLE T_DC_LOG (ID D_INDEX, COMMENT D_COMMENT,
    DATETIME D_DATE,
    PRIMARY KEY (ID));
    CREATE GENERATOR NUMBER_LOG;
    CREATE EXCEPTION UNKNOWN_DC_LOG_ID "Invalid DC_LOG-ID.";
    CREATE PROCEDURE ADD_T_DC_LOG (COMMENT CHAR(30)) RETURNS (ID INTEGER)
    AS
    BEGIN
    BEGIN
    id = GEN_ID(NUMBER_LOG, 0);
    insert into T_DC_LOG (comment) values (:COMMENT);
    WHEN SQLCODE -530 DO EXCEPTION UNKNOWN_DC_LOG_ID;
    END
    SUSPEND;
    END
    /* Triggers only will work for SQL triggers */
    CREATE TRIGGER CREATE_DC_LOG_ID FOR T_DC_LOG ACTIVE BEFORE INSERT POSITION 0
    AS
    BEGIN
    IF (NEW.ID IS NULL) THEN
    NEW.ID = GEN_ID(NUMBER_LOG,1);
    END;

    Delphi-Code

    function Tdm_interbase.Add_LOG( Create_Date : TDateTime;
    Log_Type : integer; Comment : String) : integer;

    var Query : TQuery; begin
    Query := TQuery.Create(self); Query.DatabaseName := 'myDataBase';
    Query.SQL.Clear; Query.SQL := 'EXECUTE PROCEDURE ADD_T_DC_LOG("'+DateTimeToStr
    (Create_Date)+'","'+IntToStr(Log_Type)+'","'+comme nt+'")');
    Query.ExecSQL; Query.Close; Query.Free; end;

  • #2
    Hallo Hans-Joachim,

    im Ordner SQL-Server/Interbase habe ich Dir bereits einen Vorschlag unterbreitet. Hast Du ihn Dir schon einmal angeschaut und vor allem funktioniert er bei Dir?

    Tschüß

    Torste

    Comment


    • #3
      Danke für die Antwort, aber der Vorschlag ist noch nicht die Lösung.

      :-)) Hans-Joachim Gutman

      Comment


      • #4
        Hallo Hans-Joachim,

        auch bei mir funktioniert Deine Variante mit TQuery nicht (ich verstehe allerdings nicht warum).

        Warum kommt für Dich nicht der Einsatz der Delphi-Komponente TStoredProc in Frage (damit funktioniert es bei mir hervorragend)?

        Tschüß

        Torste

        Comment


        • #5
          Hallo Hans-Joachim,

          hier eine komplette Lösung mit der TStoredProc-Komponente:

          DelphiCode:

          <b><pre>
          function test(...): integer;
          var
          storedproc : Tstoredproc;
          begin
          storedproc := tstoredproc.create(self);
          storedproc.DatabaseName := 'MyDataBase';
          storedproc.storedprocname := 'ADD_T_DC_LOG';
          storedproc.Params.CreateParam(ftstring, 'comment', ptinput);
          storedproc.Params.CreateParam(ftinteger, 'ID', ptoutput);
          storedproc.ParamByName('comment').asstring := 'test123';
          storedproc.ExecProc;
          result := storedproc.ParamByName('ID').asinteger;
          storedproc.Close;
          storedproc.Free;
          end;

          </b></pre>

          Den Code der Stored-Procedure des Interbase-Servers würde ich, wie in meiner ersten Antwort, ändern (sonst bekommst Du nicht den ID-Wert des gerade eingefügten Datensatz zurück, sondern den eines bereits voher eingefügten "alten" Datensatzes).

          SQL-Code:
          <b><pre>
          create procedure ...
          ...
          begin
          begin
          id = gen_id(NUMBER_LOG, 1);
          insert into T_DC_LOG (comment, ID) values (:COMMENT, :ID);
          WHEN SQLCODE -530 DO EXCEPTION UNKNOWN_DC_LOG_ID;
          END
          SUSPEND;
          END
          </b></pre>

          Ich hoffe es hilft Dir.

          Tschüß

          Torste

          Comment


          • #6
            Danke, ich werde es ausprobieren

            :-)

            Comment

            Working...
            X