Entwickler-Ecke

Datenbanken - AdoQuery: CommandText liefert keine Ergebnismenge zurück


Bronstein - Sa 15.11.08 15:04
Titel: AdoQuery: CommandText liefert keine Ergebnismenge zurück
Hallo,

ich bekmme immer beim zweiten mal wo ich AdoQuery1 auf true setzte eine Exception:
CommandText liefert keine Ergebnismenge zurück

Woran kann das liegen, und warum funktioniert die erste Abfage, das einzige was sich ändert ist die ID

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
  for i:=0 to 4 do
  begin
    AdoQuery1.SQL.CLear;
    AdoQuery1.SQL.Add('SELECT Ü FROM TABELLE WHERE ID='+IntToStr(i));
    AdoQuery1.Active := true;

    while not AdoQuery1.Eof do
    begin
      [...] //mache was
      AdoQuery1.Next;
    end;

  end;


Delete - Sa 15.11.08 15:09

Setzt Du Active auch wieder auf false?


Bronstein - Sa 15.11.08 15:38

Ja, setzte ich auf active false. Ich sollte vielleicht noch dazu sagen, dass ich die AdoQuery-Komponente zur laufzeit erstellt habe


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
  AdoQuery1 := TAdoQuery.Create(nil);
  AdoQuery1.ConnectionString := tmpStr;
  for i:=0 to 4 do
  begin
    AdoQuery1.SQL.CLear;
    AdoQuery1.SQL.Add('SELECT * FROM TABELLE WHERE ID='+IntToStr(i));
    AdoQuery1.Active := true;

    while not AdoQuery1.Eof do
    begin
      [...] //mache was
      AdoQuery1.Next;
    end;
    AdoQuery1.Active :=false
  end;
  AdoQuery.free


Martok - Sa 15.11.08 15:42

user profile iconBronstein hat folgendes geschrieben Zum zitierten Posting springen:
Ja, setzte ich auf active false. Ich sollte vielleicht noch dazu sagen, dass ich die AdoQuery-Komponente zur laufzeit erstellt habe


Delphi-Quelltext
1:
2:
3:
4:
5:
  AdoQuery1 := TAdoQuery.Create(nil);
  AdoQuery1.ConnectionString := tmpStr;
  for i:=0 to 4 do
  begin
    AdoQuery1.SQL.CLear;

Connecten wäre mal noch ne Idee ;)


Bronstein - Sa 15.11.08 16:06

Macht es doch automatisch, wenn ich Active auf true setzte, ansonsten würde die abfrage ja auch nicht beim ersten schleifen durchgang funktionieren!


Delete - Sa 15.11.08 16:29

Spricht eigentlich etwas dagegen, die komplette Ergebnismenge in einem Rutsch zu ermitteln?

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
  AdoQuery1 := TAdoQuery.Create(nil);
  try
    AdoQuery1.ConnectionString := tmpStr;
    AdoQuery1.SQL.Clear;
    AdoQuery1.SQL.Add('SELECT * FROM TABELLE WHERE ID BETWEEN 0 AND 4 ORDER BY ID');
    AdoQuery1.Active := true;
    while not AdoQuery1.Eof do
    begin
      [...] //mache was
      AdoQuery1.Next;
    end;
    AdoQuery1.Active :=false;
  finally
    AdoQuery1.free;
  end;


Bronstein - Sa 15.11.08 17:24

Hallo,
nein, das geht nicht. Ich habe hier nur eine vereinfachte SQL-Anweisung geschickt. Hier mal meine bisherige Funktion, wo ich den Fehler bekomme:

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:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
procedure TForm1.Get_SMD_Daten();
var
  AdoQuery: TAdoQuery;
  ini: TIniFile;
  tmpStr, SQL, LastSerNr: String;
  aDatum: TDate;
  SerNrPass, SerNrFail, SerNrPseudoFehler: Integer;
  tmpFloat: Extended;
  Anzahl, i, StringGridZeile: Integer;
begin
  //Spaltenüberschriften
  StringGridZeile := 0;
  StringGrid1.ColCount := 6;
  StringGrid1.Cells[0, StringGridZeile] := 'Linie';
  StringGrid1.Cells[1, StringGridZeile] := 'FPY';
  StringGrid1.Cells[2, StringGridZeile] := 'Gesamt';
  StringGrid1.Cells[3, StringGridZeile] := 'Pass';
  StringGrid1.Cells[4, StringGridZeile] := 'Fail';
  StringGrid1.Cells[5, StringGridZeile] := 'Pseudo';
  StringGrid1.ColWidths[0] := 80;
  StringGrid1.ColWidths[1] := 50;
  StringGrid1.ColWidths[2] := 50;
  StringGrid1.ColWidths[3] := 50;
  StringGrid1.ColWidths[4] := 50;
  StringGrid1.ColWidths[5] := 50;

  ini:=TIniFile.Create( ExtractFilePath(ParamStr(0)) + '\LiveFirma.ini');
  tmpStr := ini.ReadString('SMD', 'DBPfad', '');
  AdoQuery := TAdoQuery.Create(nil);
  AdoQuery.ConnectionString := tmpStr;
  Anzahl := ini.ReadInteger('SMD', 'AnzahlLinien', 0);

  for i := 1 to Anzahl do
  begin
    tmpStr := ini.ReadString('SMD', 'DBPfad', '');
  AdoQuery := TAdoQuery.Create(nil);
  AdoQuery.ConnectionString := tmpStr;

    inc(StringGridZeile);
    AdoQuery.SQL.Clear;
    AdoQuery.SQL.Add('SELECT BN.BN, HISTORY.SERIAL_NUM, Min(HISTORY.RESULT) AS RESULT, EVENTS.EVENT_TYPE');
    AdoQuery.SQL.Add(' FROM (HISTORY INNER JOIN BN ON HISTORY.KEYBN = BN.KEYBN) LEFT JOIN EVENTS ON HISTORY.KEYHIST = EVENTS.KEYHIST');


    aDatum := StrToDate('08.10.2008');

    AdoQuery.SQL.Add(' WHERE ');
    tmpStr := FormatDateTime('YYYYMMDD', aDatum-1);
    SQL := SQL + '(HISTORY.TEST_BEGIN Like '+QuotedStr(tmpStr + ' 223%') + ' OR';
    SQL := SQL + ' HISTORY.TEST_BEGIN Like '+QuotedStr(tmpStr + ' 224%') + ' OR';
    SQL := SQL + ' HISTORY.TEST_BEGIN Like '+QuotedStr(tmpStr + ' 225%') + ' OR';
    SQL := SQL + ' HISTORY.TEST_BEGIN Like '+QuotedStr(tmpStr + ' 23%') + ' OR';
    tmpStr := FormatDateTime('YYYYMMDD', aDatum);
    SQL := SQL + ' HISTORY.TEST_BEGIN Like '+QuotedStr(tmpStr + ' 00%') + ' OR';
    SQL := SQL + ' HISTORY.TEST_BEGIN Like '+QuotedStr(tmpStr + ' 01%') + ' OR';
    SQL := SQL + ' HISTORY.TEST_BEGIN Like '+QuotedStr(tmpStr + ' 02%') + ' OR';
    SQL := SQL + ' HISTORY.TEST_BEGIN Like '+QuotedStr(tmpStr + ' 03%') + ' OR';
    SQL := SQL + ' HISTORY.TEST_BEGIN Like '+QuotedStr(tmpStr + ' 04%') + ' OR';
    SQL := SQL + ' HISTORY.TEST_BEGIN Like '+QuotedStr(tmpStr + ' 050%') + ' OR';
    SQL := SQL + ' HISTORY.TEST_BEGIN Like '+QuotedStr(tmpStr + ' 051%') + ' OR';
    SQL := SQL + ' HISTORY.TEST_BEGIN Like '+QuotedStr(tmpStr + ' 052%') + ')';

    AdoQuery.SQL.Add(SQL);
    AdoQuery.SQL.Add(' GROUP BY HISTORY.ATE_NUM, BN.BN, HISTORY.SERIAL_NUM, EVENTS.EVENT_TYPE');
    tmpStr := ini.ReadString('SMD', 'ATE_NUM_' + IntToStr(i), '0');
    AdoQuery.SQL.Add(' HAVING (HISTORY.ATE_NUM='+tmpStr+') AND BN.BN='+QuotedStr('75.464.880')+' AND (EVENTS.EVENT_TYPE<>'+QuotedStr('r')+' Or EVENTS.EVENT_TYPE Is Null)');
    AdoQuery.SQL.Add(' ORDER BY HISTORY.SERIAL_NUM, EVENTS.EVENT_TYPE;');

   // ShowMessage(adoquery.SQL.Text);
    AdoQuery.Active := true;
    SerNrPass := 0;
    SerNrFail := 0;
    SerNrPseudoFehler := 0;
    While not AdoQuery.Eof do
    begin
      if LastSerNr <> AdoQuery.FieldByName('SERIAL_NUM').AsString  then
      begin
        LastSerNr := AdoQuery.FieldByName('SERIAL_NUM').AsString;
        if (AdoQuery.FieldByName('RESULT').AsString = 'P') AND (AdoQuery.FieldByName('EVENT_TYPE').AsString = '' )  then
          inc(SerNrPass)
        else if AdoQuery.FieldByName('EVENT_TYPE').AsString = 'x' then
          inc(SerNrFail)
        else
          inc(SerNrPseudoFehler);
      end;
      AdoQuery.Next;
    end;
    tmpStr := ini.ReadString('SMD', 'Linie' + IntToStr(i), '');
    //FPY berrechnen
    tmpFloat := SerNrPass + SerNrFail + SerNrPseudoFehler;
    tmpFloat := 100 - ((SerNrFail + SerNrPseudoFehler) / (tmpFloat / 100));
    StringGrid1.Cells[0, StringGridZeile] := tmpStr;
    StringGrid1.Cells[1, StringGridZeile] := FloatToStr(RundeAufStellen(tmpFloat, 2));
    StringGrid1.Cells[2, StringGridZeile] := IntToStr(SerNrPass + SerNrFail + SerNrPseudoFehler);
    StringGrid1.Cells[3, StringGridZeile] := IntToStr(SerNrPass);
    StringGrid1.Cells[4, StringGridZeile] := IntToStr(SerNrFail);
    StringGrid1.Cells[5, StringGridZeile] := IntToStr(SerNrPseudoFehler);
    AdoQuery.Active := false;
    AdoQuery.Free;
    break;
  end;
  ini.Free;
end;


Delete - Sa 15.11.08 17:36

Wenn ich das richtig überblicke, gibst Du die Query innerhalb der Schleife frei, kein Wunder, dass das kracht.


Morpheus1572 - Sa 15.11.08 17:47

jo, das sehe ich genauso.

du gibst das ADOQuery frei, damit löscht du es und steht nicht mehr zur verfügung...

das kann nicht klappen.


Delete - Sa 15.11.08 17:50

Nach etwas genauerer Betrachtung fällt mir auf, dass die Query einmal vor und einmal innerhalb der Schleife erzeugt wird. Und wozu das break am Schleifenende? Sry, ich habe Deine Logik noch nicht ganz verstanden.


Bronstein - Sa 15.11.08 18:00

Die Query Erstellung und Freigabe habe ich nur zu Testzwecken in die Schleife, bzgl. des Fehlers wie oben beschrieben.
Das Break habe ich drin, damit ich weiterprogrammieren kann, da ja der erste Schleifendurchlauf funktioniert und es erst beim Zweiten zu der Exception kommt.
Das ist ein ganz seltsamer Fehler, wenn es einmal geht und beim zweitenmal nicht. Trotz dasselbe gemacht wird!


Delete - Sa 15.11.08 18:55

Setz mal als erste Zeile in der Schleife die Variable SQL wieder auf leer.


Bronstein - Sa 15.11.08 19:06

Das wars. So ein blöder Fehler!
Danke


Delete - Sa 15.11.08 19:09

Das hätte ich auch nicht gesehen, wenn ich mir den Source nicht in Notepad kopiert und im Ganzen angesehen hätte ;)

[edit] Allerdings würde ich an Deiner Stelle parametrisierte Abfragen verwenden. [/edit]