![]() |
Datenbank: Access • Version: 2003 • Zugriff über: TADOQuery
Access Violation bei FieldByName('feldname').AsString + bei Watch-List: Absturz
Hallo zusammen,
es kommt bei mir bei immer wieder dazu, dass eine Access Violation auftaucht. Besonders merkwürdig ist, dass auch ein Einschluss in Try...Except einen Komplett-Absturz des Programms nicht verhindern kann. Noch schlimmer: wenn ich DataSet.FieldByName('feldname').AsString in die Watch-List aufnehme, stürzt sogar der Compiler an dieser Stelle ab. Die Prozedur läuft teilweise einwandfrei und das Problem kommt dann bei einem bestimmten Record in der Tabelle immer wieder. Z.B. läuft die Schleife 10x durch und der Fehler kommt in Zeile 11. Der Fehler liegt jedenfalls nicht in 'feldname', da z.B. DataSet.FieldByName('feldname').DataSize einen Wert liefert bei dem Problem-Datensatz. Ich kann in der Datenbank aber bei Zeile 11 kein Problem feststellen. Ich habe den Inhalt von 'feldname' in record 11 mal gelöscht: kein Unterschied. Hat jemand eine Idee, woran das Problem liegen kann? Für Hilfestellung wäre ich sehr dankbar. Hier der Code:
Delphi-Quellcode:
NACHTRAG: es hat sich zwischenzeitlich gezeigt, dass ein alternativer Aufruf von DataSet.FieldByName('feldname').CurValue nicht zu dem Fehler führt... Macht das überhaupt Sinn?
s := '';
DataSet.First; while not DataSet.Eof do begin s := s + ',' + DataSet.FieldByName('feldname').AsString; DataSet.Next; end; Danke im Voraus und Grüße Tobias |
AW: Access Violation bei FieldByName('feldname').AsString + bei Watch-List: Absturz
Kannst Du mit [F7] in das "FieldByName" bzw das "AsString" hineinschauen?
Das paßt jetzt nur halb zum Thema, aber Du kannst jedenfalls die Geschwindigkeit erhöhen, wenn "FieldByName" nicht jedesmal ausgeführt werden muß: Vorschlag:
Delphi-Quellcode:
const
S_FELDNAME = 'Feldname'; S_SEPARATOR = ','; var lfldFeldName: TField; s : string; begin if (not Assigned(DataSet)) then exit; if (not DataSet.Active) then begin DataSet.Open; end; lfldFeldName := DataSet.FindField(S_FELDNAME); if Assigned(lfldFeldName) then begin s := EmptyStr; DataSet.First; while (not DataSet.Eof) do begin s := s + S_SEPARATOR + lfldFeldName.AsString; DataSet.Next; end; end; end; |
AW: Access Violation bei FieldByName('feldname').AsString + bei Watch-List: Absturz
Zitat:
Du bist nicht zufällg mal auf die Idee gekommen den Fehler/Verursacher in den Daten zu suchen und nicht im eigenen Code? Vorallem wenn alles darauf hinweist. :roll: Bei bestimmten Fehlern, wie z.B. einem Buffer Overun, repariert das Except ja nicht den Speicher, weswegen danach dann immernoch alles kaputt ist. Mit Postgres + PgDAC + DevExpress hatten wir soeinen Fehler grade. Wenn in der Datenbank ein Feld als VARCHAR ohne Längenangabe deklariert war, dann ist das Feld für die Datenbank "unbegrenzt" lang, aber das PgDAC hat in soeinem Fall den Feld-Speicher angeblich auf einen Standardwert begrenzt. Field.Size/DataSize gab dann immer einen bestimmten Wert aus. Beim Laden dieses Datensatzes ins DataSet ging alles noch gut, aber das Anzeigen im DevExpressGrid knallte dann das halbe/ganze Programm weg, da dort der GridCache nur die ausgegebene Speichermenge reservierte, aber dann "alles" versuchte da reinzukopieren, welches den Speicher dahinter natürlich schrottete. Ach ja, bei uns half es den String in der DB zu kürzen, oder das VARCHAR-Field beim Auslesen mit einer passenden Länge zu casten. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:34 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