🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.delphi.bazy-danych
14 messages
14 total messages Started by feniks Thu, 17 Apr 2014 21:06
Transakcje MSSQL2008, ANYDAC
#82032
Author: feniks
Date: Thu, 17 Apr 2014 21:06
29 lines
2276 bytes
Witam

Proszę o pomoc we właściwym zapisaniu transakcji.

Zrobiłem transakcje j/n (jest to wycinek z całości)  niestety czasami być może przy problemach z siecią nie wszystkie dane są zapisywane a transakcja nie zwraca błędu.

DM.ADConnection1.StartTransaction;
      try
        begin
          DM.dane.Post;
          DM.dane.ApplyUpdates;
          DM.dane.CommitUpdates;
          DM.dane.CachedUpdates := false;

          DM.up.sql.Add
         ('UPDATE prac_war SET s_wn = s_wn+:zkw  WHERE prac_war.SYMBOL_P = :zsymbol_p');
          DM.up.ParamByName('zkw').AsCurrency := zkwota_s;
          DM.up.ParamByName('zsymbol_p').AsInteger := zsymbol_p;
           DM.up.ExecSQL;

          end;

         DM.ADConnection1.Commit;
      except
        DM.ADConnection1.Rollback;
        MessageBox(Handle, 'Operacja nie powiodła się !!!!', 'Błąd',
          mb_OK + MB_ICONSTOP);

      end;
Re: Transakcje MSSQL2008, ANYDAC
#82033
Author: lesioq
Date: Thu, 17 Apr 2014 21:48
60 lines
2872 bytes
W dniu czwartek, 17 kwietnia 2014 23:06:55 UTC+2 użytkownik feniks napisał:
> Witam
> 
> 
> 
> Proszę o pomoc we właściwym zapisaniu transakcji.
> 
> 
> 
> Zrobiłem transakcje j/n (jest to wycinek z całości)  niestety czasami być może przy problemach z siecią nie wszystkie dane są zapisywane a transakcja nie zwraca błędu.
> 
> 
> 
> DM.ADConnection1.StartTransaction;
> 
>       try
> 
>         begin
> 
>           DM.dane.Post;
> 
>           DM.dane.ApplyUpdates;
> 
>           DM.dane.CommitUpdates;
> 
>           DM.dane.CachedUpdates := false;
> 
> 
> 
>           DM.up.sql.Add
> 
>          ('UPDATE prac_war SET s_wn = s_wn+:zkw  WHERE prac_war.SYMBOL_P = :zsymbol_p');
> 
>           DM.up.ParamByName('zkw').AsCurrency := zkwota_s;
> 
>           DM.up.ParamByName('zsymbol_p').AsInteger := zsymbol_p;
> 
>            DM.up.ExecSQL;
> 
> 
> 
>           end;
> 
> 
> 
>          DM.ADConnection1.Commit;
> 
>       except
> 
>         DM.ADConnection1.Rollback;
> 
>         MessageBox(Handle, 'Operacja nie powiodła się !!!!', 'Błąd',
> 
>           mb_OK + MB_ICONSTOP);
> 
> 
> 
>       end;

Nie wiem czy się da w ANYDAC (bo nigdy nie widziałem, ani tym bardzie nie używałem) ale pewnie się da, to ja bym zrobił całą transakcję po stronie serwera czyli w T-SQL'u. Używając komponentu w stylu: T...StoredProc, oczywiście w odpowiedni sposób eliminując deadlocki.
Re: Transakcje MSSQL2008, ANYDAC
#82034
Author: wloochacz
Date: Fri, 18 Apr 2014 09:35
8 lines
1669 bytes
W dniu 2014-04-17 23:48, lesioq@o2.pl pisze:
/ciach/
> Nie wiem czy się da w ANYDAC (bo nigdy nie widziałem, ani tym bardzie nie używałem) ale pewnie się da, to ja bym zrobił całą transakcję po stronie serwera czyli w T-SQL'u. Używając komponentu w stylu: T...StoredProc, oczywiście w odpowiedni sposób eliminując deadlocki.
Po co chcesz prosty update wrzucać do procedury?


-- 
wloochacz
Re: Transakcje MSSQL2008, ANYDAC
#82043
Author: wloochacz
Date: Fri, 18 Apr 2014 09:48
61 lines
3611 bytes
W dniu 2014-04-17 23:06, feniks pisze:
> Witam
>
> Proszę o pomoc we właściwym zapisaniu transakcji.
To jest, powiedzmy, właściwy sposób, ale obsługa CachedUpdates jest zła.

> Zrobiłem transakcje j/n (jest to wycinek z całości)  niestety czasami być może przy problemach z siecią nie wszystkie dane są zapisywane a transakcja nie zwraca błędu.
Powiedz mi, dlaczego uważasz, że tam powinien wystąpić wyjątek, który 
chcesz złapać (powiedzmy szczerze, w fatalny sposób)?

Twój kod złapie jakikolwiek wyjątek, pod warunkiem że ów wyjątek wystąpi 
w momencie wykonywania UPDATE. A że ów UPDATE jest poprawny (czepiłbym 
się przypisywaniem wartości parametrów przez AsXXX jak np. AsInteger; 
powinno być po prostu Value) to nie dostaniesz żadnej infomracji, chyba 
że ze strony bazy danych (jak np. naruszenie klucza czy wyjątek w 
triggerze na tabeli prac_war).

> DM.ADConnection1.StartTransaction;
>        try
>          begin
>            DM.dane.Post;
>            DM.dane.ApplyUpdates;
Poczytaj dokumentację na temat ApplyUpdates - tego się tak nie używa.
Sprawdź:
http://docs.embarcadero.com/products/rad_studio/firedac/uADCompDataSet_TADDataSet_RowError.html

>            DM.dane.CommitUpdates;
>            DM.dane.CachedUpdates := false;
Na cholerę to?
>
>            DM.up.sql.Add
Wiesz, że dodajesz SQL do tego DM.up? Przy następnym wywołaniu będziesz 
miał tam 2x UPDATE, przez trzecim wywołaniu, 3x itd.
Powinno być:
DM.up.sql.Text :=
albo po prostu
DM.ADConnection1.ExecSQL('prac_war SET s_wn = s_wn + :zkw WHERE 
prac_war.SYMBOL_P = :zsymbol_p', [zkwota_s, zsymbol_p]);

>           ('UPDATE prac_war SET s_wn = s_wn+:zkw  WHERE prac_war.SYMBOL_P = :zsymbol_p');
>            DM.up.ParamByName('zkw').AsCurrency := zkwota_s;
>            DM.up.ParamByName('zsymbol_p').AsInteger := zsymbol_p;
>             DM.up.ExecSQL;
>
>            end;
>
>           DM.ADConnection1.Commit;
W ogóle nie sprawdzasz czy ApplyUpdates się powiodło, a robisz Commit...

>        except
>          DM.ADConnection1.Rollback;
>          MessageBox(Handle, 'Operacja nie powiodła się !!!!', 'Błąd',
>            mb_OK + MB_ICONSTOP);
Fajnie by było wiedzieć która operacja się nie powiodła i dlaczego...
>
>        end;
>


-- 
wloochacz
Re: Transakcje MSSQL2008, ANYDAC
#82044
Author: feniks
Date: Fri, 18 Apr 2014 20:32
9 lines
1873 bytes
Witam

Zasadniczo moim celem jest zabezpieczenie operacji i przy wystąpieniu jakiegokolwiek problemu wycofanie całej operacji i poinformowanie użytkownika, iż coś jest nie tak.

Życie pokazało, iż to mi się nie udało dlatego zwracam się z uprzejma prośbą o pomoc, pokazanie jak taki kod powinien wyglądać 



Umieszczony kod jest częścią kodu właściwego z dużą ilością warunków i aby pokazać to co dla mnie ważne w tym poście część linijek wyciąłem i trochę za dużo gdyż jak słusznie Pan zauważył brakuje DM.up.sql.Clear.
Re: Transakcje MSSQL2008, ANYDAC
#82035
Author: lesioq
Date: Sun, 20 Apr 2014 06:15
18 lines
2792 bytes
W dniu piątek, 18 kwietnia 2014 11:35:30 UTC+2 użytkownik wloochacz napisał:
> W dniu 2014-04-17 23:48, lesioq@o2.pl pisze:
> 
> /ciach/
> 
> > Nie wiem czy się da w ANYDAC (bo nigdy nie widziałem, ani tym bardzie nie używałem) ale pewnie się da, to ja bym zrobił całą transakcję po stronie serwera czyli w T-SQL'u. Używając komponentu w stylu: T...StoredProc, oczywiście w odpowiedni sposób eliminując deadlocki.
> 
> Po co chcesz prosty update wrzucać do procedury?
> 
> 
> 
> 
> 
> -- 
> 
> wloochacz

Prosty lub nieprosty UPDATE, ja bym i tak wrzucił wszystko w T-SQL'a. Tak jak napisał pytający, że jest to fragment kodu i nie wiadomo co jest dalej. Kolejne pytanie: czy program działa w sieci LAN czy WAN - jednak nie ma to znaczenia jeśli chodzi o poprawność wykonania transakcji. Wracając, jeśli w LAN to faktycznie można odpuścić T-SQL'a i zrobić wszystko w programie, jeśli jednak WAN to już bym na pewno robił w T-SQL'u. Generalnie uczepiłem się tego T-SQL'a, ponieważ chodzi mi o szybkość wykonania transakcji, o poprawności nie wspomnę. No i jeszcze jedno, ponieważ pytający napisał, że przy problemach z siecią - i teraz moje pytanie: czy jeśli nie ma problemów z siecią: to transakcja cała się zapisuje poprawnie, jeśli są problemy z siecią: to czy ta sama transakcja (te same dane do zapisania) czasami czy zawsze zapisuje się nieprawidłowo ?
Re: Transakcje MSSQL2008, ANYDAC
#82036
Author: wloochacz
Date: Sun, 20 Apr 2014 08:13
53 lines
4227 bytes
W dniu 2014-04-20 08:15, lesioq@o2.pl pisze:
> W dniu piątek, 18 kwietnia 2014 11:35:30 UTC+2 użytkownik wloochacz napisał:
>> W dniu 2014-04-17 23:48, lesioq@o2.pl pisze:
>>
>> /ciach/
>>
>>> Nie wiem czy się da w ANYDAC (bo nigdy nie widziałem, ani tym bardzie nie używałem) ale pewnie się da, to ja bym zrobił całą transakcję po stronie serwera czyli w T-SQL'u. Używając komponentu w stylu: T...StoredProc, oczywiście w odpowiedni sposób eliminując deadlocki.
>>
>> Po co chcesz prosty update wrzucać do procedury?
>>
>>
>>
>>
>>
>> --
>>
>> wloochacz
>
> Prosty lub nieprosty UPDATE, ja bym i tak wrzucił wszystko w T-SQL'a.
Może zdefinuj czym dla Ciebie ejst T-SQL?
Bo dla mnie jest dialektem SQLa, obsługiwanym przez MSSQL i Sybase.
A dla Ciebie jest to kod SQL wykonywany na serwerze - dobrze kumam?

Jeśli tak - możesz sobie wrzucać co chcesz, widze że jesteś na etapie 
fascynacji - przejdzie Ci... albo i nie, ale tym gorzej dla Twoich 
programów ;-)

> Tak jak napisał pytający, że jest to fragment kodu i nie wiadomo co jest dalej. Kolejne pytanie: czy program działa w sieci LAN czy WAN - jednak nie ma to znaczenia jeśli chodzi o poprawność wykonania transakcji. Wracając, jeśli w LAN to faktycznie można odpuścić T-SQL'a i zrobić wszystko w programie, jeśli jednak WAN to już bym na pewno robił w T-SQL'u.
Generalnie, to bzdury klepiesz...
W wolnej sieci trzeba minimalizować ilość pytań do serwera, trzeba 
unikać seryjnych wywoływań kodu SQL np. w pętli.
A czy będzie to prosty update czy wołanie procedury - bez znaczenia.
Chociaż niekoniecznie - jeśli ta procederua będzie miała spartoloną 
obsługę i przy każdym wołaniu ktoś wykona Unprepare/Prepare to będzie 
działać to x razy wolniej od prostego UPDATE.

> Generalnie uczepiłem się tego T-SQL'a, ponieważ chodzi mi o szybkość wykonania transakcji, o poprawności nie wspomnę.
OK, a jakie to ma znaczenie?
Żadne.

> No i jeszcze jedno, ponieważ pytający napisał, że przy problemach z siecią - i teraz moje pytanie: czy jeśli nie ma problemów z siecią: to transakcja cała się zapisuje poprawnie, jeśli są problemy z siecią: to czy ta sama transakcja (te same dane do zapisania) czasami czy zawsze zapisuje się nieprawidłowo ?
Jeśli rozumiałbyś ten kod, który pokazał - wiedziałbyś że on jest źle 
napisany w kontekście zatwierdzania zmian w CachedUpdates.
Poza tym jak chcesz wrzucić zmiany z CachedUpdates do T-SQL??
Wiesz, że to może być cała seria insert/udpate/delete - chcesz zamienić 
to wywołaniem jednej procedury - jak?
Jeśli kołacze Ci się po głowie taki myk, że po każdej zmianie rekordu 
jest wołana procedura (wrzucienie do T-SQL), to zapewniam Cię, że taki 
kod będzie mocno nieefektywny - małe ma znacznie na szbkim LAN, ogromne 
na wolnym WAN.

-- 
wloochacz
Re: Transakcje MSSQL2008, ANYDAC
#82037
Author: lesioq
Date: Sun, 20 Apr 2014 10:07
114 lines
5697 bytes
W dniu niedziela, 20 kwietnia 2014 10:13:05 UTC+2 użytkownik wloochacz napisał:
> W dniu 2014-04-20 08:15, lesioq@o2.pl pisze:
> 
> > W dniu piątek, 18 kwietnia 2014 11:35:30 UTC+2 użytkownik wloochacz napisał:
> 
> >> W dniu 2014-04-17 23:48, lesioq@o2.pl pisze:
> 
> >>
> 
> >> /ciach/
> 
> >>
> 
> >>> Nie wiem czy się da w ANYDAC (bo nigdy nie widziałem, ani tym bardzie nie używałem) ale pewnie się da, to ja bym zrobił całą transakcję po stronie serwera czyli w T-SQL'u. Używając komponentu w stylu: T...StoredProc, oczywiście w odpowiedni sposób eliminując deadlocki.
> 
> >>
> 
> >> Po co chcesz prosty update wrzucać do procedury?
> 
> >>
> 
> >>
> 
> >>
> 
> >>
> 
> >>
> 
> >> --
> 
> >>
> 
> >> wloochacz
> 
> >
> 
> > Prosty lub nieprosty UPDATE, ja bym i tak wrzucił wszystko w T-SQL'a.
> 
> Może zdefinuj czym dla Ciebie ejst T-SQL?
> 
> Bo dla mnie jest dialektem SQLa, obsługiwanym przez MSSQL i Sybase.
> 
> A dla Ciebie jest to kod SQL wykonywany na serwerze - dobrze kumam?
> 
> 
> 
> Jeśli tak - możesz sobie wrzucać co chcesz, widze że jesteś na etapie 
> 
> fascynacji - przejdzie Ci... albo i nie, ale tym gorzej dla Twoich 
> 
> programów ;-)
> 
> 
> 
> > Tak jak napisał pytający, że jest to fragment kodu i nie wiadomo co jest dalej. Kolejne pytanie: czy program działa w sieci LAN czy WAN - jednak nie ma to znaczenia jeśli chodzi o poprawność wykonania transakcji. Wracając, jeśli w LAN to faktycznie można odpuścić T-SQL'a i zrobić wszystko w programie, jeśli jednak WAN to już bym na pewno robił w T-SQL'u.
> 
> Generalnie, to bzdury klepiesz...
> 
> W wolnej sieci trzeba minimalizować ilość pytań do serwera, trzeba 
> 
> unikać seryjnych wywoływań kodu SQL np. w pętli.
> 
> A czy będzie to prosty update czy wołanie procedury - bez znaczenia.
> 
> Chociaż niekoniecznie - jeśli ta procederua będzie miała spartoloną 
> 
> obsługę i przy każdym wołaniu ktoś wykona Unprepare/Prepare to będzie 
> 
> działać to x razy wolniej od prostego UPDATE.
> 
> 
> 
> > Generalnie uczepiłem się tego T-SQL'a, ponieważ chodzi mi o szybkość wykonania transakcji, o poprawności nie wspomnę.
> 
> OK, a jakie to ma znaczenie?
> 
> Żadne.
> 
> 
> 
> > No i jeszcze jedno, ponieważ pytający napisał, że przy problemach z siecią - i teraz moje pytanie: czy jeśli nie ma problemów z siecią: to transakcja cała się zapisuje poprawnie, jeśli są problemy z siecią: to czy ta sama transakcja (te same dane do zapisania) czasami czy zawsze zapisuje się nieprawidłowo ?
> 
> Jeśli rozumiałbyś ten kod, który pokazał - wiedziałbyś że on jest źle 
> 
> napisany w kontekście zatwierdzania zmian w CachedUpdates.
> 
> Poza tym jak chcesz wrzucić zmiany z CachedUpdates do T-SQL??
> 
> Wiesz, że to może być cała seria insert/udpate/delete - chcesz zamienić 
> 
> to wywołaniem jednej procedury - jak?
> 
> Jeśli kołacze Ci się po głowie taki myk, że po każdej zmianie rekordu 
> 
> jest wołana procedura (wrzucienie do T-SQL), to zapewniam Cię, że taki 
> 
> kod będzie mocno nieefektywny - małe ma znacznie na szbkim LAN, ogromne 
> 
> na wolnym WAN.
> 
> 
> 
> -- 
> 
> wloochacz

Chyba nie do końca się zrozumieliśmy. Ja w swoich programach mam tak, że jak tworzę bazę danych (czyli np.: pierwsze uruchomienie programu), to tworzę w niej (oczywiście poza tabelami i widokami) funkcje i procedury z których później korzystam. Jeśli jest modyfikacja danych w bazie to wykonuję to wywołując utworzoną procedurę, a w jednej ze zmiennych zwracam wynik czy jest OK czy nie.

> Wiesz, że to może być cała seria insert/udpate/delete - chcesz zamienić 
> 
> to wywołaniem jednej procedury - jak?

Co za problem, że w jednej procedurze ? Może być ich ile chce, ja tak mam, że wykonuję jakąś procedurę w której są kilka razy INSERT i UPDATE i DELETE. W czym problem, chyba, że myślimy o czymś innym.
Re: Transakcje MSSQL2008, ANYDAC
#82038
Author: wloochacz
Date: Wed, 23 Apr 2014 06:44
16 lines
2314 bytes
W dniu 2014-04-20 12:07, lesioq@o2.pl pisze:
/ciach/
> Chyba nie do końca się zrozumieliśmy. Ja w swoich programach mam tak, że jak tworzę bazę danych (czyli np.: pierwsze uruchomienie programu), to tworzę w niej (oczywiście poza tabelami i widokami) funkcje i procedury z których później korzystam. Jeśli jest modyfikacja danych w bazie to wykonuję to wywołując utworzoną procedurę, a w jednej ze zmiennych zwracam wynik czy jest OK czy nie.
>
>> Wiesz, że to może być cała seria insert/udpate/delete - chcesz zamienić
>>
>> to wywołaniem jednej procedury - jak?
>
> Co za problem, że w jednej procedurze ? Może być ich ile chce, ja tak mam, że wykonuję jakąś procedurę w której są kilka razy INSERT i UPDATE i DELETE. W czym problem, chyba, że myślimy o czymś innym.
>
Faktycznie - nie masz pojęcia o czym piszę (rozumiesz jak działa 
CachedUpdates??).
EOT.

-- 
wloochacz
Re: Transakcje MSSQL2008, ANYDAC
#82039
Author: lesioq
Date: Thu, 24 Apr 2014 17:35
16 lines
3664 bytes
W dniu środa, 23 kwietnia 2014 08:44:12 UTC+2 użytkownik wloochacz napisał:
> W dniu 2014-04-20 12:07, lesioq@o2.pl pisze:
> 
> Faktycznie - nie masz pojęcia o czym piszę (rozumiesz jak działa 
> 
> CachedUpdates??).
> 
> EOT.
> 
> 
> 
> -- 
> 
> wloochacz

Szczerze mówiąc to nie mam o tym zielonego pojęcia, bo chyba nigdy nie było mi to potrzebne. Nie wiem, może zrobiłem największy błąd mojego życia, że w programach nie używam CachedUpdates, może w tym przypadku jest to bardzo potrzebne, wręcz bez tego program nie będzie działał - nie wiem. Ale napisałem dość sporo programów, większość na MSSQL + T-SQL, wszystkie działają prawidłowo (lub mają sporadyczne błędy, bo nie da się przewidzieć wszystkiego), szybko, nie ma z nimi żadnych problemów, nie zawieszają się, bazy zawierają ogromne ilości danych, właściciele są zadowoleni, ich księgowi też, pracownicy również nie narzekają. Wyluzuj trochę, bo Twoje (p)odpowiedzi generalnie nic nie wnoszą i rzadko pomagają, a są w stylu: "ale debile nic nie wiedzą, ja jestem mega-zajebisty, trochę im podpowiem ale tak, żeby dać im jeszcze raz do zrozumienia, że są kretynami i nie powinni programować, tylko ja się do tego nadaję, bo programuję w jedyny słuszny sposób, a jak komuś coś nie wychodzi i pyta na grupach to znaczy, że jest matołkiem i niech szuka dalej, bo od czego są google i w ogóle jak można zadawać tak banalne pytania i udzielać tak kretyńskich odpowiedzi :-)". Jak masz z tym problem to nie odpowiadaj, a jeśli chcesz się do czegoś przydać, to napisz to tak aby faktycznie pomóc i jednocześnie nie ośmieszać pytającego lub/i odpowiadającego, jeśli uważasz, że pytanie jest banalne lub źle zadane, lub, że wg Ciebie ta odpowiedź jest zła - to napisz dlaczego coś jest źle, a potem napisz jak powinno być prawidłowo. I tak wiem, że mi odpowiesz w swój sposób ociekający jadem, bo inaczej nie potrafisz, ale mam to głęboko gdzieś. I bardzo mi Ciebie żal, bo sam ze sobą bym na Twoim miejscu nie wytrzymał.
Re: Transakcje MSSQL2008, ANYDAC
#82040
Author: wloochacz
Date: Thu, 24 Apr 2014 18:20
51 lines
4801 bytes
W dniu 2014-04-24 19:35, lesioq@o2.pl pisze:
> Szczerze mówiąc to nie mam o tym zielonego pojęcia, bo chyba nigdy nie było mi to potrzebne.
Skąd możesz mieć zielone pojęcie o czymś, o czym nie masz pojęcia, że 
istnieje a tym bardziej co to jest i jak się tego używa?

> Nie wiem, może zrobiłem największy błąd mojego życia, że w programach nie używam CachedUpdates,
> może w tym przypadku jest to bardzo potrzebne, wręcz bez tego program nie będzie działał - nie wiem.
To się dowiedz; przypominam, że w wątku był kod z CahedUpdates - 
zrobiony niepoprawnie i stawiam na to, że tam jest pies pogrzebany.
To nie transkacja nie zwraca błędu, tylko są błędy przy ApplyUpdates - i 
wtedy będzie tak, jak feniks to opisał - zapisze się część danych 
(niektóre zmienione rekordy), ta część, która przeszła do bazy bez błedów.
Zreszta po co ja to piszę i tak nie rozumiesz o czym mowa.

> Ale napisałem dość sporo programów, większość na MSSQL + T-SQL, wszystkie działają prawidłowo
> (lub mają sporadyczne błędy, bo nie da się przewidzieć wszystkiego), szybko, nie ma z nimi żadnych problemów,
> nie zawieszają się, bazy zawierają ogromne ilości danych, właściciele są zadowoleni, ich księgowi też,
> pracownicy również nie narzekają.
Gratuluję; ja ciągle nie mogę napisać jednego...

> Wyluzuj trochę, bo Twoje (p)odpowiedzi generalnie nic nie wnoszą i rzadko pomagają, a są w stylu:
> "ale debile nic nie wiedzą, ja jestem mega-zajebisty, trochę im podpowiem ale tak, żeby dać im jeszcze
> raz do zrozumienia, że są kretynami i nie powinni programować, tylko ja się do tego nadaję,
> bo programuję w jedyny słuszny sposób, a jak komuś coś nie wychodzi i pyta na grupach to znaczy,
> że jest matołkiem i niech szuka dalej, bo od czego są google i w ogóle jak można zadawać tak banalne pytania
> i udzielać tak kretyńskich odpowiedzi :-)".
Ze swoim podejściem przypominasz mi człowieka z pl.comp.bazy-danych - on 
też wszystko wie, a to czego nie wie to się domyśla jak działa i to mu 
wystarcza.
OK - gratuluję podejścia, można i tak.

> Jak masz z tym problem to nie odpowiadaj, a jeśli chcesz się do czegoś przydać,
> to napisz to tak aby faktycznie pomóc i jednocześnie nie ośmieszać pytającego lub/i odpowiadającego,
> jeśli uważasz, że pytanie jest banalne lub źle zadane, lub, że wg Ciebie ta odpowiedź jest zła - to napisz dlaczego
> coś jest źle, a potem napisz jak powinno być prawidłowo.
Napisałem ze wskazaniem gdzie trzeba doczytać - sorry, ale programowanie 
to też (a może przede wszystkim) umiejętność czytania ze zrozumieniem. 
No i oczywiście odrobina pomysłu i kupa czasu na testy i kombinowanie...
Ale ja nie jestm Arivald (szacun), który ma belferskie ciągoty i ogromną 
cierpliwość ;-)
Odpowiem tak samo głupowo jak Ty - się nie podoba, to nie czytaj - wrzuć 
mnie do KFa i po sprawie.

> I tak wiem, że mi odpowiesz w swój sposób ociekający jadem,
> bo inaczej nie potrafisz, ale mam to głęboko gdzieś.
> I bardzo mi Ciebie żal, bo sam ze sobą bym na Twoim miejscu nie wytrzymał.
No popatrz - to podobnie jak z CachedUpdates, skąd możesz wiedzieć o 
czymś, o czym nie masz pojęcia?

-- 
wloochacz
Re: Transakcje MSSQL2008, ANYDAC
#82041
Author: lesioq
Date: Thu, 24 Apr 2014 19:25
121 lines
6626 bytes
W dniu czwartek, 24 kwietnia 2014 20:20:13 UTC+2 użytkownik wloochacz napisał:
> W dniu 2014-04-24 19:35, lesioq@o2.pl pisze:
> 
> > Szczerze mówiąc to nie mam o tym zielonego pojęcia, bo chyba nigdy nie było mi to potrzebne.
> 
> Skąd możesz mieć zielone pojęcie o czymś, o czym nie masz pojęcia, że 
> 
> istnieje a tym bardziej co to jest i jak się tego używa?
> 

No właśnie napisałem, że nie mam o tym zielonego pojęcia (czytaj ze zrozumieniem), a chętnie bym się dowiedział.

> 
> 
> > Nie wiem, może zrobiłem największy błąd mojego życia, że w programach nie używam CachedUpdates,
> 
> > może w tym przypadku jest to bardzo potrzebne, wręcz bez tego program nie będzie działał - nie wiem.
> 
> To się dowiedz; przypominam, że w wątku był kod z CahedUpdates - 
> 
> zrobiony niepoprawnie i stawiam na to, że tam jest pies pogrzebany.
> 
> To nie transkacja nie zwraca błędu, tylko są błędy przy ApplyUpdates - i 
> 
> wtedy będzie tak, jak feniks to opisał - zapisze się część danych 
> 
> (niektóre zmienione rekordy), ta część, która przeszła do bazy bez błedów.
> 

OK, tutaj dziękuję za zwrócenie uwagi i napisanie odpowiedzi.

> Zreszta po co ja to piszę i tak nie rozumiesz o czym mowa.
> 

Ach... Jest i odpowiedź w Twoim stylu, nie zawiodłem się.

> 
> 
> > Ale napisałem dość sporo programów, większość na MSSQL + T-SQL, wszystkie działają prawidłowo
> 
> > (lub mają sporadyczne błędy, bo nie da się przewidzieć wszystkiego), szybko, nie ma z nimi żadnych problemów,
> 
> > nie zawieszają się, bazy zawierają ogromne ilości danych, właściciele są zadowoleni, ich księgowi też,
> 
> > pracownicy również nie narzekają.
> 
> Gratuluję; ja ciągle nie mogę napisać jednego...
> 

Nie wierzę.

> 
> 
> > Wyluzuj trochę, bo Twoje (p)odpowiedzi generalnie nic nie wnoszą i rzadko pomagają, a są w stylu:
> 
> > "ale debile nic nie wiedzą, ja jestem mega-zajebisty, trochę im podpowiem ale tak, żeby dać im jeszcze
> 
> > raz do zrozumienia, że są kretynami i nie powinni programować, tylko ja się do tego nadaję,
> 
> > bo programuję w jedyny słuszny sposób, a jak komuś coś nie wychodzi i pyta na grupach to znaczy,
> 
> > że jest matołkiem i niech szuka dalej, bo od czego są google i w ogóle jak można zadawać tak banalne pytania
> 
> > i udzielać tak kretyńskich odpowiedzi :-)".
> 
> Ze swoim podejściem przypominasz mi człowieka z pl.comp.bazy-danych - on 
> 
> też wszystko wie, a to czego nie wie to się domyśla jak działa i to mu 
> 
> wystarcza.
> 
> OK - gratuluję podejścia, można i tak.
> 

Nie, nie wszystko wiem, szczerze mówiąc zdaję sobie sprawę, że bardzo dużo rzeczy nie wiem, ale gdyby odpowiedzi były normalnie to moja wiedza i innych mogła by być większa, szkoda, że swoją wiedzą nie chcesz się podzielić w odpowiedni sposób, aby było to dla wszystkich zrozumiałe. Zmuszasz do myślenia - to jest OK, ale nie w taki sposób jaki to robisz - czyli w większości obrażasz.
A wracając, jeśli ktoś o coś pyta, a ja u siebie w programach "mam odpowiedź", to chcę tą wiedzą się podzielić, jeśli robię to źle, lub mógłbym to robić lepiej, to chciałbym, aby to zostało napisane w kulturalny sposób dlaczego moja odpowiedź jest zła i jakie rozwiązanie warto zastosować. Mówię ogólnie, nie dotyczy to tylko tego wątku.

> 
> 
> > Jak masz z tym problem to nie odpowiadaj, a jeśli chcesz się do czegoś przydać,
> 
> > to napisz to tak aby faktycznie pomóc i jednocześnie nie ośmieszać pytającego lub/i odpowiadającego,
> 
> > jeśli uważasz, że pytanie jest banalne lub źle zadane, lub, że wg Ciebie ta odpowiedź jest zła - to napisz dlaczego
> 
> > coś jest źle, a potem napisz jak powinno być prawidłowo.
> 
> Napisałem ze wskazaniem gdzie trzeba doczytać - sorry, ale programowanie 
> 
> to też (a może przede wszystkim) umiejętność czytania ze zrozumieniem. 
> 
> No i oczywiście odrobina pomysłu i kupa czasu na testy i kombinowanie...
> 
> Ale ja nie jestm Arivald (szacun), który ma belferskie ciągoty i ogromną 
> 
> cierpliwość ;-)
> 

A szkoda, bo wiem, że masz ogromną wiedzę i jak pisałem wcześniej, szkoda, że dzielisz się nią w taki a nie inny sposób.

> Odpowiem tak samo głupowo jak Ty - się nie podoba, to nie czytaj - wrzuć 
> 
> mnie do KFa i po sprawie.
> 

Nie ma takiej możliwości :-).

> 
> 
> > I tak wiem, że mi odpowiesz w swój sposób ociekający jadem,
> 
> > bo inaczej nie potrafisz, ale mam to głęboko gdzieś.
> 
> > I bardzo mi Ciebie żal, bo sam ze sobą bym na Twoim miejscu nie wytrzymał.
> 
> No popatrz - to podobnie jak z CachedUpdates, skąd możesz wiedzieć o 
> 
> czymś, o czym nie masz pojęcia?
> 

Eh, a Ty w kółko o jednym.
Re: Transakcje MSSQL2008, ANYDAC
#82045
Author: wloochacz
Date: Thu, 24 Apr 2014 19:44
161 lines
7159 bytes
W dniu 2014-04-18 22:32, feniks pisze:
> Witam
>
> Zasadniczo moim celem jest zabezpieczenie operacji i przy wystąpieniu jakiegokolwiek problemu wycofanie całej operacji i poinformowanie użytkownika, iż coś jest nie tak.
OK, bo mnie lesioq wk (widzisz jaki ze mnie prosty chłop, tak łatwo daję 
sie podejść) to Ci napiszę co i jak ;-)

> Życie pokazało, iż to mi się nie udało dlatego zwracam się z uprzejma prośbą o pomoc, pokazanie jak taki kod powinien wyglądać
> Umieszczony kod jest częścią kodu właściwego z dużą ilością warunków i aby pokazać to co dla mnie ważne w tym poście część linijek wyciąłem i trochę za dużo gdyż jak słusznie Pan zauważył brakuje DM.up.sql.Clear.
Pytanie #1:
Czy CachedUpdates dla jest w ogóle włączone?
czyli DM.dane.Cachedudpates := True;  ??
Zakładam, że tak jest...

Pytanie #2:
Wiesz czym jest i jak działa CachedUpdates?
Jesli nie wiesz, to spójrz:
http://docwiki.embarcadero.com/Libraries/XE6/en/FireDAC.Comp.DataSet.TFDDataSet.CachedUpdates

Na początek wystarczy to zdanie: "CachedUpdates enables (True) or 
disables (False) the logging of data changes (Insert/Post, Edit/Post, 
Delete) without immediately applying them to the database."

A więc wszelkie zmiany w DataSecie (DM.dane), które robisz za pomocą 
Insert/Append, Edit, Delete nie "wchodzą" do bazy danych. Dane są 
zmieniane (i logowane - jest też mechanizm Undo/Redo oraz SavePoints - 
lesioq wyjaśni Ci co są te SavePointy w kontekście Nested Transaction, 
bo on to wrzuca do T-SQL'a) tylko i wyłącznie w lokalnym buforze DataSetu.
Żeby zmiany z lokalnego bufora poleciały do bazy danych, należy wywołać:
ApplyUpdates - do zatwierdzenia zmian.
CommitUpdates - kasuje log zmian dla rekordów z lokalnego bufora 
DataSetu i oznacza wszystkie rekordy jako niezmodyfikowane (ciekaowstka 
- w AnyDAC/FireDAC jest mechnizm typu row-level-versioning, ale to inna 
bajka...)
CancelUpdates - do anulowania zmian.

OK, tyle wstępu...

Pierwszy problem, to wywolanie ApplyUpdates - napisałeś tak:

DM.dane.ApplyUpdates;

Ale ApplyUpdates zadeklarowano tak:
function ApplyUpdates(AMaxErrors: Integer = -1): Integer;

AMaxErrors odpowiada ile błędów jest dopuszczone podczas aktualizacji 
danych w bazie. -1 oznacza - bez limitu, co sprawia, że ApplyUpdates 
aktulizuje dane w bazie na podstawie logu zmian w DataSecie - wiersz po 
wierszu. Jeśli w momencie aktualizacji (czyli kiedy wołasz ApplyUpdates) 
wiersza wystąpi wyjątek (z różnych powodów, np. naruszenie klucza, 
wartośc null dla pola not-null, albo zaniku połączenia z serwerem), to 
dzieje się tak:
1) Jeżeli AMaxErrors < 0, to nie przejmuj się i przejdź do aktulizacji 
następnego wiersza.
2) Jeśli był bład, to wołaj zdarzenie OnReconcileError


Zatem, Twój kod powinien być napisany tak (ale to wersja biedna, bo nie 
powinno być częściowych aktualkizacji w bazie ale nadal nie będziesz 
widział co poszło nie tak):

var
   lErrorCount: Integer;
begin
   DM.ADConnection1.StartTransaction;
   try
     if DM.dane.State in dsEditModes then
       DM.dane.Post;

     if DM.dane.UpdatesPending then
     begin
       lErrorCount := DM.dane.ApplyUpdates(0);
       if lErrorCount = 0 then
         DM.dane.CommitUpdates;
     end
     else
       lErrorCount := 0;

     if lErrorCount = 0 then
     begin
       DM.up.sql.Text := 'UPDATE prac_war SET s_wn = s_wn+:zkw  WHERE 
prac_war.SYMBOL_P = :zsymbol_p';
       DM.up.ParamByName('zkw').Value       := zkwota_s;
       DM.up.ParamByName('zsymbol_p').Value := zsymbol_p;
       DM.up.ExecSQL;
       DM.ADConnection1.Commit;
     end
     else
       DM.ADConnection1.Rollback;
   except
     DM.ADConnection1.Rollback;
     MessageBox(Handle, 'Operacja nie powiodła się !!!!', 'Błąd', mb_OK 
+ MB_ICONSTOP);
   end;
end;

Jeśli chcesz dowiedzieć się co poszło ni tak, masz kilka opcji:
1) Obsłużyć zdarzenie OnUpdateErrror
2) Obsłużyć zdarzenie OnReconcileError
3) Użyć FilterChanges

Pokażę z tą trzecią opcją, czyli:
var
   lErrorCount: Integer;
   lST        : TStringList;
begin
   DM.ADConnection1.StartTransaction;
   try
     if DM.dane.State in dsEditModes then
       DM.dane.Post;

     if DM.dane.UpdatesPending then
     begin
       lErrorCount := DM.dane.ApplyUpdates(-1);
       if lErrorCount = 0 then
         DM.dane.CommitUpdates;
     end
     else
       lErrorCount := 0;

     if lErrorCount = 0 then
       begin
         DM.up.sql.Text := 'UPDATE prac_war SET s_wn = s_wn+:zkw  WHERE 
prac_war.SYMBOL_P = :zsymbol_p';
         DM.up.ParamByName('zkw').Value       := zkwota_s;
         DM.up.ParamByName('zsymbol_p').Value := zsymbol_p;
         DM.up.ExecSQL;
         DM.ADConnection1.Commit;
       end
     else
       begin
         DM.dane.FilterChanges := [rtModified, rtInserted, rtDeleted, 
rtHasErrors];
         lST := TStringList.Create;
         try
           DM.dane.First;
           while not DM.dane.Eof do
             if Assigned(DM.dane.RowError) then
               lST.Add(DM.dane.RowError.Message);

           if lST.Count > 0 then
             MessageBox(Handle, 'Operacja nie powiodła się !!!!'#13#10 + 
lST.Text, 'Błąd', mb_OK + MB_ICONSTOP);
         finally
           lST.Free;
           DM.dane.FilterChanges := [rtUnmodified, rtModified, rtInserted];
           DM.ADConnection1.Rollback;
         end;
       end;
   except
     DM.ADConnection1.Rollback;
     MessageBox(Handle, 'Operacja nie powiodła się !!!!', 'Błąd', mb_OK 
+ MB_ICONSTOP);
   end;
end;

PS.
Nie sprawdzałem kodu, może nie działać od ręki...

-- 
wloochacz
Re: Transakcje MSSQL2008, ANYDAC
#82042
Author: wloochacz
Date: Thu, 24 Apr 2014 19:53
129 lines
7447 bytes
W dniu 2014-04-24 21:25, lesioq@o2.pl pisze:
> W dniu czwartek, 24 kwietnia 2014 20:20:13 UTC+2 użytkownik wloochacz napisał:
>> W dniu 2014-04-24 19:35, lesioq@o2.pl pisze:
>>
>>> Szczerze mówiąc to nie mam o tym zielonego pojęcia, bo chyba nigdy nie było mi to potrzebne.
>>
>> Skąd możesz mieć zielone pojęcie o czymś, o czym nie masz pojęcia, że
>>
>> istnieje a tym bardziej co to jest i jak się tego używa?
>>
>
> No właśnie napisałem, że nie mam o tym zielonego pojęcia (czytaj ze zrozumieniem), a chętnie bym się dowiedział.
Podałem wczesnij link do dokumentacji, zajrzałeś?

>>> Nie wiem, może zrobiłem największy błąd mojego życia, że w programach nie używam CachedUpdates,
>>
>>> może w tym przypadku jest to bardzo potrzebne, wręcz bez tego program nie będzie działał - nie wiem.
>>
>> To się dowiedz; przypominam, że w wątku był kod z CahedUpdates -
>>
>> zrobiony niepoprawnie i stawiam na to, że tam jest pies pogrzebany.
>>
>> To nie transkacja nie zwraca błędu, tylko są błędy przy ApplyUpdates - i
>>
>> wtedy będzie tak, jak feniks to opisał - zapisze się część danych
>>
>> (niektóre zmienione rekordy), ta część, która przeszła do bazy bez błedów.
>>
>
> OK, tutaj dziękuję za zwrócenie uwagi i napisanie odpowiedzi.
>
>> Zreszta po co ja to piszę i tak nie rozumiesz o czym mowa.
>>
> Ach... Jest i odpowiedź w Twoim stylu, nie zawiodłem się.
Nie ma jadu, jest tylko odniesienie do "nie mam pojącia, co nie 
przeszkdza mi wyrażac swoje opinie".

>>> Ale napisałem dość sporo programów, większość na MSSQL + T-SQL, wszystkie działają prawidłowo
>>
>>> (lub mają sporadyczne błędy, bo nie da się przewidzieć wszystkiego), szybko, nie ma z nimi żadnych problemów,
>>
>>> nie zawieszają się, bazy zawierają ogromne ilości danych, właściciele są zadowoleni, ich księgowi też,
>>
>>> pracownicy również nie narzekają.
>>
>> Gratuluję; ja ciągle nie mogę napisać jednego...
>>
> Nie wierzę.
Mam w nosie (żeby tylko...) w co wierzysz.

>>> Wyluzuj trochę, bo Twoje (p)odpowiedzi generalnie nic nie wnoszą i rzadko pomagają, a są w stylu:
>>
>>> "ale debile nic nie wiedzą, ja jestem mega-zajebisty, trochę im podpowiem ale tak, żeby dać im jeszcze
>>
>>> raz do zrozumienia, że są kretynami i nie powinni programować, tylko ja się do tego nadaję,
>>
>>> bo programuję w jedyny słuszny sposób, a jak komuś coś nie wychodzi i pyta na grupach to znaczy,
>>
>>> że jest matołkiem i niech szuka dalej, bo od czego są google i w ogóle jak można zadawać tak banalne pytania
>>
>>> i udzielać tak kretyńskich odpowiedzi :-)".
>>
>> Ze swoim podejściem przypominasz mi człowieka z pl.comp.bazy-danych - on
>>
>> też wszystko wie, a to czego nie wie to się domyśla jak działa i to mu
>>
>> wystarcza.
>>
>> OK - gratuluję podejścia, można i tak.
>>
>
> Nie, nie wszystko wiem, szczerze mówiąc zdaję sobie sprawę, że bardzo dużo rzeczy nie wiem, ale gdyby odpowiedzi były normalnie to moja wiedza i innych mogła by być większa, szkoda, że swoją wiedzą nie chcesz się podzielić w odpowiedni sposób, aby było to dla wszystkich zrozumiałe. Zmuszasz do myślenia - to jest OK, ale nie w taki sposób jaki to robisz - czyli w większości obrażasz.
> A wracając, jeśli ktoś o coś pyta, a ja u siebie w programach "mam odpowiedź", to chcę tą wiedzą się podzielić, jeśli robię to źle, lub mógłbym to robić lepiej, to chciałbym, aby to zostało napisane w kulturalny sposób dlaczego moja odpowiedź jest zła i jakie rozwiązanie warto zastosować. Mówię ogólnie, nie dotyczy to tylko tego wątku.
Fajnie, ale nie mam na to czasu i chęci - temat CachedUpdates w 
AnyDAC/FireDAC jest ogrooomny.
Masz ochotę - czytaj dokumentację, pisanie o tym po łebkach mija się z 
celem.

>>> Jak masz z tym problem to nie odpowiadaj, a jeśli chcesz się do czegoś przydać,
>>
>>> to napisz to tak aby faktycznie pomóc i jednocześnie nie ośmieszać pytającego lub/i odpowiadającego,
>>
>>> jeśli uważasz, że pytanie jest banalne lub źle zadane, lub, że wg Ciebie ta odpowiedź jest zła - to napisz dlaczego
>>
>>> coś jest źle, a potem napisz jak powinno być prawidłowo.
>>
>> Napisałem ze wskazaniem gdzie trzeba doczytać - sorry, ale programowanie
>>
>> to też (a może przede wszystkim) umiejętność czytania ze zrozumieniem.
>>
>> No i oczywiście odrobina pomysłu i kupa czasu na testy i kombinowanie...
>>
>> Ale ja nie jestm Arivald (szacun), który ma belferskie ciągoty i ogromną
>>
>> cierpliwość ;-)
>>
>
> A szkoda, bo wiem, że masz ogromną wiedzę i jak pisałem wcześniej, szkoda, że dzielisz się nią w taki a nie inny sposób.
Ja się nią nie dzielę, tylko pluję jadem (jak twierdzisz) i podaję linki 
do dokumentacji.
No, ale jak to sam określiłeś - "te leniwe debile nie zadają sobie trudu 
aby to przeczytać".
Skoro im się nie chce, to dlaczego mi się ma chcieć - przecież to nie ja 
mam z tym problem.

>> Odpowiem tak samo głupowo jak Ty - się nie podoba, to nie czytaj - wrzuć
>> mnie do KFa i po sprawie.
>>
> Nie ma takiej możliwości :-).
>
>>
>>
>>> I tak wiem, że mi odpowiesz w swój sposób ociekający jadem,
>>
>>> bo inaczej nie potrafisz, ale mam to głęboko gdzieś.
>>
>>> I bardzo mi Ciebie żal, bo sam ze sobą bym na Twoim miejscu nie wytrzymał.
>>
>> No popatrz - to podobnie jak z CachedUpdates, skąd możesz wiedzieć o
>>
>> czymś, o czym nie masz pojęcia?
>>
>
> Eh, a Ty w kółko o jednym.
No, bo jak sie nad czymś zatnę to nie ma litości ;-)


-- 
wloochacz
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads