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;
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;
Comment