Entwickler-Ecke

Datenbanken - Zugriffsverletzung bei Adresse ...


cam - So 06.03.11 19:47
Titel: Zugriffsverletzung bei Adresse ...
Hallo an alle,

ich hoffe, ihr könnt mir helfen. Wir suchen schon seit Stunden eine Lösung.

Ich will den Inhalt einer Tabellenspalte (MS SQL Server 2008) in eine ComboBox (Delphi 2009) schreiben.

Beim Ausführen des Codes komme ich immer bis zur Ausgabe 'Datenbankverbindung steht' danach kommt folgende oder ähnliche Fehlermeldung (variiert): "Zugriffsverletzung bei Adresse 63696C43. Lesen von Adresse 63696C43" - Wo liegt das Problem???

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
procedure TForm1.DBOpen(Sender: TObject);
var
  query: TADOQuery;
  //ds: TADODataSet;
begin
  try
    ADOConnection1.Open();
    ShowMessage('Datenbankverbindung steht');
    with query do begin
      Close;
      SQL.Clear;
      SQL.Add('SELECT Name FROM Tabelle');
      Open;
      CBZaehlliste.Items.Clear;
      ShowMessage('Abfrage ausgeführt');
      First;
      while not query.Eof do
        begin
          ShowMessage(FieldByName('Name').AsString);
          CBZaehlliste.Items.Add(FieldByName('Name').Text);
          Next;
        end;
    end;
  except
    on e: exception do begin
      ShowMessage(e.Message);
    end;
  end;
end;


Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt


jaenicke - So 06.03.11 20:13

user profile iconcam hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1.DBOpen(Sender: TObject);
var
  query: TADOQuery;
  //ds: TADODataSet;
begin
  try
    ADOConnection1.Open();
    ShowMessage('Datenbankverbindung steht');
    with query do begin
      Close;
Naja, du deklarierst query, initialisierst die Variable aber nicht. Die entsprechende Compilerwarnung hast du offenbar einfach mal ignoriert... :roll: :autsch:


SmileySN - So 06.03.11 20:43

Ja du solltest ein

Delphi-Quelltext
1:
 query := TADOQuery.Create(Nil);                    

vorher benutzen, wenn du es schon selbst anlegen willst.


cam - So 06.03.11 22:20

Danke! Hatte Tomaten auf den Augen ;)


haentschman - Mo 07.03.11 21:48

...dann hätte ich noch den with query do Block. Setze mal vor jede Zeile das "query". da kommen komische Sachen dabei raus. Komisch, daß das nicht angemeckert wird. Daß with nur in Ausnahmefällen benutzen.

:wave:


jaenicke - Mo 07.03.11 21:51

Das Problem ist doch schon behoben. ;-)

Wegen with: Das funktioniert schon, es macht den Code nur extrem unübersichtlich und damit fehleranfällig und verhindert effektives Debuggen, aber funktionieren tut es. ;-)


haentschman - Mo 07.03.11 22:03

:gruebel:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
while not query.Eof do
  begin
    ShowMessage(FieldByName('Name').AsString);
    CBZaehlliste.Items.Add(FieldByName('Name').Text);
    Next;
  end;

...dieser komplette Block steht innerhalb des with Blockes... und das funktioniert ? :shock: Ich lasse mich gern belehren. Aber das ist unlogisch. :zwinker:


jaenicke - Mo 07.03.11 22:16

Klar geht das. Innerhalb von "with query" gibt es kein "query", also wird außerhalb geschaut und dort das query gefunden. ;-)

Du bist innerhalb von with nicht gezwungen den with-Ausdruck wegzulassen.


haentschman - Mo 07.03.11 22:28

Bin ich mal froh, daß ich leserlichen, debuggbaren Quelltext produziere... Das Chaos geht ja gar nicht... :roll: