Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Try Except - Problem


Morpheus1572 - Fr 12.09.08 19:14
Titel: Try Except - Problem
Moin,

ich habe ein Verständnisproblem - wobei ich noch nicht mal sicher bin, dass ich es richtig anpacke...

Zum besseren Verständnis:

es existiert eine Tabelle 'Tour' in der logischerweise Tourennummern hinterlegt sind. Ich lese eine Datei ein, in der jedoch eine Tour vorkommen kann, dich die Tabelle noch nicht kennt. um nun diese tour in die tabelle zu schreiben und deren index zu erfahren habe ich gedacht, dass ich es mit try und except mache (siehe unten).

nur finde ich nicht den dreh- und angelpunkt wie ich es erreiche in den except-bereich zu gelangen. solange die touren vorhanden sind ist alles schön. kommt er an die stelle der unbekannten tour "rotzt" mir das programm ab, weil er die tour nicht kennt.

Vorgeschichte zum code:
ich lese eine txt.datei ein und verlege sie in einzelne segmente dich ich auf verschiedene tabellen verteile. hoffe man versteht was ich suche, wenn nicht helfe ich gern, hoffe auch, dass ich soweit "sauber" programmiert habe.


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:
      try
      // Um die TID zu erfahren muss ich sie ermitteln
      ADOTable7.TableName :='Tour';
      ADOTable7.Active:=true;
      ADOQuery1.SQL.Clear;
      ADOQuery1.SQL.Text := 'SELECT TID FROM Tour WHERE Tour = :apptype';
      except
  // Wenn die Tour nicht existiert muss sie hinzugefügt werden
//      if not ADOQuery1.Parameters.ParamByName('apptype').Value=Tour then
//        begin
        ShowMessage('Komm ich in die Schleife?');
        ADOTable7.Insert;
        ADOTable7.FieldByName('Tour').AsString:=Tour;
        ADOTable7.Post;
        ADOQuery1.SQL.Clear;
        ADOQuery1.SQL.Text := 'SELECT TID FROM Tour WHERE Tour = :apptype';
//        ADOQuery1.Prepared := true;
//        ADOQuery1.Parameters.ParamByName('apptype').Value:=Tour;
    end;
  ADOQuery1.Prepared := true;
  ADOQuery1.Parameters.ParamByName('apptype').Value:=Tour;
  ADOQuery1.Active:=true;
  ds := DataSource7.DataSet;
  Tour := ds['TID'];


Thx im Voraus

Morph.


Tilman - Fr 12.09.08 19:29

Der Teil zwischen Except und End wird nur ausgeführt, wenn es zu einer Ausnahme kommt. Soviel zum Verständnis. Wenn du dann trotzdem ne Fehlermeldung siehst, deutet dies darauf hin dass im Exception-Teil noch eine weitere Exception ausgelöst wird. Entweder ist also dein Code Feherhaft, oder du musst den Code im Exception-Teil verschachteln noch einmal in ein try..except setzen (vermutlich trifft jedoch ersteres zu).


Sinspin - Fr 12.09.08 21:15

Ich glaube, so wie bisher kann das nichts werden. Es knallt in Zeile 22 deines Quelltextauschnittes.
Diese Lösung dürfte an dein Ergebnis sicher näher rankommen.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
      try
      // Um die TID zu erfahren muss ich sie ermitteln
      //ADOQuery1.SQL.Clear; <- das brauchst du nicht wenn du den SQL String via .Text zuweist
      ADOQuery1.SQL.Text := 'SELECT TID FROM Tour WHERE Tour = :apptype';
      ADOQuery1.Prepared := true;
      ADOQuery1.Parameters.ParamByName('apptype').Value:=Tour;
      ADOQuery1.Active:=true;
      except
  // Wenn die Tour nicht existiert muss sie hinzugefügt werden
        ShowMessage('Komm ich in die Schleife?'); // Such, Hasso such! Wo ist die Schleife?
        ADOTable7.TableName :='Tour';
        ADOTable7.Active:=true;
        ADOTable7.Insert;
        ADOTable7.FieldByName('Tour').AsString:=Tour;
        ADOTable7.Post;
        Tour := ADOTable7.FieldByName('TID').AsInteger; // <- so müsstest du auch an die ID kommen
    end;

Wobei ich nicht verstehe warum deine Query eine Exception liefern sollte wenn sie keine Daten findet.
Aber das kann ja an der Implementierung liegen.
Ich hätte darauf getippt auf RecordCount = 0 testen zu können:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
      // Um die TID zu erfahren muss ich sie ermitteln
      ADOQuery1.SQL.Text := 'SELECT TID FROM Tour WHERE Tour = :apptype';
      ADOQuery1.Prepared := true;
      ADOQuery1.Parameters.ParamByName('apptype').Value:=Tour;
      ADOQuery1.Active:=true;
      if ADOQuery1.RecordCount = 0 then
      begin
        ADOTable7.TableName :='Tour';
        ADOTable7.Active:=true;
        ADOTable7.Insert;
        ADOTable7.FieldByName('Tour').AsString:=Tour;
        ADOTable7.Post;
        Tour := ADOTable7.FieldByName('TID').AsString; // <- so müsstest du auch an die ID kommen
      end;


Delete - Fr 12.09.08 21:36

Das kann man und sollteman ohne Exception lösen. Exceptions sind dazu da Ausnahmefehler, also Fehler auf die du so gut wie keinen Einfluss hast, b zu behandel und wenn für dich das nicht existieren der Tablle eine Ausnahme ist, dann stimmt was in deinem Konzept nicht.


Morpheus1572 - So 14.09.08 09:16

Morgen,

Danke leute für die vielen Berichte. ich habe es letzendlich auch mit einer IF-Then-Else erledigt. dachte es wäre eleganter mit try-except, aber nachdem mein code immer schlimmer wurde kam mir endlich die idee mit if.

Morph.