![]() |
Datenbank: Sybase • Version: 10 • Zugriff über: ODBC
Access Violation - OnFilterRecord - UniDAC
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:
Dieser Code funktioniert tadellos wenn ich das Projekt mit XE7 erstelle.
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; 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ß |
AW: Access Violation - OnFilterRecord - UniDAC
In welcher Zeile tritt die AV auf?
|
AW: Access Violation - OnFilterRecord - UniDAC
Delphi-Quellcode:
Accept:= (DataSet.FieldByName('D10B00000_Aktiv').AsInteger = 1);
|
AW: Access Violation - OnFilterRecord - UniDAC
Ist da die Exception oder steht da nur der Cursor, nach der Exception? (der Cursor steht oft gern im nachfolgenden Befehl)
Zitat:
Wenn nicht vererbt, dann macht inherited nix, da es im Vorfahren keine gleichnamige Methode gibt. Statt
Delphi-Quellcode:
darf man hier auch gern
DataSet
Delphi-Quellcode:
oder
TDataSet(Sender)
Delphi-Quellcode:
verwenden, denn da steht immer das richtige DataSet drin.
(Sender as TDataSet)
Zitat:
Delphi-Quellcode:
kommt doch auch mit Integern klar? (nur als Hinweis, abber hier erstmal egal)
.AsBoolean
Aber wenn, dann würde ich hier sicherheitshalber eher
Delphi-Quellcode:
anstatt
.AsInteger <> 0
Delphi-Quellcode:
verwenden.
.AsInteger = 1
|
AW: Access Violation - OnFilterRecord - UniDAC
Liste der Anhänge anzeigen (Anzahl: 1)
Delphi-Quellcode:
Kann ich leider nicht verwenden, da:
(Sender as TDataSet)
Delphi-Quellcode:
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:
Delphi-Quellcode:
Bin mal mit F7 in die Funktion FieldAsInt64 gegangen. Habe ein Snip in den Anhang gesetzt.
Accept:= (FieldAsInt64(DataSet.FieldByName('D41400000_ID')) <> Self.iCurrID);
|
AW: Access Violation - OnFilterRecord - UniDAC
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.
|
AW: Access Violation - OnFilterRecord - UniDAC
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. |
AW: Access Violation - OnFilterRecord - UniDAC
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! |
AW: Access Violation - OnFilterRecord - UniDAC
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Daher habe ich schon probiert vorher mit
Delphi-Quellcode:
zu arbeiten, allerdings ohne Erfolg.
if assigned
Zitat:
Zitat:
|
AW: Access Violation - OnFilterRecord - UniDAC
Zitat:
Delphi-Quellcode:
prüft aber nur, ob die Variable nicht
Assigned()
Delphi-Quellcode:
ist. Wenn die Variable aber noch auf ein Objekt zeigt welches mal existiert hat, aber mit
nil
Delphi-Quellcode:
freigegeben wurde, dann gibt dir
Free
Delphi-Quellcode:
trotzdem true aus.
Assigned()
Himitsu hat ja gemeint, dass
Delphi-Quellcode:
selbst auf
FieldByName
Delphi-Quellcode:
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.
Assigned()
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:11 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 by Thomas Breitkreuz