OnPostError - EDBEngineError nem keletkezik ...

OnPostError - EDBEngineError nem keletkezik ...
2007-07-17T19:19:44+02:00
2007-07-18T21:00:39+02:00
2022-11-05T06:55:36+01:00
Stil
Sziasztok,
ACCESS>> ADO >> DELPHI
Adott ez az egyszerű forráskód részlet:

procedure TDM.qEszkozPostError(DataSet: TDataSet; E: EDatabaseError; var Action: TDataAction); Var iHibaKod: Integer; begin If (E is EDBEngineError) Then ShowMessage(IntToStr( (E As EDBEngineError).Errors[0].ErrorCode )); end;

Szóval amikor a rekordot mentem és hiányzik egy kötelező mező, vagy kulcsismétlés van akkor is az if ágat átugorja, és a saját lüke hibaüzenetét jeleníti meg...
A showmessage helyett persze majd a hibakezelés lesz látható.

A Baga féle könyvben is ez a részlet van, és ahogy itt körülnéztem mindenki ezt használja az OnPostErrorben, és az OnDeleteErrorban
Mutasd a teljes hozzászólást!
A következő lett a megoldás és ahogy elnézem ez elég korrekt lett:

procedure TDM.qEszkozPostError(DataSet: TDataSet; E: EDatabaseError; var Action: TDataAction); Var I: Integer; begin With ADOConnection.Errors do For I:= Count - 1 Downto 0 do With Item[I] do Begin Case Number of -2147467259: ShowMessage(sKitoltetlenMezo); -2147217900: ShowMessage(sHivatkozasiIntegritas); ... End; Abort; end;
Előszőr megjentettem a hiba számát mindenféle hibatipusra a ShowMessage-el, mint ahogy az előző hozzászolásomból látszik, majd egyesével egy CASE-be ágyazva megjelentettem

Szóval most a pontot én kapom, de az érdem a tietek is...
Köszönöm
Mutasd a teljes hozzászólást!



  • procedure TDM.qEszkozPostError(DataSet: TDataSet; E: EDatabaseError; var Action: TDataAction); Var iHibaKod: Integer; begin If (E is EDBEngineError) Then begin ShowMessage(IntToStr( (E As EDBEngineError).Errors[0].ErrorCode )); abort; end; end;
    Mutasd a teljes hozzászólást!
  • Itt olvasatsz erről bővebben
    Mutasd a teljes hozzászólást!
  • Sajnos itt nem az a gond, hogy megjeleníti a saját hibaüzenetét, hanem, hogy nem hajtja végre az if utáni ShowMessage parancsot sem... Valszeg nem EDBEngineError osztályú üzenet keletkezik... De akkor milyen?
    Mutasd a teljes hozzászólást!
  • Akkor masmilyen

    Nem mocorogtatod a rekordmutatot ? Auto edit ?
    nezd meg canmodify true e
    Mutasd a teljes hozzászólást!
  • Esetleg a beforepostban ellenorizd le hogy minden mezo ki e lett toltve


    if (dbedit1.text ='') or (dbedit2.text ='') stb then abort; // v barmi



    Ez uj rekord v meglevo modositasa ?
    Mutasd a teljes hozzászólást!
  • Átnéztem,
    de én azt szeretném, ha a táblákban deklarált megszorításokat lehetőleg ne kelljen a programban is külön vizsgálni, mert akkor azok feleslegesek...
    Ezért én a hibakódoka alapján egy saját hibát kívánok megjeleníteni
    Mutasd a teljes hozzászólást!
  • Azt en ertem csak arra probalok rajonni hogyha nem EDBEngineError osztályú üzenet keletkezik akkor mi
    leptetted soronkent kihagyja az if et ?

    ja bocs most latom hix nek valaszolsz
    Mutasd a teljes hozzászólást!
  • Szóval akkor magyarítanám az elözö hozzászólásomat, mert visszaolvasva én sem értem
    Én egy salát hibaüzit akarok megjeleníteni akkor, ha a tábla megszorítások alapján a rekord nem illeszthető az adatbázisba...
    A formon lévő egyéb ellenörzést nem szeretném ilyen módon megoldani...
    Mutasd a teljes hozzászólást!
  • Igen amikor egy breaket berakok az if-hez, akkor módszeresen átugorja az if utáni blokkot f7-tel
    Mutasd a teljes hozzászólást!
  • újnál is és meglévőnél is
    Mutasd a teljes hozzászólást!
  • 2007.07.17. 19:33 hsz

    IDE n kivul futtatva
    Delphibol futtatva a bepitett debugger sikitozik
    Mutasd a teljes hozzászólást!
  • Azt tudom, sajnos 4 éve én is a saját káromon tanultam meg, hogy csak a lefordított állapotban nem jelenik meg a hibaüzenet
    Itt mint mondtam, sajnos nem EDBEngineError-nak ismeri fel ezeret a hibákat, ezért ha mondjuk a te általad aborttal kiegészített lefordított exe-t futtatom, akkor semmilyen semmi nem jelenik meg sasjna....
    Mutasd a teljes hozzászólást!
  • Akkor osszefoglalva csak hogy jol ertem e

    uj rekord felvitelenel es meglevo modositasanal hibauzeneted van
    ami nem EDBEngineError.
    Ezenkivul sajat hibauzenetet szeretnel megjeleniteni

    onediterror ?
    Mutasd a teljes hozzászólást!
  • EDatabaseError ?
    Mutasd a teljes hozzászólást!
  • ugyan nem néztem meg de biztos hogy a EDBEngineError EDatabaseError ??

    Nem győztél meg hogy ez a legjobb megoldás. Ha Gizike nagynehezen felpüföl egy szép kövér sok beviteli mezős űrlapot, örömébe rábök az OK-ra és kap egy bazinagy hibaüzenetet, majd kezdheti előlről ay egészet.
    Hmmm.... felhasználóbarát...
    Mutasd a teljes hozzászólást!

  • unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, DB, DBTables, ADODB; type TForm1 = class(TForm) DataSource1: TDataSource; Table1: TTable; Button1: TButton; ListBox1: TListBox; ADOConnection1: TADOConnection; procedure DataSource1DataChange(Sender: TObject; Field: TField); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure Button1Click(Sender: TObject); procedure Table1BeforeClose(DataSet: TDataSet); procedure Table1BeforeOpen(DataSet: TDataSet); procedure Table1PostError(DataSet: TDataSet; E: EDatabaseError; var Action: TDataAction); procedure Table1EditError(DataSet: TDataSet; E: EDatabaseError; var Action: TDataAction); procedure Table1DeleteError(DataSet: TDataSet; E: EDatabaseError; var Action: TDataAction); procedure ADOConnection1Disconnect(Connection: TADOConnection; var EventStatus: TEventStatus); private { Private declarations } public procedure LogEvent(const EventStr: string; Component: TComponent = nil); { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure Tform1.LogEvent(const EventStr: string; Component: TComponent = nil); var ItemCount: Integer; begin if (csDestroying in ComponentState) or not ListBox1.Visible then Exit; if (Component <> nil) and (Component.Name <> '') then ListBox1.Items.Add(Format('%s(%s)', [EventStr, Component.Name])) else ListBox1.Items.Add(EventStr); ItemCount := ListBox1.Items.Count; ListBox1.ItemIndex := ItemCount - 1; if ItemCount > (ListBox1.ClientHeight div ListBox1.ItemHeight) then ListBox1.TopIndex := ItemCount - 1; end; procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField); begin LogEvent('OnDataChange', Sender as TComponent); end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin Table1.Close; end; procedure TForm1.Button1Click(Sender: TObject); begin Table1.Open; Table1.Active:=true; end; procedure TForm1.Table1BeforeClose(DataSet: TDataSet); begin LogEvent('BeforeClose'); end; procedure TForm1.Table1BeforeOpen(DataSet: TDataSet); begin LogEvent('BeforeOpen', DataSet); end; procedure TForm1.Table1PostError(DataSet: TDataSet; E: EDatabaseError; var Action: TDataAction); begin LogEvent('OnPost Errors', DataSet); end; procedure TForm1.Table1EditError(DataSet: TDataSet; E: EDatabaseError; var Action: TDataAction); begin LogEvent('OnEdit Errors', DataSet); end; procedure TForm1.Table1DeleteError(DataSet: TDataSet; E: EDatabaseError; var Action: TDataAction); begin LogEvent('OnDelete Errors', DataSet); end; procedure TForm1.ADOConnection1Disconnect(Connection: TADOConnection; var EventStatus: TEventStatus); begin LogEvent('Disconnect', Connection); end; end.


    Loggold le hogy mi a baja
    Mutasd a teljes hozzászólást!
  • Bocs mindenki, de sajna el kellett mennem.
    Szóval, ha a hibaüzenetett kiadja, még nem feltétlen kell meghívni a cancel methódust, uh nem vesznek el Gizike adatai, csak addig nem menthet, amíg ki nem javítja azokat...
    Mutasd a teljes hozzászólást!
  • Bocs tőled különösen,
    ki fogom próbálni délután, csak - Te már ismered a helyzetet - a fejlesztőrendszer nincs benn a munkahelyemen
    Mutasd a teljes hozzászólást!
  • Semmi gond
    Majd ertesits a fejleményekrol

    off
    tényleg van gizike ?
    Mutasd a teljes hozzászólást!
  • Szia!

    Ha IDEből futtatod akkor a delphi kiirj a ahibaosztály típusát, nem?
    no, mit ír ki?



    herkulesketto
    Mutasd a teljes hozzászólást!
  • Ha jól emléxem, ott EDatabaseError-t ír ki, de hogy azon belül mi, azt nem...
    Ezt is meg fogom nézni...

    off
    oldboys: gizike a general tester specialist
    Mutasd a teljes hozzászólást!
  • onpost errors(qEszkoz)
    ez jött le a loggolás eredményeképpen például
    Mutasd a teljes hozzászólást!
  • EOLEException.... ezt írja ki a amikor az IDE alatt futtatom, ha mondjuk egy kötelezőmezőt nem töltök ki, vagy ha a hiv. integritás sérülni látszik pl:

    Egy lehetségesd üzenet:

    Project prProgramNev raised class EOleException with message [Microsoft][Microsoft ODBC Access Illesztőprogram] A következő nem tartalmazhat NULL értéket: Tipus_id merta amező kért tulajdonága true értékre van állítva stb...

    Namost ez magyar is meg minden, de tréééé a javából, ezt szeretném én magam lekezelni
    Mutasd a teljes hozzászólást!
  • bocs az előző Neked ment
    Mutasd a teljes hozzászólást!
  • Akkor masmilyen

    Szerintem csak a postnal er oda hogy hibat dobjon probald elkapni a exeptiont valahogy igy


    except on E:EOleException do begin showMessage('hu de rosszat irt be Gizike drága .Kérem javitsa ki !!!'); end;

    De eleve jobb lenne meggatolni hogy rossz adat keruljon fel
    Mutasd a teljes hozzászólást!
  • Túl egyhangú, mert én meg akarom ám de külömböztetni a hibfajtákat vala... Mert ugye nem tudja gizike, mej rekordokat barkácsolta el valójában
    De találtam valamit:


    with ADOConnection1.Errors do for i := Count - 1 downto 0 do with Item[i] do ShowMessage( ' Description: ' + Description + #13 + ' Number: ' + IntToStr(Number) + #13 + ' Native: ' + IntToStr(NativeError) + #13 + ' Source: ' + Source + #13 + ' State: ' + SQLState + #13);

    és ezt az onposterror -ba...
    ez alapján be tudom azonosítani a hibát...

    dolgozgatok rajta aztán értesítelek benneteket
    Mutasd a teljes hozzászólást!
  • A következő lett a megoldás és ahogy elnézem ez elég korrekt lett:

    procedure TDM.qEszkozPostError(DataSet: TDataSet; E: EDatabaseError; var Action: TDataAction); Var I: Integer; begin With ADOConnection.Errors do For I:= Count - 1 Downto 0 do With Item[I] do Begin Case Number of -2147467259: ShowMessage(sKitoltetlenMezo); -2147217900: ShowMessage(sHivatkozasiIntegritas); ... End; Abort; end;
    Előszőr megjentettem a hiba számát mindenféle hibatipusra a ShowMessage-el, mint ahogy az előző hozzászolásomból látszik, majd egyesével egy CASE-be ágyazva megjelentettem

    Szóval most a pontot én kapom, de az érdem a tietek is...
    Köszönöm
    Mutasd a teljes hozzászólást!
  • 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