![]() |
Datenbank: Firebird • Version: 2.5 • Zugriff über: ÛniDac
Firebird / UniDac - Insert über Query?
Moin !
Ich versuche gerade mittels UniDac in eine Tabelle (Firebird) einen Datensatz einzutragen. Habe mir dazu ein TUniQuery hergenommen. Und dann auf einen Button folgenden Code gelegt:
Delphi-Quellcode:
Will aber so nicht. Kriege immer die Meldung dass das SQL Statement nicht leer sein darf.
Query.Active := True;
Query.SQLInsert.Add('INSERT Into Demo (demo.wert1) VALUES (12)'); Query.Insert; Query.Post; Wenn ich Query.SQL.Add nutze, dann sagt er mir das kein Return kommt vom Query ... Kann mich da mal gerade einer "einnorden" :D ? |
Re: Firebird / UniDac - Insert über Query?
Entweder
Delphi-Quellcode:
oder
Query.Close;
Query.SQL.Text := 'select * from demo where 1=0;'; Query.Open; Query.SQLInsert.Text := 'INSERT Into Demo (demo.wert1) VALUES (12);'; Query.Insert; Query.Post;
Delphi-Quellcode:
Query.SQL.Text := 'INSERT Into Demo (demo.wert1) VALUES (12);';
Query.ExecSQL: |
Re: Firebird / UniDac - Insert über Query?
Moin !
Erstmal danke mkinzler !! Hätte da aber nochmal ne Frage. Ich komme mit dem UniDac noch nicht ganz klar. Und ich denke es liegt daran, das ich derzeit meist ADO verwendet habe. Und dort hat man eine DataSet Componente. Die ist einfacher zu handhaben als ein Query (zumindest für mich im moment ;) ). Was ich auch hinbekomme ist ein Append mit Query:
Delphi-Quellcode:
Was nicht geht ist eine Max Abfrage:
Query.Close;
Query.SQL.Text := 'select * from DataStore where 1=0;'; Query.Active := True; Query.Edit; Query.FieldByName('ID').AsInteger := 12; Query.FieldByName('FIELD1').AsWideString := 'Hallo'; Query.append;
Delphi-Quellcode:
Da kriege ich den Fehler dass das Feld ID nicht gefunden werden kann.
Query.Close;
Query.SQL.Text := 'Select max(ID) from DataStore;'; Query.Active := True; erstaunlich ist aber, das ich das im Queryeditor mit genau dem Statement problemlos auslesen kann :gruebel: Und könnte mir jemand sagen wie ich das mit einem AutoInc Feld mache? Ich habe in meiner Datenbank einen entsprechenden Trigger definiert und einen Generator: TRIG_AUTOINCID
SQL-Code:
Der AutoInc funktioiert auch wenn ich mit einem DB admin Tool einen neuen Datensatz anlege.
AS
BEGIN if (NEW.ID is NULL) then NEW.ID = GEN_ID(AUTOINCID, 1); END Doch wie kann ich den Trigger mittels UniDac nutzen und auch beim anlegen gleich die generierte ID zurück bekommen? |
Re: Firebird / UniDac - Insert über Query?
Den nächsten Wert eines Triggers kannst Du mit dem folgenden SQL-Befehl Abfragen
SQL-Code:
Im Feld Gen_ID findest Du dann den nächsten Wert vom Trigger.
SELECT NEXT VALUE FOR <generator_name> FROM RDB$DATABASE;
Edit2 : Aber aufpassen, wenn der SELECT-Befehl ausgeführt wird, dann wird der Trigger angestossen und um eins erhöht. Ich habe dann nochmal den Befehl
SQL-Code:
ausgeführt, damit der Trigger wieder auf dem alten Wert steht.
ALTER SEQUENCE <generator_name> RESTART WITH <ergebnis aus select - 1>;
Eine Tabelle incl. AutoInc_Feld erstelle ich so :
SQL-Code:
Edit1: Fehler in den BBCodes bereinigt.
CREATE TABLE Adresse (
AutoInd INTEGER, Feld1 INTEGER, Feld2 INTEGER, Feld3 CHAR(50), Feld4 CHAR(50) ); CREATE GENERATOR GEN_Adresse_ID; SET TERM ^ ; create trigger Adresse_bi for Adresse active before insert position 0 as begin if (new.AutoInd is null) then new.AutoInd = gen_id(gen_Adresse_id,1); end ^ SET TERM ; ^ SET TERM ^ ; create procedure sp_gen_Adresse_id returns (AutoInd integer) as begin AutoInd = gen_id(gen_Adresse_id, 1); suspend; end ^ SET TERM ; ^ |
Re: Firebird / UniDac - Insert über Query?
Moin Rolf,
Danke für den Tip. werde ich gleich mal testen. Aber könnte man nicht auch "procedure sp_gen_Adresse_id" verwenden? Die ist zwar in deinem Create dabei, wird aber ansonsten nie genutzt. :gruebel: Und hast du eine Idee warum das nicht klappt:
Delphi-Quellcode:
Obwohl das Feld ID definitiv vorhanden ist (ist der Primary Key).
Query.Close;
Query.SQL.Text := 'Select max(ID) from DataStore;'; Query.Active := True; |
Re: Firebird / UniDac - Insert über Query?
Delphi-Quellcode:
Probiere es mal so. Dann kannst Du über Query.Fields[0].AsInteger oder über Query.FieldByName('MAX').AsInteger den Wert abfragen.
Query.Close;
Query.SQL.Text := 'Select max(ID) from DataStore;'; Query.Open; |
Re: Firebird / UniDac - Insert über Query?
Moin !
"mit der Hand vor den kopf hau" .... Zitat:
Ok. Kann mir jetzt noch jemand einen Tip geben wie ich einen Strem in einem Blob ablege? |
Re: Firebird / UniDac - Insert über Query?
Moin !
Habs gefunden mit dem BLOB:
Delphi-Quellcode:
begin
Query.SQL.Text := 'SELECT * FROM DataStore WHERE ID=12'; Query.Open; Query.Edit; Stream := Query.CreateBlobStream(Query.FieldByName('MEMO'), bmWrite); try Memo1.Lines.SaveToStream(Stream); finally Stream.Free; end; Query.Post; end; |
Re: Firebird / UniDac - Insert über Query?
Hallo zusammen,
mir geht es gerade ähnlich wie moelski. Ich habe zuerst von Paradox auf MsSQL umgestellt und teste jetzt Firebird. Beim Transferieren einer Paradox-Tabelle zu Firebird wurde automatisch u.a. ein Trigger
SQL-Code:
angelegt. Der funktioniert innerhalb FlameRobin auch einwandfrei. Wenn ich jetzt aber in einer Delphianwendung per UniDac TUniQuerry.Insert einen Datensatz anlege und per TUniQuerry.post speichere, kommt die Fehlermeldung dass das Feld ID keinen Wert hat (ID = primarykey = integer = not null). Bei Verwendung von MsSQL passiert das nicht. Wie kann/muss ich das Programm jetzt aufbauen, dass es sowohl mit Firebird als auch MsSQL läuft. Der Ansatz
SET TERM ^ ;
ALTER TRIGGER TRIG_DIAS_BI INACTIVE BEFORE INSERT POSITION 0 AS BEGIN IF(NEW."ID" IS NULL) THEN NEW."ID" = GEN_ID("GEN_DIAS_ID",1); END^ SET TERM ; ^ Zitat:
Zitat:
Wie muss ich das ganze gestalten, dass ich den Code für alle Tabellen einer DB verwenden kann ohne mich jedes mal aufs neue damit auseinanderzusetzen. Eiegntlich fehlt mir nur so eine Art Refresh, der nach dem Insert-Befehl mein ID-Feld mit dem generierten Wert belegt. Und der so, dass er sowohl mit MsSQL und Firebird arbeitet. Mein Hauptjob ist die Steuerung komplexer Maschinen und die DB nur ein notwendiges Übel. :cry: Viele Dank für jegliche Unterstützung Gerd |
Re: Firebird / UniDac - Insert über Query?
Lass mal die Abfrage auf NULL im Trigger weg, dann wirkt der autoinc in jedem Fall. Sonst müsste das Feld NULL oder nicht belegt sein und darf auch keinen Standardwert haben
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:41 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz