AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Access Violation - OnFilterRecord - UniDAC
Thema durchsuchen
Ansicht
Themen-Optionen

Access Violation - OnFilterRecord - UniDAC

Ein Thema von Ritsch · begonnen am 21. Okt 2016 · letzter Beitrag vom 1. Nov 2016
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Ritsch
Ritsch

Registriert seit: 15. Apr 2014
Ort: Wolfenbüttel
33 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#1

Access Violation - OnFilterRecord - UniDAC

  Alt 21. Okt 2016, 10:50
Datenbank: Sybase • Version: 10 • Zugriff über: ODBC
Hallo.

Unsere Software wurde bisher mit RAD Studio XE7 entwickelt.
Jetzt möchten wir auf 10.1 Berlin umsteigen und stoßen dabei auf ein erhebliches Problem.
Wir verwenden die UniDAC DB-Komponenten.

An unserem TUniTable arbeiten wir dem Event "OnFilterRecord".

Dort ist bspw. folgender Code

Delphi-Quellcode:
begin
  inherited;
    Accept:= (DataSet.FieldByName('D10B00000_Aktiv').AsInteger = 1);
    Accept:= (Accept and (StrToInt64Def(DataSet.FieldByName('D10B00000_ModulNr').AsString, -1) = Self.oMyD11D00000Config.iModulNr));
    Accept:= (Accept and (StrToInt64Def(DataSet.FieldByName('D10B00000_ModulUnterNr').AsString, -1) = 1));
end;
Dieser Code funktioniert tadellos wenn ich das Projekt mit XE7 erstelle.

Unter 10.1 Berlin bekomme ich nun allerdings eine Access Violation, allerdings erst beim zweiten Öffnen eines Datensatzes.
D.h. ich öffne das Programm bzw. das Modul, öffne einen Datensatz und das Event arbeitet korrekt.
Schließe ich jetzt den Datensatz und öffnen den gleichen oder einen anderen Datensatz erneut, bekomme ich eine Access Violation.
Wenn ich vorher das komplette Modul schließe und wieder öffne, funktioniert es wieder beim ersten Datensatz.

Irgendwelche Tipps?

Gruß
Richard
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

AW: Access Violation - OnFilterRecord - UniDAC

  Alt 21. Okt 2016, 10:58
In welcher Zeile tritt die AV auf?
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Ritsch
Ritsch

Registriert seit: 15. Apr 2014
Ort: Wolfenbüttel
33 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#3

AW: Access Violation - OnFilterRecord - UniDAC

  Alt 21. Okt 2016, 11:01
Accept:= (DataSet.FieldByName('D10B00000_Aktiv').AsInteger = 1);
Richard
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

AW: Access Violation - OnFilterRecord - UniDAC

  Alt 21. Okt 2016, 11:16
Ist da die Exception oder steht da nur der Cursor, nach der Exception? (der Cursor steht oft gern im nachfolgenden Befehl)

Zitat:
inherited;
Ist eure Form vererbt und passiert daher eventuell was im inherited?
Wenn nicht vererbt, dann macht inherited nix, da es im Vorfahren keine gleichnamige Methode gibt.


Statt DataSet darf man hier auch gern TDataSet(Sender) oder (Sender as TDataSet) verwenden, denn da steht immer das richtige DataSet drin.

Zitat:
.AsInteger = 1
.AsBoolean kommt doch auch mit Integern klar? (nur als Hinweis, abber hier erstmal egal)
Aber wenn, dann würde ich hier sicherheitshalber eher .AsInteger <> 0 anstatt .AsInteger = 1 verwenden.
$2B or not $2B

Geändert von himitsu (21. Okt 2016 um 11:21 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Ritsch
Ritsch

Registriert seit: 15. Apr 2014
Ort: Wolfenbüttel
33 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#5

AW: Access Violation - OnFilterRecord - UniDAC

  Alt 21. Okt 2016, 11:34
(Sender as TDataSet) Kann ich leider nicht verwenden, da:procedure (DataSet: TDataSet; var Accept: Boolean)
Wir verwenden das Event so gut wie in allen Modulen, überall tritt dieser Fehler auf.
Z.B. auf hier:
Accept:= (FieldAsInt64(DataSet.FieldByName('D41400000_ID')) <> Self.iCurrID); Bin mal mit F7 in die Funktion FieldAsInt64 gegangen. Habe ein Snip in den Anhang gesetzt.
Miniaturansicht angehängter Grafiken
av.png  
Richard
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#6

AW: Access Violation - OnFilterRecord - UniDAC

  Alt 21. Okt 2016, 17:53
Zugriffsverletzungen erscheinen nur dann, wenn auf eine nicht (mehr) existente Instanz zugegriffen wird. In dem Fall ist Field wohl nil. Jetzt gilt es, herauszufinden wieso das der Fall ist.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#7

AW: Access Violation - OnFilterRecord - UniDAC

  Alt 21. Okt 2016, 18:43
FieldByName prüft aber, ob das TField existiert und gibt nur dann den Zeiger zurück. Sonst wirft es eine "ordentliche" Exception.

FindField macht das Gleiche, aber bei Nichtexistenz gibt es nil zurück.
$2B or not $2B
  Mit Zitat antworten Zitat
hoika

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

AW: Access Violation - OnFilterRecord - UniDAC

  Alt 22. Okt 2016, 06:07
Hallo,
wenn der Fehler immer kommt,
ist das doch ein schöner Punkt für ein "Minimalbeispiel".
Nimm eine lokale Variable für das FieldByName -> MyField.
Was ergibt z.B. MyField.Name im WatchFenster?

Was ich nie verstanden habe, ist, warum man solchen Code schreibt,
ohne eine lokale Variable zu benutzen.
Das macht doch das Debuggen soviel einfacher!
Heiko

Geändert von hoika (22. Okt 2016 um 06:09 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Ritsch
Ritsch

Registriert seit: 15. Apr 2014
Ort: Wolfenbüttel
33 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#9

AW: Access Violation - OnFilterRecord - UniDAC

  Alt 24. Okt 2016, 09:36
Zugriffsverletzungen erscheinen nur dann, wenn auf eine nicht (mehr) existente Instanz zugegriffen wird. In dem Fall ist Field wohl nil. Jetzt gilt es, herauszufinden wieso das der Fall ist.
Das ist mir bewusst, was die AV aussagt.
Daher habe ich schon probiert vorher mit if assigned zu arbeiten, allerdings ohne Erfolg.

Zitat:
Hallo,
wenn der Fehler immer kommt,
ist das doch ein schöner Punkt für ein "Minimalbeispiel".
Nimm eine lokale Variable für das FieldByName -> MyField.
Was ergibt z.B. MyField.Name im WatchFenster?
Siehe Anhang.

Zitat:
Was ich nie verstanden habe, ist, warum man solchen Code schreibt,
ohne eine lokale Variable zu benutzen.
Das macht doch das Debuggen soviel einfacher!
Das ist Geschmackssache bzw. wie man es gewohnt ist zu arbeiten
Miniaturansicht angehängter Grafiken
av2.png  
Richard
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#10

AW: Access Violation - OnFilterRecord - UniDAC

  Alt 24. Okt 2016, 09:45
Zugriffsverletzungen erscheinen nur dann, wenn auf eine nicht (mehr) existente Instanz zugegriffen wird. In dem Fall ist Field wohl nil. Jetzt gilt es, herauszufinden wieso das der Fall ist.
Das ist mir bewusst, was die AV aussagt.
Daher habe ich schon probiert vorher mit if assigned zu arbeiten, allerdings ohne Erfolg.
Naja gut. Assigned() prüft aber nur, ob die Variable nicht nil ist. Wenn die Variable aber noch auf ein Objekt zeigt welches mal existiert hat, aber mit Free freigegeben wurde, dann gibt dir Assigned() trotzdem true aus.

Himitsu hat ja gemeint, dass FieldByName selbst auf Assigned() prüft. Vielleicht passiert dann ja im Hintergrund noch was. Gibst du das DataSet irgendwo wieder frei? Bspw. in einem Timer Event oder so? Nicht das sich da etwas beist.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      

 

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