Adatbázis kapcsolat megszakadás C#

Adatbázis kapcsolat megszakadás C#
2015-04-28T22:46:26+02:00
2015-04-29T22:37:55+02:00
2022-10-15T22:40:57+02:00
iolah2
Sziasztok! (Ezt azért küldöm, mert nem tudom előbbi elment-e)
Írtam egy programot, mely több gépen végez bevitelt. 
Connection string-en keresztül a ms sql 2008-ból veszi az adatokat, illetve némi módosítás után oda írja vissza, viszi be stb.
Felmerült bennem egy kérdés: 
Hogy lehetne kezelni, hogy rögzítés során, mely két WPF-es ablak közti lépésből és rögzítésből áll,
ha megszakadna az adatbáziskapcsolat, azt hogy kell, lehet orvosolni.
Leállás érthető üzenettel például? Vagy várakozás?

Jelenleg ilyen esetben bizonyos helyeken nem tudok továbblépni, máshol meg elszáll a program. 

A terv: ha elszáll a kapcsolat, azonnal jelezni a szerkesztőnek, vagy amint módosítana valamit, hogy nincs kapcsolat(nincs adatbázis hozzáférés) és ne a program szálljon el. Vagy ha le is áll előbb közölje miért.

Gondoltam rakok minden sql EDMX-beli Entities használathoz egy try catch metódust, de ha csak ez lenne a jó megoldás, milyen catch feltételt kellene megfogalmazni.
Mutasd a teljes hozzászólást!
1. Catch ágnál ne sima Exception-t használj, hanem SqlException-t! Az előbbi az minden típusú exception-nek az őse.
2. A Contains-t felejtsd el, helyette használd az SqlException ErrorCode tulajdonságát!
3.link.
Mutasd a teljes hozzászólást!

  • Ezen már én is gondolkodtam egy ideje.

    Erre egy dll-t írnék. Minden SQL hibaüzenethez tartozik hibakód, amit az alábbi lekérdezéssel tudsz meghívni, bár végig menni, kiválogatni a lényeges hibaüzenetet ezen elég macerás meló:

    SELECT * FROM SYS.MESSAGES
    Vagy pedig használsz CultureInfo-t.

    Alapvető elképzelés az lenne, hogy a felhasználó számára minél relevánsabb, érhetőbb információt kell közölni, hogy miért nem megy a vas.

    Amúgy meg egy jó tanács: Minden adatbázis kapcsolódásnál kötelező a kivételkezelés használata.
    Mutasd a teljes hozzászólást!
  • Connection string-en keresztül a ms sql 2008-ból veszi az adatokat, illetve némi módosítás után oda írja vissza, viszi be stb.

    Ehhez minek kihozni az adatokat, miért nem elég minden gépen egy jól megírt tárolt eljárás ami elvégzi a módosításokat? 2008-astól  linkelt szervert is lehet használni így kapcsolati hibák lekezelése nem a te feladatod.
    Mutasd a teljes hozzászólást!
  • Kis méretű tablet-ekről van szó. És egy központi gépen van az adatbázis. Arra gondoltam, ha megszakad a központi géppel a kapcsolat, a pár bevitt információ elvésszen, vagy valahol elmentsem? 

    Szűrésre eddig olyasmit találtam, hogy ha egy catch-be beírom a e.message.Contains("Open"), akkor felismeri, hogy adatbázis kapcsolati hozzáférés gondja van. Csak ezt kissé maceráns mindenhol az adatbázishoz kötni.

    Quetzelcoatl-tól kérdezném, mit értesz a jól megírt tárolt eljárás alatt? Én most EDMX-et(entity data model) használok. Azzal tartom közvetlen a kapcsolatot.
    Mutasd a teljes hozzászólást!
  • CultureInfo-t használok, de elég körülményesen írja körül a hibaüzenetét. Vagy az szerkeszthető valahogy?
    Mutasd a teljes hozzászólást!
  • Ha szerkeszteni szeretnéd, akkor tényleg ajánlom, hogy csinálj dll-t, amiben az összes SQL hibaüzenetet ismeri, és lefordítja egyszerűbb nyelven. De mint mondtam, elég macera, és hosszú munka.
    Mutasd a teljes hozzászólást!
  • Kis méretű tablet-ekről van szó.

    Milyen op.rendszer fut rajtuk?
    Mutasd a teljes hozzászólást!
  • Mivel azt kell rögzítenem, hogy a dolgozó mit mikor kezdett, illetve fejezett be. Így úgy sejtem, hogy valami ilyesmi lenne mindenhova jó:

    try{.... ctx.Savechanges(); } catch(exception e) { if(e.Message.Contains("Open")) { //Hibaűzenet, majd leáll } }


    Az bennem még kérdéses, hogy ezt akkor mindenhova egyesével be kellene írnom, vagy van valami univerzális módja is?

    Esetleg azon gondolkodtam, hogy ilyenkor elmenthetnék pár adatot, pl.: dolgozó száma, dátum. Bár ha elszáll akkor lehet kellene valami ideiglenes rögzítés, csak sajnos ahhoz az adatbázis nagy.
    Mutasd a teljes hozzászólást!
  • Kis méretű tablet-ekről van szó. És egy központi gépen van az adatbázis. Arra gondoltam, ha megszakad a központi géppel a kapcsolat, a pár bevitt információ elvésszen, vagy valahol elmentsem?

    Ezt megoldhatod úgy is hogy helyi adatbázisba/fájlba kerül a bevitel vagy módosítás amikor nincs kapcsolat, pl egy sqlite adatbázisba és ha helyreállt a program megpróbálja végrehajtani a helyi adatok alapján a módosítást a központi adatbázisban. Ilyen megoldással a felhasználó akkor is tud felvinni új rekordokat ha nincs kapcsolata illetve módosíthatja az általa lekért táblák azon részét amik még az aktív kapcsolatnál átkerültek a gépére. Amint helyreállt a kapcsolat az eltárolt sql utasítások meghívódnak egy háttérszál által.
    Mutasd a teljes hozzászólást!
  • 1. Catch ágnál ne sima Exception-t használj, hanem SqlException-t! Az előbbi az minden típusú exception-nek az őse.
    2. A Contains-t felejtsd el, helyette használd az SqlException ErrorCode tulajdonságát!
    3.link.
    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