AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken FireDAC : Trigger geht nicht
Thema durchsuchen
Ansicht
Themen-Optionen

FireDAC : Trigger geht nicht

Ein Thema von Hansa · begonnen am 4. Sep 2015 · letzter Beitrag vom 7. Sep 2015
Antwort Antwort
Seite 2 von 2     12   
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.277 Beiträge
 
Delphi 10.4 Sydney
 
#1

AW: FireDAC : Trigger geht nicht

  Alt 4. Sep 2015, 16:19
Hallo,
vielleicht hilft das ja.

http://docwiki.embarcadero.com/RADSt..._%28FireDAC%29

Also:
Set TField.AutoGenerateValue to arAutoInc for an auto-incrementing field. This method does not create a TFDAutoIncField, it works with any field type, and may require additional field properties setup, like setting ProviderFlags, Required and ReadOnly.


Zu spät ... (AutoInc)
So, jetzt zeig mal deine Tabellenstruktur.


Heiko
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.652 Beiträge
 
Delphi 12 Athens
 
#2

AW: FireDAC : Trigger geht nicht

  Alt 4. Sep 2015, 15:17
Das dürfte alles nicht viel sein, irgendeine dumme Einstellung, aber momentan ein Rätsel. Mir fällt langsam nichts mehr ein, wo ich nachgucken soll
Wie schon erwähnt, prüfe doch ob das ID-Feld wirklich als TFDAutoIncField erkannt wurde.

Dann das obligatorische "ist der Stecker drin?", sprich: bist du auch sicher mit derselben Datenbank verbunden?

Wenn es machbar ist, lannst du ja auch mal die nötigen Sourcen hier anhängen, damit wir auch was sehen können.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.652 Beiträge
 
Delphi 12 Athens
 
#3

AW: FireDAC : Trigger geht nicht

  Alt 4. Sep 2015, 14:12
Lasse ich obiges Delphi-Programm laufen, dann kommt allerdings folgende Fehlermeldung : "Das Feld ID muss einen Wert haben". Wieso das ?
Eigentlich erkennt FireDAC solche AutoInc-Felder ganz gut. Ist denn bei dir das ID-Feld auch ein TFDAutoIncField? Wenn nicht, lass es einfach nochmal im Feldeditor erzeugen. Sollte es nicht erkannt werden, musst du eventuell selbst Hand anlegen: Auto-Inkrementierungsfelder (FireDAC)


Nachtrag : ersetze ich das Insert durch ein Edit, dann laufen in dem Kontrollmemo schön die Tausender durch, das Feld BEZ bleibt aber bei dem vorher manuell eingegeben Wert. Da wird also in diesem Fall nichts abgespeichert, ohne dass Fehlermeldung kommt.
Na ja, bei einem Edit bearbeitest du ja auch immer denselben Datensatz, der ja auch schon eine ID hat.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#4

AW: FireDAC : Trigger geht nicht

  Alt 5. Sep 2015, 00:24
Hansa, ich seh da nur das eine Problem aus deinem Eingangsposting:

Delphi-Quellcode:
    DM.DS.Insert;
    DM.DS.FieldByName('NR').AsInteger := i + 100;
    DM.DS.FieldByName('BEZ').AsInteger := i;
    DM.DS.Post;
    if i mod 1000 = 0 then begin
mem1.Lines.Add(IntToStr (i));
      DM.Trans.Commit;
      DM.Trans.StartTransaction;
    end;
Du versuchst, ein Feld, das durch eine Trigger-Generator-Kombination von der DB beim Insert automatisch befüllt wird, im vom Clienten aus zuzuweisen. Also ent oder weder ...

In solchen Fällen erhalte ich ebenfalls eine Fehlermeldung, das kann nicht funktionieren. Du legst ja auch den Wert des PrimaryKeys nicht im Client fest, wenn du dafür in der DB ebenfalls einen Trigger hast, der bereits reagiert, bevor die vom Client gesendeten Daten eingetragen werden. Laß also einfach die Zuweisung an das Feld NR im Client weg und du hast dieses Problem nicht mehr.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.277 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: FireDAC : Trigger geht nicht

  Alt 5. Sep 2015, 05:17
Hallo,
das Autoinc-Feld ist aber ID, nicht NR ...


Heiko
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman
Online

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.437 Beiträge
 
Delphi 12 Athens
 
#6

AW: FireDAC : Trigger geht nicht

  Alt 5. Sep 2015, 05:36
Hallo Hansa,

