20. februar 2008 - 10:16Der 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 :-)
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;
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?
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å.
Synes godt om
Ny brugerNybegynder
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.