Delphi MySQL lekérdezés újrafuttatása
2020-05-07T21:35:46+02:00
2020-05-08T12:10:49+02:00
2022-08-11T19:50:30+02:00
Dezsi82
Sziasztok!
Egy alkalmazást készítek, ami egy MySQL adatbázisban tárolt adatokat frissít az adatbázisban tárolt időintervallum függvényében.
Így néz ki a kód:
 
while not Terminated do begin ServiceThread.ProcessRequests(false); //Handle SQL connection if not FSQLConnection.Connected then FSQLConnection.Connected:=True; //Handle PLC connection if not FPLC.Connected then FPLC.ConnectTo(FAddress,FRack,FSlot); if FPLC.Connected and FSQLConnection.Connected then begin //Get variables from SQL to read FSQLQuery.SQL.Clear; FSQLQuery.SQL.Add('SELECT Tag,PLCAddress,"production.db_int" AS "DB" FROM production.db_int'); FSQLQuery.SQL.Add('UNION'); FSQLQuery.SQL.Add('SELECT Tag,PLCAddress,"production.db_bool" FROM production.db_bool'); FSQLQuery.SQL.Add('WHERE (LastUpdated IS NULL) OR ((TIMESTAMPDIFF(MICROSECOND,LastUpdated,UTC_Timestamp) / 1000)>Frequency);'); try FSQLQuery.Open; FSQLQuery.First; ... while not FSQLQuery.EOF do begin ... FSQLQuery.Next; end; Except on E : Exception do begin LogThread.AddLog(DateTimeToStr(Now)+';Failed SQL Query:'+FSQLQuery.SQL.Text+';'+E.Message); end; end; //Read memory areas from PLC ... //Update SQL FSQLQuery.First; SQLText.Clear; while not FSQLQuery.Eof do begin ... DBName := FSQLQuery.FieldByName('DB').AsString; TagName := FSQLQuery.FieldByName('Tag').AsString; SQLText.Add('UPDATE '+DBName+' SET VALUE=UNHEX("'+Data+'"), LastUpdated=UTC_TIMESTAMP WHERE Tag="'+TagName+'";') FSQLQuery.Next; end; FSQLQuery.Close; if SQLText.Text<>'' then begin FSQLConnection.ExecSQL(SQLText.Text); end; end; TThread.Sleep(100); end;
A ciklus lényegében annyiból áll, hogy az adatbázisből lekérem azokat a recordokat amiket frissíteni kell, beolvasom a megfelelő változókat a PLCből, és visszaírom az adatbázisba, és ezt az időpontot elmentem szintén az adatbázisban. Jelenleg 2 rekord van az adatbázisban, az egyik 1, a másik 10 másodpercenként kellene hogy frissüljön, mégis minden ciklusban két rekordot kapok.
Amikor workbenchbe írom be a lekérdezést, az elvárt eredményt kapom. Egy másodperc után egy rekord, tíz másodperc után két rekordot ad a lekérdezés. Olyan mintha nem hajtaná végre a lekérdezést a ciklus.
Hogyan lehetne elérni, hogy a lekerdezés minden ciklusnál lefusson?
Előre is köszönöm
Mutasd a teljes hozzászólást!
Nem lehet az, hogy az UPDATE valami miatt nem történik meg (vagy nem "jól" történik meg), és a Frequency feltételed emiatt mindig teljesül (az UNION második részében)?
Mutasd a teljes hozzászólást!

Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd