AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Access Violation bei FieldByName('feldname').AsString + bei Watch-List: Absturz
Thema durchsuchen
Ansicht
Themen-Optionen

Access Violation bei FieldByName('feldname').AsString + bei Watch-List: Absturz

Ein Thema von tenikx · begonnen am 22. Okt 2013 · letzter Beitrag vom 23. Okt 2013
Antwort Antwort
tenikx

Registriert seit: 1. Mär 2009
7 Beiträge
 
#1

Access Violation bei FieldByName('feldname').AsString + bei Watch-List: Absturz

  Alt 22. Okt 2013, 12:43
Datenbank: Access • Version: 2003 • Zugriff über: TADOQuery
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:
s := '';
DataSet.First;
while not DataSet.Eof do
begin
   s := s + ',' + DataSet.FieldByName('feldname').AsString;
   DataSet.Next;
end;
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?


Danke im Voraus und Grüße
Tobias

Geändert von tenikx (22. Okt 2013 um 15:24 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von ConnorMcLeod
ConnorMcLeod

Registriert seit: 13. Okt 2010
Ort: Bayern
490 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Access Violation bei FieldByName('feldname').AsString + bei Watch-List: Absturz

  Alt 23. Okt 2013, 07:22
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;
Nr.1 Delphi-Tool: [F7]

Geändert von ConnorMcLeod (23. Okt 2013 um 07:25 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Access Violation bei FieldByName('feldname').AsString + bei Watch-List: Absturz

  Alt 23. Okt 2013, 09:11
und das Problem kommt dann bei einem bestimmten Record in der Tabelle immer wieder.

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?
Ja?

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.



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.
$2B or not $2B
  Mit Zitat antworten Zitat
Antwort Antwort


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 04:28 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