Autor |
Beitrag |
Bronstein
      
Beiträge: 578
Erhaltene Danke: 1
WIN XP
Delphi 6 / Delphi 2006 / Delphi XE
|
Verfasst: Sa 15.11.08 15:04
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 [...] AdoQuery1.Next; end;
end; |
_________________ Es gibt keine dummen Fragen nur dumme Antworten!!!
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 15.11.08 15:09
Setzt Du Active auch wieder auf false?
|
|
Bronstein 
      
Beiträge: 578
Erhaltene Danke: 1
WIN XP
Delphi 6 / Delphi 2006 / Delphi XE
|
Verfasst: 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 [...] AdoQuery1.Next; end; AdoQuery1.Active :=false end; AdoQuery.free |
_________________ Es gibt keine dummen Fragen nur dumme Antworten!!!
|
|
Martok
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: Sa 15.11.08 15:42
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
Bronstein 
      
Beiträge: 578
Erhaltene Danke: 1
WIN XP
Delphi 6 / Delphi 2006 / Delphi XE
|
Verfasst: 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!
_________________ Es gibt keine dummen Fragen nur dumme Antworten!!!
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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 [...] AdoQuery1.Next; end; AdoQuery1.Active :=false; finally AdoQuery1.free; end; |
|
|
Bronstein 
      
Beiträge: 578
Erhaltene Danke: 1
WIN XP
Delphi 6 / Delphi 2006 / Delphi XE
|
Verfasst: 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:
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 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;');
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), ''); 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; |
_________________ Es gibt keine dummen Fragen nur dumme Antworten!!!
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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
      
Beiträge: 157
Win XP
Delphi 7
|
Verfasst: 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.
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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 
      
Beiträge: 578
Erhaltene Danke: 1
WIN XP
Delphi 6 / Delphi 2006 / Delphi XE
|
Verfasst: 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!
_________________ Es gibt keine dummen Fragen nur dumme Antworten!!!
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 15.11.08 18:55
Setz mal als erste Zeile in der Schleife die Variable SQL wieder auf leer.
|
|
Bronstein 
      
Beiträge: 578
Erhaltene Danke: 1
WIN XP
Delphi 6 / Delphi 2006 / Delphi XE
|
Verfasst: Sa 15.11.08 19:06
Das wars. So ein blöder Fehler!
Danke
_________________ Es gibt keine dummen Fragen nur dumme Antworten!!!
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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]
|
|