BDE Paradox jak sprawdzić połączonych użytkowników

0

Witam
Czy jest możliwość sprawdzenia czy inni użytkownicy są połączeni z bazą (czy też mają włączony program)?
Muszę zablokować funkcję w programie gdy jeden użytkownik kończy pracę w programie ale inni są podłączeni.

0

Co znaczy "zablokować funkcję w programie gdy jeden użytkownik kończy pracę w programie ale inni są podłączeni"?

0

W niektórych bazach się da w niektórych się nie da, ale i tak takie sprawdzenie na nić się nie zda. Bo jak dwóch jednocześnie wychodzi to obaj będą mieli stan że nie są ostatnie. Teoretycznie można to obejść, np zwiększając ustalone pole przy wejściu i zmniejszając go przy wyjściu. Ale to też na nić się nie zda, bo czasami programy się zawieszają oraz czasami ktoś wyłącza komputer przez wyciągnięcie wtyczki z sieci. Napisz co potrzebujesz osiągnąć.

0

Chodzi mi o to że przy zamykaniu programu wywołuję funkcję sprawdzającą i ewentualnie poprawiającą wszystkie rekordy w bazie lecz nie mogę tego zrobić gdy inny uzytkownik kozysta z tej samej bazy w tym samym czasie. Ma tylko wykonać tę funkcję gdy ostatni uzytkownik konczy pracę.

0

Podczas działania programu co powiedzmy 5 sek przy zalogowanym użytkowniku nadpisujesz pole Working typu DateTime, na aktualny czas wg bazy danych (nie komputera użytkownika). Program backup'ujący (czy co tam chcesz sprawdzać) musi działać osobno na osobnym komputerze. W określonych godzinach sprawdzać czy jest jakiś użytkownik który ma Working starszy niż 10 sek temu. Jeżeli nie to blokuje logowanie użytkowników jakimś polem w bazie. Czeka 10 sek i znowu sprawdza Working jeżeli nie ma to może działać. To działa mniej więcej sensownie.

0

Mi na myśl przychodzi tylko sprawdzenie na serwerze, czy są pootwierane sesje. Ale nie wiem, jak to zrobić z poziomu Delphi. Wiem tylko, że serwer bazodanowy takie informacja na pewno posiada. Przykładowo Windows 2003 Server ma to w Start -> Programy -> Narzędzia administracyjne -> Zarządzanie komputerem -> Narzędzia systemowe -> Foldery udostępnione -> Sesje. I tam widać ile który użytkownik ma otwartych plików. Oczywiście jest to miarodajne, jeśli ten serwer jest tylko i wyłącznie dla bazy danych. Może istnieje jakaś metoda, żeby te sesje sprawdzić z poziomu Delphi? Nie wiem.

0

To chyba jakiś paradoks jest ...

0

@Ozi, przecież ci powiedziałem, odpuść sobie takie podejście:

_13th_Dragon napisał(a):

Bo jak dwóch jednocześnie wychodzi to obaj będą mieli stan że nie są ostatnie.
Powiedz którego słowa nie zrozumiałeś.

0

Tak dokładnie niestety to jest paradox
:(

0

przy wykorzystaniu BDE Engine możesz skorzystać z funkcji DbiOpenUserList. Musisz zadeklarować w sekcji uses użycie BDE i DBTables. Przykładowa procedura korzystająca z przykładu ujętego w pliku bde32.hlp:

 
procedure TForm1.Button1Click(Sender: TObject);
var TL : TStringList;
    TmpCursor: hDbiCur;
    rslt: dbiResult;
    UsrDesc: USERDesc;
begin
  Check(DbiInit(nil)); //rozpoczęcie pracy z BDE Engine
  TL := TStringList.Create;
  Check(DbiOpenUserList(TmpCursor));
  repeat
    rslt:= DbiGetNextRecord(TmpCursor, dbiNOLOCK, @UsrDesc, nil);
    if (rslt <> DBIERR_EOF) then begin
      TL.Add('User name: ' + UsrDesc.szUserName);
      TL.Add('Net Session: ' + IntToStr(UsrDesc.iNetSession));
      TL.Add('Product Class: ' + IntToStr (UsrDesc.iProductClass));
    end;
  until (rslt <> DBIERR_NONE);
  Check(DbiCloseCursor(TmpCursor));
  ShowMessage(TL.Text);
  TL.Free; Check(DBIExit()); //zakończenie
end;

Funkcja DbiOpenUserList zwraca listę użytkowników (komputerów) korzystających z BDE, więc jeżeli masz kilka różnych programów pracujących w tym silniku, to może się okazać, że inne połączenia dotyczą nieistotnych z Twojego punktu widzenia tabel. Należy więc jeszcze sprawdzić za pomocą innych funkcji BDE, czy konkretne tabele lub rekordy są używane/zablokowane - jest to opisane z opisanym przeze mnie pliku bde32.hlp

1 użytkowników online, w tym zalogowanych: 0, gości: 1