Avatar billede hugopedersen Nybegynder
20. februar 2008 - 10:16 Der er 10 kommentarer og
2 løsninger

Try, except og finally for dummie

Jeg sidder og roder med at lave et lille program der skal overføre nogle data fra Paradox til MySQL. Det har jeg sådan set på plads bortset fra at der er mulighed for at nogen af de filer jeg modtager ikke indholder det rigtige antal felter. Der vil jeg så gerne kunne fange den opståede fejl og få programmet til at fortsætte ved næste kode linie.
I M$ VBA er det nemt med en On Error Resume Next, men i Delphi har jeg på fornemmelsen at vi snakker Try, Except og Finally.
Kan jeg få et hurtigt kursus i dette :-)
Avatar billede snowball Novice
20. februar 2008 - 10:32 #1
Avatar billede kroning Nybegynder
20. februar 2008 - 10:49 #2
Ville det ikke være bedre at checke antallet af felter i stedet for at lade en try-except fange den?
Avatar billede hugopedersen Nybegynder
20. februar 2008 - 11:49 #3
Det kan du sådan set have ret i, men så er min næste opgave jo at finde ud af hvordan man lige gør det :-)
Avatar billede kroning Nybegynder
20. februar 2008 - 14:07 #4
Jeg gætter på at du bruger TTable;

Antallet af felter i tabellen findes her:
Table.Fields.count

Navnene på de enkelte felter findes her:

for i:=0 to Table.FieldCount-1 do
Showmessage(Table.FieldDefs[i].Name);
Avatar billede hrc Mester
20. februar 2008 - 15:59 #5
Kunne du ikke helt slippe ved at lave en query op tabellerne der undlader de forkerte records?
Avatar billede hrc Mester
20. februar 2008 - 16:11 #6
Det simpleste var at sortere de fleste eller alle de dårlige registreringer fra i din Query. Det næstsimpleste er at kigge på data inden du kopierer.

Eksempelvis sådan her:

Query := TQuery.Create(nil);
try
  try
    Query.SQL.Text := ''; // Script der prøver at sortere dårlige records fra.
    Query.ParamByName('').AsInteger := 0; // Eventuelt parameter på scriptet
    Query.Open;
    while not Query.Eof do
    begin
      if Query.FieldByName('').AsInteger <> UlovligVaerdi then // Validér record
      begin
        // Kopiér til database
      end;
    end;
  except
    on e: exception do
      // Hvis den nedarver fra andet end Exception så typecast den og
      // se om ikke du får et fejlnummer at validere på
      // if (e as TOleException).ErrorMsg = -1230123780 then
      //  // et eller andet.
  end;
end;
Avatar billede hrc Mester
20. februar 2008 - 16:13 #7
Hvis du risikerer at bruge dårlige data ved insert (dvs. på linjen "// Kopiér til database") kan du pakke det ind i en try except

try
  // Kopiér til database
except
  on e: exception do
    if (e.errorcode <> -123123) then // Forskellig fra en fejl du vil ignorere
      raise;
end;
Avatar billede hugopedersen Nybegynder
20. februar 2008 - 17:26 #8
Problemet med de 'dårlige' data er at de maskiner der samler data op er nogle gamle anlæg og i dem kører der en ældre version af databasen hvor der simpelthen mangler nogle felter. De gode tabeller/filer indeholder 15 felter mens der er nogen med 13 og nogen med 12.
Maskinerne er meget apropo dagens begivenheder nogle infostandere i solcentre:-)

Jeg tror jeg har fået det problem løst ved at jeg checker antallet af felter som kroning foreslog og så tager jeg kun de tabeller der har de 15 felter jeg forventer (det er 218 ud af 231 filer)

Men mon ikke i alle har fortjent en håndfuld point?
Avatar billede hrc Mester
21. februar 2008 - 08:24 #9
At tælle felter vil sikkert fungere fint. Du kan også tjekke om feltet findes:

if Query.Fields.IndexOf('newfield') >= 0 then
begin
  // Kopiér data
end;
Avatar billede kroning Nybegynder
21. februar 2008 - 08:46 #10
k
Avatar billede snowball Novice
21. februar 2008 - 09:32 #11
Jeg springer over :)
Avatar billede hugopedersen Nybegynder
21. februar 2008 - 09:54 #12
Jeg kunne selvfølgelig checke for hvert felt når jeg sætter parametrene her op
'Query.ParamByName('RecordID').Assign(Table.FieldByName('RecordID'));'
Men om det vil virke skal jeg lade være usagt. Men det kan da forsøges så jeg får data fra de gamle steder med også.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester