AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Firebird / UniDac - Insert über Query?
Thema durchsuchen
Ansicht
Themen-Optionen

Firebird / UniDac - Insert über Query?

Ein Thema von moelski · begonnen am 9. Feb 2010 · letzter Beitrag vom 6. Apr 2010
Antwort Antwort
Seite 1 von 3  1 23      
moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#1

Firebird / UniDac - Insert über Query?

  Alt 9. Feb 2010, 22:30
Datenbank: Firebird • Version: 2.5 • Zugriff über: ÛniDac
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:
  Query.Active := True;
  Query.SQLInsert.Add('INSERT Into Demo (demo.wert1) VALUES (12)');
  Query.Insert;
  Query.Post;
Will aber so nicht. Kriege immer die Meldung dass das SQL Statement nicht leer sein darf.

Wenn ich Query.SQL.Add nutze, dann sagt er mir das kein Return kommt vom Query ...

Kann mich da mal gerade einer "einnorden" ?
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Firebird / UniDac - Insert über Query?

  Alt 9. Feb 2010, 22:35
Entweder
Delphi-Quellcode:
  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;
oder
Delphi-Quellcode:
  Query.SQL.Text := 'INSERT Into Demo (demo.wert1) VALUES (12);';
  Query.ExecSQL:
Markus Kinzler
  Mit Zitat antworten Zitat
moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#3

Re: Firebird / UniDac - Insert über Query?

  Alt 21. Feb 2010, 07:38
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:
  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;
Was nicht geht ist eine Max Abfrage:
Delphi-Quellcode:
    Query.Close;
    Query.SQL.Text := 'Select max(ID) from DataStore;';
    Query.Active := True;
Da kriege ich den Fehler dass das Feld ID nicht gefunden werden kann.
erstaunlich ist aber, das ich das im Queryeditor mit genau dem Statement problemlos auslesen kann

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:
AS
BEGIN
if (NEW.ID is NULL) then NEW.ID = GEN_ID(AUTOINCID, 1);
END
Der AutoInc funktioiert auch wenn ich mit einem DB admin Tool einen neuen Datensatz anlege.

Doch wie kann ich den Trigger mittels UniDac nutzen und auch beim anlegen gleich die generierte ID zurück bekommen?
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#4

Re: Firebird / UniDac - Insert über Query?

  Alt 21. Feb 2010, 08:43
Den nächsten Wert eines Triggers kannst Du mit dem folgenden SQL-Befehl Abfragen SELECT NEXT VALUE FOR <generator_name> FROM RDB$DATABASE; Im Feld Gen_ID findest Du dann den nächsten Wert vom Trigger.

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 ALTER SEQUENCE <generator_name> RESTART WITH <ergebnis aus select - 1>; ausgeführt, damit der Trigger wieder auf dem alten Wert steht.

Eine Tabelle incl. AutoInc_Feld erstelle ich so :
SQL-Code:
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 ; ^
Edit1: Fehler in den BBCodes bereinigt.
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#5

Re: Firebird / UniDac - Insert über Query?

  Alt 21. Feb 2010, 08:54
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.

Und hast du eine Idee warum das nicht klappt:
Delphi-Quellcode:
Query.Close;
Query.SQL.Text := 'Select max(ID) from DataStore;';
Query.Active := True;
Obwohl das Feld ID definitiv vorhanden ist (ist der Primary Key).
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#6

Re: Firebird / UniDac - Insert über Query?

  Alt 21. Feb 2010, 09:27
Delphi-Quellcode:
Query.Close;
Query.SQL.Text := 'Select max(ID) from DataStore;';
Query.Open;
Probiere es mal so. Dann kannst Du über Query.Fields[0].AsInteger oder über Query.FieldByName('MAX').AsInteger den Wert abfragen.
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#7

Re: Firebird / UniDac - Insert über Query?

  Alt 21. Feb 2010, 09:40
Moin !

"mit der Hand vor den kopf hau" ....

Zitat:
Query.FieldByName('MAX').AsInteger
Und ich versuche die ganze Zeit ID abzufragen. Oh Mann. Da kann ich ja Tage suchen


Ok. Kann mir jetzt noch jemand einen Tip geben wie ich einen Strem in einem Blob ablege?
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat
moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#8

Re: Firebird / UniDac - Insert über Query?

  Alt 21. Feb 2010, 09:45
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;
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat
norwegen60

Registriert seit: 23. Dez 2007
Ort: Schwarzwald
505 Beiträge
 
Delphi 12 Athens
 
#9

Re: Firebird / UniDac - Insert über Query?

  Alt 5. Apr 2010, 12:43
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:
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 ; ^
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
Zitat von RWarnecke:
Den nächsten Wert eines Triggers kannst Du mit dem folgenden SQL-Befehl Abfragen SELECT NEXT VALUE FOR <generator_name> FROM RDB$DATABASE; Im Feld Gen_ID findest Du dann den nächsten Wert vom Trigger.
ist bei MsSQL nicht notwendig. Und den Zusatz
Zitat von RWarnecke:
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 ALTER SEQUENCE <generator_name> RESTART WITH <ergebnis aus select - 1>; ausgeführt, damit der Trigger wieder auf dem alten Wert steht.
verstehe ich auch nicht ganz. Ich möchte ja, dass der neue Wert gesperrt ist. Nicht dass ein anderer Anwender ihn auch vergibt.
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.


Viele Dank für jegliche Unterstützung
Gerd
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#10

Re: Firebird / UniDac - Insert über Query?

  Alt 5. Apr 2010, 18:37
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
Markus Kinzler
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:49 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz