![]() |
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:
Ich kann also mit einem Klick auf den Titel der Spalte nach der Spalte ordnen lassen.
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; ... Nebenbei: Die erste SQL Zeile ist
SQL-Code:
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.
SELECT * FROM "c:\blah.db"
... 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] |
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. |
Re: Zugriffsverletzung bei SQL Abfrage - Warum?
Leider nein, auch mit
Delphi-Quellcode:
funktioniert es nicht so wie es soll...
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; 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] |
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; ?
|
Re: Zugriffsverletzung bei SQL Abfrage - Warum?
Ja, es fehlte. Aber wenn ich es einfüge bringt das leider auch nix :(
|
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. |
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 |
Re: Zugriffsverletzung bei SQL Abfrage - Warum?
Zitat:
Delphi-Quellcode:
procedure TDataSet.Open;
begin Active := True; end; |
Re: Zugriffsverletzung bei SQL Abfrage - Warum?
Zitat:
Frohe Weihnachten :) |
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 00:29 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