Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Zugriffsverletzung bei SQL Abfrage - Warum? (https://www.delphipraxis.net/13669-zugriffsverletzung-bei-sql-abfrage-warum.html)

Jetro223 23. Dez 2003 16:52


Zugriffsverletzung bei SQL Abfrage - Warum?
 
Hallo,

ich hab mal wieder ein kleines Problem...und zwar:

Ich greife mit einem TQuery via SQL auf eine Paradox Datenbank zu und zeige die Daten in einem DBGrid und in einzelnen DBEdit(s) an.

Nun möchte ich die Tabelle nach verschiedenen Spalten zur Laufzeit umordnen können und die Spalte, nach der geordnet wurde nach vorne bringen.

Dies funktioniert eigentlich auch ganz gut mit diesem Code:

Delphi-Quellcode:
procedure TFArtikel.DBGridDatenTitleClick(Column: TColumn);
begin
  //Nach ArtNr sortieren
  If Column.FieldName = 'ArtNr' Then
    Begin
      DB.SQL[1] := 'ORDER BY ArtNr';
      DB.Active := True;
      DB.FieldByName('ArtNr').Index := 1;
      iSortierStatus := 1;
    End;

  //Nach Artikelbezeichnung sortieren
  If Column.FieldName = 'Artikelbezeichnung' Then
    Begin
      DB.SQL[1] := 'ORDER BY Artikelbezeichnung';
      DB.Active := True;
      DB.FieldByName('Artikelbezeichnung').Index := 1;
      iSortierStatus := 2;
    End; ...
Ich kann also mit einem Klick auf den Titel der Spalte nach der Spalte ordnen lassen.
Nebenbei: Die erste SQL Zeile ist
SQL-Code:
SELECT * FROM "c:\blah.db"
Nun mein Problem: Leider klappt das Ganze immer nur ein paar Mal. Also wenn ich zur Laufzeit ein paar mal ordne werde ich dann mit einer Exception beglückt. EAccessViolation.

... Zugriffsverletzung bei Adresse ... usw.

Weiß jemand warum das so ist und was ich eventuell dagegen tun könnte?

[edit=r_kerber]Delphi- und SQL-Tags gesetzt. Mfg, r_kerber[/edit]

MrSpock 23. Dez 2003 16:55

Re: Zugriffsverletzung bei SQL Abfrage - Warum?
 
Hallo Jetro223,

das liegt wohl an dem Zugriff auf SQL[1]. Diese Stringlist hat möglicherweise zu diesem Zeitpunkt noch keine 2 Zeilen. Besser ist es SQL.Clear und anschließend SQL.Add('SELECT FROM ...') zu nutzen.

Jetro223 23. Dez 2003 16:59

Re: Zugriffsverletzung bei SQL Abfrage - Warum?
 
Leider nein, auch mit

Delphi-Quellcode:
Begin
      DB.SQL.Clear;
      DB.SQL.Add('SELECT * FROM "c:\blah.db"');
      DB.SQL.Add('ORDER BY ArtNr');
      DB.Active := True;
      DB.FieldByName('ArtNr').Index := 1;
      iSortierStatus := 1;
    End;
funktioniert es nicht so wie es soll...

Hatte es auch schonmal mit einem Memo überprüft (also die vollständige SQL-Anweisung ins Memo ausgegegeben), aber die stimmte immer.

Edit: Leider ist das Ganze auch nicht regelmäßig...also manchmal kann man 7 x sortieren, manchmal aber auch nur 2 x (das bloß als Zusatzinfo :))

[edit=r_kerber]Delphi-Tags gesetzt. Mfg, r_kerber[/edit]

Leuselator 23. Dez 2003 17:22

Re: Zugriffsverletzung bei SQL Abfrage - Warum?
 
Hast Du es nur nicht mit hierherkopiert oder fehlt in Deinem Source tatsächlich ein DB.Close; vor dem DB.SQL.Clear; ?

Jetro223 23. Dez 2003 22:37

Re: Zugriffsverletzung bei SQL Abfrage - Warum?
 
Ja, es fehlte. Aber wenn ich es einfüge bringt das leider auch nix :(

r_kerber 24. Dez 2003 05:02

Re: Zugriffsverletzung bei SQL Abfrage - Warum?
 
Hallo Jetro223,

dann debugge doch mal zeilenweise durch. So kannst Du genau feststellen, bei welcher Anweisung diese Schutzverletzung kommt.

mikhal 24. Dez 2003 05:48

Re: Zugriffsverletzung bei SQL Abfrage - Warum?
 
Hier sind noch zwei Alternativen:

1. Streiche in deinem Quelltext "DB.Active := True" und ersetze es durch "DB.Open". Diese Anweisung erfolgt aber erst eine Zeile später.

2. Verwende zum Sortieren jedesmal ein vollständig neues SQL-Statement, in dem du die gewünschte Spalte an die erste Stelle setzt. Der Aufwand ist zwar größer (schau dir mal z.B. die Methoden IndexOf, Delete und Insert von TStrings an), aber bei geschickter Notation (z.B. jeder gewünschte Feldname in einer eigenen Zeile) hält sich der Aufwand in Grenzen! Allerdings mußt du bei dieser Methode jedes Feld, das du anzeigen möchtest, statt des Allquantors in deinem SQL-Statement einsetzen.

Grüße
Mikhal

r_kerber 24. Dez 2003 06:41

Re: Zugriffsverletzung bei SQL Abfrage - Warum?
 
Zitat:

Zitat von mikhal
1. Streiche in deinem Quelltext "DB.Active := True" und ersetze es durch "DB.Open".

Das ist eigentlich dasselbe. Auszug aus DB.pas:
Delphi-Quellcode:
procedure TDataSet.Open;
begin
  Active := True;
end;

Jetro223 24. Dez 2003 15:15

Re: Zugriffsverletzung bei SQL Abfrage - Warum?
 
Zitat:

Zitat von mikhal
2. Verwende zum Sortieren jedesmal ein vollständig neues SQL-Statement, in dem du die gewünschte Spalte an die erste Stelle setzt. Der Aufwand ist zwar größer (schau dir mal z.B. die Methoden IndexOf, Delete und Insert von TStrings an), aber bei geschickter Notation (z.B. jeder gewünschte Feldname in einer eigenen Zeile) hält sich der Aufwand in Grenzen! Allerdings mußt du bei dieser Methode jedes Feld, das du anzeigen möchtest, statt des Allquantors in deinem SQL-Statement einsetzen.

Hmm, erst einmal danke für deine Ideen, aber was würdest du dir davon erhoffen? Ich werde es sicher einmal probieren...aber ich sehe den Sinn leider nicht so richtig. :)

Frohe Weihnachten :)

mikhal 25. Dez 2003 09:16

Re: Zugriffsverletzung bei SQL Abfrage - Warum?
 
Die Reihenfolge, in der die Felder angezeigt werden, wird durch die Reihenfolge im SQL-Statement vorgegeben. Wenn du also die Eigenschaft SQL (TStrings) bei TQuery benutzt, um dort das Statement zusammenzusetzen, kannst du sofort festlegen, welches Feld als erstes angezeigt werden soll. Dazu benötigst du IndexOf(Feldname) um die Zeilennummer des feldes zu ermitteln, das du löschen (Delete)mußt, und mit Insert fügst du den gewünschten Feldnamen hinter dem Schlüsselwort SELECT ein. Die Sortierung kannst du ähnlich aufbauen, wobei es hier angebracht ist, die Order-Klausel in einem eigenen String zu bauen und anschließend auszutauschen.

Grüße
Mikhal


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:25 Uhr.
Seite 1 von 2  1 2      

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