Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi ADOQuery: nur eine Anfrage möglich??? (https://www.delphipraxis.net/128979-adoquery-nur-eine-anfrage-moeglich.html)

vit4l 10. Feb 2009 15:48

Datenbank: MS SQL Server 2008 • Zugriff über: ADOQuery

ADOQuery: nur eine Anfrage möglich???
 
hallo Leute,

habe ein Problem. Mithilfe von TADOQuery schicke ich eine Anfrage an die MS SQL Datenbank, die problemlos ausgeführt wird. Wenn ich aber weitere Anfragen schicke, bekomme ich jedesmal keine Ergebnisse. Woran liegt das? Wie kann ich das Problem beheben?

Ich habe rumexperementiert und bemerkt, dass wenn ich die TADOQuery-Komponente vor der Anfrage neu erstelle, funktioniert alles.

khh 10. Feb 2009 15:51

Re: ADOQuery: nur eine Anfrage möglich???
 
Zitat:

Zitat von vit4l
hallo Leute,

habe ein Problem. Mithilfe von TADOQuery schicke ich eine Anfrage an die MS SQL Datenbank, die problemlos ausgeführt wird. Wenn ich aber weitere Anfragen schicke, bekomme ich jedesmal keine Ergebnisse. Woran liegt das? Wie kann ich das Problem beheben?

Ich habe rumexperementiert und bemerkt, dass wenn ich die TADOQuery-Komponente vor der Anfrage neu erstelle, funktioniert alles.

bekommst ne fehlermeldung?

vieleicht ein sql.clear davor ausführen?

Gruss KH

vit4l 10. Feb 2009 15:53

Re: ADOQuery: nur eine Anfrage möglich???
 
Das mache ich bereits. Nein es kommt keine Fehlermeldung meine GridView bleibt leer.

mkinzler 10. Feb 2009 15:54

Re: ADOQuery: nur eine Anfrage möglich???
 
Zeig mal deinen Code

vit4l 10. Feb 2009 16:01

Re: ADOQuery: nur eine Anfrage möglich???
 
Delphi-Quellcode:
var
  ADOQ: TADOQuery;
...

procedure TfrmMain.KundenSuchen;
var
  strKundennummer: string;
  strVariante: string;
  Where: string;
  Where_Part1, Where_Part2: string;
  OrderBy: string;
  Select: string;
  i : integer;
begin
  try
    ADOQ.Active := false;

    if (Length(txtKundennummer.Text) > 0) or (Length(txtVariante.Text) > 0) then
    begin
      strKundennummer := LowerCase(txtKundennummer.Text + '%');
      strVariante := LowerCase('%' + txtVariante.Text + '%');

      with TStringList.Create do
      try
        Delimiter := ';';
        StrictDelimiter := true;
        DelimitedText := AktuellerBenutzer.Einstellungen.TABELLE_KUNDEN_SUCHFELDER;
        ADOQ.Parameters.Clear;
        with ADOQ.Parameters.AddParameter do
        begin
          Name := 'kundennummer';
          Value := strKundennummer;
        end;
        Where_Part1 := 'WHERE (LOWER(u_kn) LIKE :kundennummer) AND (';
        for i := 0 to Count - 1 do
        begin
          with ADOQ.Parameters.AddParameter do
          begin
            Name := Strings[i];
            Value := strVariante;
          end;
          if Length(Where_Part2) > 0 then
          Where_Part2 := Where_Part2 + ' OR ';
          Where_Part2 := Where_Part2 + '(LOWER(' + Strings[i] + ') LIKE :''' + Strings[i] + ''')';
        end;
      finally
        Where := Where_Part1 + Where_Part2 + ')';
        Free;
      end;

      case cbSortierenNach.ItemIndex of
        0: OrderBy := 'ORDER BY u_kn';
        1: OrderBy := 'ORDER BY u_name';
        2: OrderBy := 'ORDER BY u_vorname';
        3: OrderBy := 'ORDER BY u_plz';
        4: OrderBy := 'ORDER BY u_ort';
        5: OrderBy := 'ORDER BY u_land';
      end;

      Select := 'SELECT * FROM KUNDEN ' + Where + ' ' + OrderBy;

      ADOQ.SQL.Clear;
      ADOQ.ParamCheck := true;
      ADOQ.SQL.Text := Select;
      ADOQ.Active := true;
      ADOQ.Open;
    end;
  except
  end;
end;

sirius 10. Feb 2009 16:04

Re: ADOQuery: nur eine Anfrage möglich???
 
active:=true und open brauchst du nicht hintereinander.

Edit: Und hier sind ein paar Hochkommas zu viel:
Delphi-Quellcode:
Where_Part2 := Where_Part2 + '(LOWER(' + Strings[i] + ') LIKE :''' + Strings[i] + ''')';
Und ob das gut geht, Tabellenname und Parametername gleich zu wählen.

mkinzler 10. Feb 2009 16:06

Re: ADOQuery: nur eine Anfrage möglich???
 
Und bei der Zuweisung von .Text kein .Clear.
Lass dir mal das erzeugte Statement anzeigen

vit4l 10. Feb 2009 16:13

Re: ADOQuery: nur eine Anfrage möglich???
 
Zitat:

Zitat von sirius
Und ob das gut geht, Tabellenname und Parametername gleich zu wählen.

Das sind keine Tabellennamen, das sind Feldernamen einer Tabelle. Geht wunderbar.

Zitat:

Zitat von mkinzler
Und bei der Zuweisung von .Text kein .Clear.

Ich lösche zuerst den Text und weise den neuen Text zu. Oder verstehe ich grundsätzlich etwas falsch?

Zitat:

Zitat von mkinzler
Lass dir mal das erzeugte Statement anzeigen

Ich lade das erzeugte Statement in eine Memo und führe es dann im MS SQL Server Management Studio aus. Die Anfrage wird ausgeführt.

vit4l 10. Feb 2009 16:18

Re: ADOQuery: nur eine Anfrage möglich???
 
Ich habe jetzt ADOQ.SQL.Clear auskommentiert und es klappt alles problemlos. Was aber für mich seltsam ist bzw. für mich nicht ganz verständlich.

Naja danke trotzdem für euere Mühe mir geholfen zu haben.

shmia 10. Feb 2009 18:47

Re: ADOQuery: nur eine Anfrage möglich???
 
Das ist unschön, was du da mit den Parametern machst.
Hier der richtige Ablauf:
1.) Property SQL zuweisen
ADOQ.SQL.Text := .... ;// SELECT .....
Dabei wird die Query automatisch geschlossen (falls sie vorher offen war)
2.) Parameter zuweisen
ADOQ.Parameters.ParamValues['Parametername'] := ....;
Der Aufruf von AddParameter ist überflüssig.
Es gibt nur wenige Ausnahmen, bei denen man von Hand eingreifen muss.
In diesen Fällen reicht aber meist ADOQ.Parameters.Refresh aus um alle Parameter anhand der Abfrage mit richtigem Typ aufzubauen.
3.) Query öffnen. Entweder ADOQ.Open oder .Active := True

Wenn man Parameterwerte ändert, muss man die Query schliesen und dann neu öffnen.
Statt .Close gefolgt von .Open kann man in diesem Fall auch .Requery aufrufen; das ist schneller.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:48 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