mache doch einfach mal ein
Code:
FireDacQuery.SQL.Text:= 'insert into TABLE (NR,BEZ) values (:nr,:be)'; // vor der Schleife -> nur einmal zuweisen. Macht bei den heutigen Rechnern kaum einen Unterschied.
FireDacQuery.ParamByName('nr').AsInteger:= i + 100; //die Parametersyntax könnte ggf. abweichen
FireDacQuery.ParamByName('be').AsInteger:= i;
FireDacQuery.ExecSQL;
Wie schon gefragt. (Antwort vieleicht überlesen) Wird der Generator erhöht wenn dein Fehler kommt?

Geändert von haentschman ( 5. Sep 2015 um 05:38 Uhr)
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#7

AW: FireDAC : Trigger geht nicht

  Alt 5. Sep 2015, 07:23
Hallo Hansa,

mache doch einfach mal ein
Code:
FireDacQuery.SQL.Text:= 'insert into TABLE (NR,BEZ) values (:nr,:be)'; // vor der Schleife -> nur einmal zuweisen. Macht bei den heutigen Rechnern kaum einen Unterschied.
FireDacQuery.ParamByName('nr').AsInteger:= i + 100; //die Parametersyntax könnte ggf. abweichen
FireDacQuery.ParamByName('be').AsInteger:= i;
FireDacQuery.ExecSQL;
Wie schon gefragt. (Antwort vieleicht überlesen) Wird der Generator erhöht wenn dein Fehler kommt?
Hansa schrieb weiter oben, dass der Trigger funktioniert.

Aber ließe sich der obige Code nicht noch erweitern, in dem man immer eher sowas macht:
Delphi-Quellcode:
sSQL := 'insert into TABLE (NR,BEZ) values (%d,%s);';
DM.Query.SQL.Clear;
DM.Trans.StartTransaction;
for i := 1 to n do begin
  DM.Query.SQL.Add(Format(sSQL,[i + 100,QuotedStr(i)]));
  if i Mod 1000 = 0 then begin
    DM.Query.ExecSQL;
    DM.Trans.Commit;
    mem1.Lines.Add(IntToStr(i));
    DM.Query.SQL.Clear;
    DM.Trans.StartTransaction;
  end;
end;
Hier werden dann halt immer 1000 Inserts an einem Stück an die Datenbank gegeben und von ihr verarbeitet, statt satzweise. Hab' sowas in de Art vor Jahren mal bei 'ner SQL-Server-Datenbank gemacht, dass hat bei der zu verarbeitenden Datenmenge etliche Stunden Zeitersparnis gebracht.
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.920 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: FireDAC : Trigger geht nicht

  Alt 5. Sep 2015, 08:29
Hier werden dann halt immer 1000 Inserts an einem Stück an die Datenbank gegeben und von ihr verarbeitet, statt satzweise. Hab' sowas in de Art vor Jahren mal bei 'ner SQL-Server-Datenbank gemacht, dass hat bei der zu verarbeitenden Datenmenge etliche Stunden Zeitersparnis gebracht.
Diesen Ansatz gibt es in FireDAC nativ und je nach DBMS kann FireDAC gegenüber eine Lösung mit Format() optimieren. Nennt sich Array DML.
(http://docwiki.embarcadero.com/RADSt...ehls_(FireDAC))
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
Benutzerbild von IBExpert
IBExpert

Registriert seit: 15. Mär 2005
695 Beiträge
 
FreePascal / Lazarus
 
#9

AW: FireDAC : Trigger geht nicht

  Alt 5. Sep 2015, 08:59
Hier werden dann halt immer 1000 Inserts an einem Stück an die Datenbank gegeben und von ihr verarbeitet, statt satzweise. Hab' sowas in de Art vor Jahren mal bei 'ner SQL-Server-Datenbank gemacht, dass hat bei der zu verarbeitenden Datenmenge etliche Stunden Zeitersparnis gebracht.
Wenn es um maximum Speed mit Firebird geht, sammel die Daten als Insert Befehle zeilenweise mit Semikolon getrennt z.B. lokal in einer TStringlist (aber nicht mehr als 255 Befehle und nicht länger als 32kb) und übergebe die Werte direkt im Text (keine parameter benutzen). Danach dann noch eine Zeile mit "execute block as begin " davor und ein "end" an Ende dahinter und schick das in eine Query.sql property und führ das aus mit Query.execSql.

Damit sind auch aus Delphi heraus bis zu 10000 Inserts pro Sekunde in die Firebird DB machbar.
Holger Klemt
www.ibexpert.com - IBExpert GmbH
Oldenburger Str 233 - 26203 Wardenburg - Germany
Firebird 5 Update und Know-how Workshop – 28.8.-29.08.2025 64546 Mörfelden - Walldorf
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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:45 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