![]() |
Datenbank: MariaDB • Version: 11 • Zugriff über: FireDAC
FireDAC INSERT oder EDIT
Hallo,
ich habe eine Tabelle, die einmal pro Sekunde "geupdatet" werden soll (in einer TIdThreadComponent); Ich versuche das derzeit so, was aber nicht richtig funktioniert (Erhängt sich meistens sehr schnell):
Code:
procedure TKommunikation.trdSqlDatenRun(Sender: TIdThreadComponent);
var Loop: Integer; begin for Loop := 1 to MaxmaschinenIndex do begin if (MaschinenListe[Loop].FrameType = 'TYP1') OR (MaschinenListe[Loop].FrameType = 'TYP2') then begin LogMaschinendatenToTempSql(Loop); end; end; Sleep(1000); //SqlDatenSleepTime); end; procedure TKommunikation.LogMaschinendatenToTempSql(Index: Integer); begin Daten.tblMaschinendaten_Temp.Open; Daten.tblMaschinendaten_Temp.Filtered := False; Daten.tblMaschinendaten_Temp.Filter := 'MaschinenIndex = ' + QuotedStr(Index.ToString); Daten.tblMaschinendaten_Temp.Filtered := True; DbgInfo('Index: ' + Index.ToString + ' - Recordcount: ' + Daten.tblMaschinendaten_Temp.RecordCount.ToString); if Daten.tblMaschinendaten_Temp.RecordCount = 0 then begin Daten.tblMaschinendaten_Temp.Insert; end else begin Daten.tblMaschinendaten_Temp.Edit; end; Daten.tblMaschinendaten_TempMaschinenIndex.AsInteger := Index; Daten.tblMaschinendaten_TempTemperatur.AsInteger := MaschinenDaten[Index].ActTemperature; Daten.tblMaschinendaten_TempPartial_Stueckzaehler.AsInteger := MaschinenDaten[Index].Partial_Pcs; Daten.tblMaschinendaten_TempTotal_Stueckzaehler.AsInteger := MaschinenDaten[Index].Total_Pcs; Daten.tblMaschinendaten_Temp.Post; Daten.tblMaschinendaten_Temp.Close; end; |
AW: FireDAC INSERT oder EDIT
Ist tblMaschinendaten_Temp ein TFDTable oder eine TFDQuery?
|
AW: FireDAC INSERT oder EDIT
tblMaschinendaten_Temp ist ein TFDTable.
|
AW: FireDAC INSERT oder EDIT
Und warum?
Das Ding läd sinnlos die komplette Tabelle, wobei eine Query, mit WHERE anstatt Filter, nur den einen Datensatz behandelt. Und MairaDB kann auch ein InsertOrUpdate ![]() womit garkein Datensatz runtergeladen werden muß, weil es reicht "ein" einfaches Execute abzuschicken. PS: ![]() Eventuell hilft IsEmpty oder EoF, anstatt RecordCount. Und was natürlich geht auch
Delphi-Quellcode:
oder
if Daten.tblMaschinendaten_TempMaschinenIndex.IsNull then
Delphi-Quellcode:
,
if Daten.tblMaschinendaten_TempMaschinenIndex.AsInteger <> Index then
denn entweder ist kein Datensatz ausgewählt und hat somit NULL, oder es gibt Einen und er hat den entsprechenden Index. :stupid: |
AW: FireDAC INSERT oder EDIT
@himitsu:
InsertOrUpdate im query habe ich schon probiert, aber ich bin irgendwie zu unwissend, es klappt einfach nicht, von daher mein Cryptoconstruct mit der Table etc. Ich möchte ja nur, wenn MaschinenIndex vorhanden, dann it neuen Daten updaten und wenn nicht da, dann anlegen mit den Daten... |
AW: FireDAC INSERT oder EDIT
Zitat:
|
AW: FireDAC INSERT oder EDIT
himitsu hat ja schon einen Link zu UpdateOrInsert für MariaDB zur Verfügung gestellt.
Das Beispiel auf der Seite:
SQL-Code:
ist doch recht simple und sollte einfach umzusetzen sein.
INSERT INTO ins_duplicate VALUES (1,'Antelope')
ON DUPLICATE KEY UPDATE animal='Antelope'; Das wäre auch aus meiner Sicht die sinnvollste Lösung. Alternativ könnte man erst mit einem Statement feststellen, ob ein Datensatz mit Bedingung x existiert und dann im Code entscheiden, ob ein Update oder Insert - Statement danach kommt. Ist auf jeden Fall schneller als mit TTable! Frank |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:28 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