Hibakezelés tárolt eljárásban!

Hibakezelés tárolt eljárásban!
2006-05-17T15:48:42+02:00
2006-05-24T13:56:44+02:00
2022-10-30T21:50:45+01:00
kardosi
Sziasztok!

Nem boldogulok a következő dologgal:
Delphiben készül egy adatbáziskezelő alkalmazás, ami FireBird adatbázist használ. (WinXP, D7 Prof. és IBX a FireBird eléréshez...)
Az adatokat tárolt eljáráson keresztül kezelem (Insert, Update, Delete...).
Íme egy részlet a tátolt eljárásból:

/* HIBA kimenő paraméter */ HIBA='Nincs'; update tabla set mezo1=:mezo1, mezo2=:mezo2, ... /* mezo1, mezo2 bejövő paraméterek */ when sqlcode -625 do HIBA='NULL érték nem lehet'; when sqlcode -803 do HIBA='Duplikált rekord';

A bajom az, hogy nem tudom lekezelni, ha az sqlcode értéke más, (de 0-nál kisebb->akkor van hibám) mint a fenti kettő!
Ha így próbálom elkpani a hibát, hogy:

if (sqlcode<0) then HIBA='Nem sikerült a művelet';
akkor a tárolt eljárás nem a "HIBA"-val jön vissza, hanem egy teljesen más üzenettel!
Lényeg a lényeg, úgy szeretném megoldani a hibakezelést, hogy ha az sqlcode értéke -625, arra adja vissza, amit kell, ha -803, akkor az ennek megfelelő hibát adja vissza, ma más, mint az előző kettő, de negatív, akkor is adja vissza, mondjuk a "Művelet nem sikerült" üzenetet!

Ehhez kérnék némi segítséget!
Mutasd a teljes hozzászólást!
A "megoldás" -szerintem- a következő:
A tárolt eljárás mindenképpen visszaadja az sqlcode értékét, amit kliensoldalon már le tudok kezelni!
Valahogy így:

begin hibakod=0; update tabla set mezo1=:mezo1, mezo2=:mezo2, ... when any do hibakod=sqlcode; end
Ha van hiba, egz negatív szám a visszatérési érték, ha nincs hiba, akkor 0 !
Mutasd a teljes hozzászólást!

  • És ha így próbálnád:

    /* HIBA kimenő paraméter */ HIBA='Nincs'; update tabla set mezo1=:mezo1, mezo2=:mezo2, ... /* mezo1, mezo2 bejövő paraméterek */ when any do HIBA='Nem sikerült a művelet'; when sqlcode -625 do HIBA='NULL érték nem lehet'; when sqlcode -803 do HIBA='Duplikált rekord';
    Mutasd a teljes hozzászólást!
  • Szintaktikailag nem tudom hogy helyes e az az ANY-s rész, én soha nem használtam, de talán előrébb visz a megoldásban
    Mutasd a teljes hozzászólást!
  • Szia Droopy!

    Amit írtál, szintaktikailag helyes, csak éppen nem úgy működik, ahogy szeretném!
    Ha szerepel a
    when any do HIBA='Nem sikerült a művelet';
    akkor mindenképpen a "Nem sikerült a művelet" jön vissza, akár teszem ezt a sort a többi when elé, akár a többi when után!
    Azt sem értem, hogy ha if (sqlcode<0) then HBA='Hiba van';-t használok, az meg meg sem fogja a hibát...
    Mutasd a teljes hozzászólást!
  • Lehet hogy ha belefut egy WHEN-be amit "lekezel", utána már nem érzékeli a hibát, és nem fut bele több WHEN-be.
    Lehet valami olyasmi kellene, hogy

    ... when any do HIBAKOD = sqlcode if (HIBAKOD > 0) then HIBA = 'Nem sikerült a művelet!' if (HIBAKOD = -625) then HIBA = 'NULL érték nem lehet!' if (HIBAKOD = -803) then HIBA = 'Duplikált rekord!' ...

    Mutasd a teljes hozzászólást!
  • Ez így nem jó!
    Firebird esetén a when .. do után már nem állhat egyetlen utasítás sem!

    Mutasd a teljes hozzászólást!
  • Hát ez így nem ecccerű
    Gondolom ez nem csak egy tárolt eljárásodban lenne hasznosítva.
    Nem lehetne valami GetLastError szerű tárolt eljárást írni, ami visszaadná a hibakódot, és a hívása után már IF-ezheted.
    Bár lehet hogy a hívott proc nem érzékeli a hivó error-ját.
    Próbáld ki.
    Mutasd a teljes hozzászólást!
  • A "megoldás" -szerintem- a következő:
    A tárolt eljárás mindenképpen visszaadja az sqlcode értékét, amit kliensoldalon már le tudok kezelni!
    Valahogy így:

    begin hibakod=0; update tabla set mezo1=:mezo1, mezo2=:mezo2, ... when any do hibakod=sqlcode; end
    Ha van hiba, egz negatív szám a visszatérési érték, ha nincs hiba, akkor 0 !
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd