AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Zugriffsverletzung bei SQL Abfrage - Warum?
Thema durchsuchen
Ansicht
Themen-Optionen

Zugriffsverletzung bei SQL Abfrage - Warum?

Ein Thema von Jetro223 · begonnen am 23. Dez 2003 · letzter Beitrag vom 26. Dez 2003
Antwort Antwort
Seite 1 von 2  1 2      
Jetro223

Registriert seit: 20. Dez 2003
24 Beiträge
 
#1

Zugriffsverletzung bei SQL Abfrage - Warum?

  Alt 23. Dez 2003, 17:52
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 = 'ArtNrThen
    Begin
      DB.SQL[1] := 'ORDER BY ArtNr';
      DB.Active := True;
      DB.FieldByName('ArtNr').Index := 1;
      iSortierStatus := 1;
    End;

  //Nach Artikelbezeichnung sortieren
  If Column.FieldName = 'ArtikelbezeichnungThen
    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 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]
  Mit Zitat antworten Zitat
Benutzerbild von MrSpock
MrSpock
(Co-Admin)

Registriert seit: 7. Jun 2002
Ort: Owingen
5.865 Beiträge
 
Delphi 2010 Professional
 
#2

Re: Zugriffsverletzung bei SQL Abfrage - Warum?

  Alt 23. Dez 2003, 17:55
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.
Albert
Live long and prosper


MrSpock
  Mit Zitat antworten Zitat
Jetro223

Registriert seit: 20. Dez 2003
24 Beiträge
 
#3

Re: Zugriffsverletzung bei SQL Abfrage - Warum?

  Alt 23. Dez 2003, 17:59
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]
  Mit Zitat antworten Zitat
Benutzerbild von Leuselator
Leuselator

Registriert seit: 18. Mär 2003
Ort: Berlin
589 Beiträge
 
Delphi 8 Architect
 
#4

Re: Zugriffsverletzung bei SQL Abfrage - Warum?

  Alt 23. Dez 2003, 18:22
Hast Du es nur nicht mit hierherkopiert oder fehlt in Deinem Source tatsächlich ein DB.Close; vor dem DB.SQL.Clear; ?
Tim Leuschner
Programmierer = moderner Sysiphos: stets wenn er meint, den Stein seiner Dummheit auf den Berg des Wissens gewuchtet zu haben, erblickt er einen völlig neuen Aspekt und der Dummfels poltert mit Getöse zurück ins Tal der Unwissenheit...
  Mit Zitat antworten Zitat
Jetro223

Registriert seit: 20. Dez 2003
24 Beiträge
 
#5

Re: Zugriffsverletzung bei SQL Abfrage - Warum?

  Alt 23. Dez 2003, 23:37
Ja, es fehlte. Aber wenn ich es einfüge bringt das leider auch nix
  Mit Zitat antworten Zitat
Benutzerbild von r_kerber
r_kerber

Registriert seit: 11. Feb 2003
Ort: Trittau
3.538 Beiträge
 
Delphi XE Professional
 
#6

Re: Zugriffsverletzung bei SQL Abfrage - Warum?

  Alt 24. Dez 2003, 06:02
Hallo Jetro223,

dann debugge doch mal zeilenweise durch. So kannst Du genau feststellen, bei welcher Anweisung diese Schutzverletzung kommt.
  Mit Zitat antworten Zitat
Benutzerbild von mikhal
mikhal

Registriert seit: 11. Sep 2003
Ort: Linz am Rhein
796 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: Zugriffsverletzung bei SQL Abfrage - Warum?

  Alt 24. Dez 2003, 06:48
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
Michael Kraemer
Computer erleichtern die Arbeit...
...und die Erde ist eine Scheibe!
  Mit Zitat antworten Zitat
Benutzerbild von r_kerber
r_kerber

Registriert seit: 11. Feb 2003
Ort: Trittau
3.538 Beiträge
 
Delphi XE Professional
 
#8

Re: Zugriffsverletzung bei SQL Abfrage - Warum?

  Alt 24. Dez 2003, 07:41
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;
  Mit Zitat antworten Zitat
Jetro223

Registriert seit: 20. Dez 2003
24 Beiträge
 
#9

Re: Zugriffsverletzung bei SQL Abfrage - Warum?

  Alt 24. Dez 2003, 16:15
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
  Mit Zitat antworten Zitat
Benutzerbild von mikhal
mikhal

Registriert seit: 11. Sep 2003
Ort: Linz am Rhein
796 Beiträge
 
Delphi 11 Alexandria
 
#10

Re: Zugriffsverletzung bei SQL Abfrage - Warum?

  Alt 25. Dez 2003, 10:16
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
Michael Kraemer
Computer erleichtern die Arbeit...
...und die Erde ist eine Scheibe!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 16:38 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