AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi FireDAC NO_SQL_DATA error

FireDAC NO_SQL_DATA error

Ein Thema von haentschman · begonnen am 7. Jun 2021 · letzter Beitrag vom 9. Jun 2021
Antwort Antwort
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
4.763 Beiträge
 
Delphi 10.1 Berlin Professional
 
#1

FireDAC NO_SQL_DATA error

  Alt 7. Jun 2021, 14:18
Datenbank: MSSQL • Version: 2017 • Zugriff über: FireDAC
Hallöle...

Ich scheitere mal wieder and den einfachsten Sachen.

Projekt Datatabase Events:
1. Trigger erstellt
Code:
create table _Events
(
  ID int IDENTITY(1,1) NOT NULL,
  EventType int NOT NULL,
  EventName nvarchar(30) NOT NULL,
  EventCurrentGUID uniqueidentifier NOT NULL,
  CONSTRAINT Events_pk PRIMARY KEY CLUSTERED (ID ASC)
)
create index ixEventType on _Events (EventType)
GO

/* Events */
insert into _Events (EventType, EventName, EventCurrentGUID) values (0, 'Complete', NEWID())
GO

/* Trigger*/
create trigger TR_Complete on Complete for insert, update, delete as
begin
  update _Events set EventCurrentGUID = NEWID() where EventType = 0
end
GO
2. Trigger getestet - Fehlerfrei -> mit jedem Aufruf eine neue GUID


Problem:
1. Tabellen Änderung (Tabelle XY) über externen Editor (DBeaver) -> Event wird ausgeführt...ohne Fehler
2. Anwendung mit FireDAC:
- Jedes Post der Tabelle XY über Query resultiert im Fehler! (Bild 1)
- Fortsetzen -> Fehler (Bild 2)

Was ich probiert habe:

-> Trigger aus der Tabelle XY raus -> kein Fehler mehr!
-> Beide Tabellen XY und _Events haben einen Primary Key!

Jetzt ist mein Latein am Ende...ich hoffe auf eine Erklärung.

PS: Die Tante ist nicht wirklich gesprächig.
z.B.: https://stackoverflow.com/questions/...-delphi-10-3-1
...das sieht nicht nach der Problelösung aus, sondern am Herumdoktern an den Symthomen.

Danke...

Nachtrag:
Morgen werde ich das mal probieren:
https://stackoverflow.com/questions/...ith-nocount-on
Update in SP verlagern und NOCOUNT_OFF
...schaun wir mal.

Update:
SET NOCOUNT ON im Trigger scheint es gebracht zu haben. Keine Meldung mehr. Jetzt muß ich noch testen ob das für jeden Trigger gilt oder global. Alternativ SP.
Miniaturansicht angehängter Grafiken
fehler1.png   fehler2.png  

Geändert von haentschman ( 7. Jun 2021 um 16:03 Uhr)
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
2.947 Beiträge
 
Delphi 2010 Enterprise
 
#2

AW: FireDAC NO_SQL_DATA error

  Alt 7. Jun 2021, 21:19
Du hast es ja schon im Griff, also nur mal so aus der Ferne ein Gedanke:
Wenn man Trigger macht, die auf Updates einer Tabelle reagieren und als (re)Aktion im Trigger ein Update auf die gleiche Tabelle macht, ist das nicht endlose Rekursion?

Also käme in Betracht, den Trigger nur bei Insert zu zünden, das Update, das daraus resultiert, bliebe folgenlos (aus Sicht des Triggers)
Gilt es aber auch für Updates zu feueren, dann vielleicht etwas selektiver, über Vergleiche von old und new Values der Felder, explizit ausgenommen die GUID, die ja offenbar das Ergebnis der Aktion sein soll und nicht der Treiber.

Dann gibt es gefühlt auch noch irgendwelche Optionen im Bereich Transaktionen, vor allem Client regulierte Transaktionen. Wenn das Heilmittel oder Rezept eine (gekapselte) SP ist, bringt das u.a. eine per Definition abgeschlossene Transaktion, wo niemand reinfuscht- und wo dann auch das rekursive Trigger Problem nicht auftritt.

P.S.: Der Trigger geht gar nicht auf _Event, sondern auf Complete. Also Blödsinn, was ich geschrieben habe
Gruß, Jo

Geändert von jobo ( 7. Jun 2021 um 21:23 Uhr) Grund: verzögerte Erkenntnis
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
2.947 Beiträge
 
Delphi 2010 Enterprise
 
#3

AW: FireDAC NO_SQL_DATA error

  Alt 7. Jun 2021, 21:34
Ich hab mal Erkenntnis und Sachlage ignoriert und ein falsches Script laufen lassen. Interessante Ergebnisse im unteren Drittel.

https://dbfiddle.uk/?rdbms=sqlserver...a513df2b756bda
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
4.763 Beiträge
 
Delphi 10.1 Berlin Professional
 
#4

AW: FireDAC NO_SQL_DATA error

  Alt 8. Jun 2021, 08:27
Moin...
Zitat:
Wenn man Trigger macht, die auf Updates einer Tabelle reagieren und als (re)Aktion im Trigger ein Update auf die gleiche Tabelle macht, ist das nicht endlose Rekursion?
Der Trigger ist in Table Complete vorhanden und aktualisiert ausschließlich Table _Events
Code:
create table _Events
(
  ID int IDENTITY(1,1) NOT NULL,
  EventType int NOT NULL,
  EventName nvarchar(30) NOT NULL,
  EventCurrentGUID uniqueidentifier NOT NULL,
  CONSTRAINT Events_pk PRIMARY KEY CLUSTERED (ID ASC)
)
create index ixEventType on _Events (EventType)
GO

/* Events */
insert into _Events (EventType, EventName, EventCurrentGUID) values (0, 'Complete', NEWID())
GO

/* Trigger*/
create trigger TR_Complete on Complete for insert, update, delete as
begin
  update _Events set EventCurrentGUID = NEWID() where EventType = 0
end
GO
Zitat:
Interessante Ergebnisse im unteren Drittel
..was meinst du? Der doppelte EventType? Der ist immer eindeutig. Da aber alle Events manuell von mir manuell eingetragen werden, habe ich auf eine Prüfung verzichtet.


UPDATE:
1. SP erstellt
Code:
create procedure SP_EventsUpdate @EventType int
as
begin
  set NOCOUNT ON;
  update _Events set EventCurrentGUID = NEWID() where EventType = @EventType
end
GO
2. Trigger auf SP umgestellt
Code:
create trigger TR_Complete on Complete for insert, update, delete as
begin
  exec SP_EventsUpdate @EventType = 0
end
GO
PS: Das NOCOUNT ON im Trigger galt nur für diesen. Alle Anderen haben den Fehler geschmissen. Da war eine SP besser...

Geändert von haentschman ( 8. Jun 2021 um 09:33 Uhr)
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
2.947 Beiträge
 
Delphi 2010 Enterprise
 
#5

AW: FireDAC NO_SQL_DATA error

  Alt 8. Jun 2021, 19:00
Moin...
Zitat:
Interessante Ergebnisse im unteren Drittel
..was meinst du?
Egal, nur ein bisschen rumgespielt und auch nicht die richtigen Dinge zur Hand.
Ich hatte ja zunächst übersehen, dass 2 verschiedene Tabellen im Spiel sind. Hab ich ja auch geschrieben. Aber ich hab weiter gespielt. Die 2. Tabelle hast Du nicht veröffentlicht und ich habe Deinen Code etwas verdreht (eben nur mit einer Tabelle) laufen lassen. Im Link sieht man beim 2. Insert, dass das Einfügen von nur 1 Datensatz relativ viele Rows betrifft (rows affected). Mehr, als man erwarten würde?

Ich nehme an, der Fehler (SQL_NO_DATA) soll eigentlich ein Schutzmechnismus sein, den NOCOUNT ON abschaltet.
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
4.763 Beiträge
 
Delphi 10.1 Berlin Professional
 
#6

AW: FireDAC NO_SQL_DATA error

  Alt 9. Jun 2021, 06:42
Moin...
Zitat:
Mehr, als man erwarten würde?
Ja, aber bedingt duch den EventType, der in deinem Beispiel immer 0 ist.

Ich echt ist es immer nur ein Datensatz.
Delphi-Quellcode:
/* Events statisch manuell */
insert into _Events (EventType, EventName, EventCurrentGUID, EventActive) values (1, 'Part', NEWID(), 1)
insert into _Events (EventType, EventName, EventCurrentGUID, EventActive) values (2, 'PartDefault', NEWID(), 1)
insert into _Events (EventType, EventName, EventCurrentGUID, EventActive) values (3, 'Address', NEWID(), 1)
insert into _Events (EventType, EventName, EventCurrentGUID, EventActive) values (4, 'AddressType', NEWID(), 1)
insert into _Events (EventType, EventName, EventCurrentGUID, EventActive) values (5, 'Empoyee', NEWID(), 1)
insert into _Events (EventType, EventName, EventCurrentGUID, EventActive) values (6, 'EmpoyeeGroup', NEWID(), 1)
insert into _Events (EventType, EventName, EventCurrentGUID, EventActive) values (7, 'EmpoyeeQualificationType', NEWID(), 1)
insert into _Events (EventType, EventName, EventCurrentGUID, EventActive) values (8, 'EmpoyeeType', NEWID(), 1)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 +2. Es ist jetzt 12:14 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf