ADO, ODBC, Firebird, FetchAll

0

Witam

Mam kilka pytań, dotyczących konfiguracji TADODataset'a, aby domyślnie nie pobierał on wszystkich rekordów ?

Technologia wygląda tak: Turbo Delphi -> ADO -> ODBC -> Firebird

Używam kursorów po stronie klienta - czy to wyklucza możliwość dociągania rekordów jak się scrolluje po DBGridzie ? Próbowałem ustawiać i CacheSize i MaxRecord, ale obie rzeczy wydają się nie działać. Kombinowałem też z asynchronicznym pobieraniem rekordów (ExecuteOptions). W sumie fajna sprawa, ale tak czy siak (w tle czy w głównym) wątku rekody są dociągane wszystkie.

W moim przypadku, kursory po stronie serwera odpadają (nie pamiętam ale chyba przy tym ODBC to wcale nie chciało działać) poza tym słyszałem że ono zajmują zasoby na serwerze.

Wiem że można robić rozwiązania w stylu, zmuszenie użytkownika do określenia jakichś kryteriów zawężających wynik wyszukiwania, ale chciałbym tego unikąć. W BDE, wszystko działało pięknie ładnie, jak chciałem wszystkie rekordy to FetchAll i już a w ADO ? Jest FetchAll, ale ma on chyba zastosowanie tylko przy clUseServer ?

Można też robić sztuczne zawężanie ilości zwróconych wierszy, poprzez SELECT FIRST 50 * FROM, no ale to rozwiązanie ma dużo oczywistych wad : (

Ktoś kiedyś stoczył batalię z tym tematem ? W sumie trochę mnie to zmartwiło że działa to inaczej niż w BDE.

Swoją drogą, nie dziwię się, że jest robiony FetchAll, jak mam ustawione jakieś sortowanie za pomocą IndexFieldNames - to jest logiczne, że żeby posortować trza zaciągnąć na maszynę wszystko, no ale bez sortowania ?

Zresztą TADODataset nie ma nawet metody FetchAll, ma ją TADOQuery. Ale chyba opisywane zajwisko odnosi się do obu komponentów. Wybrałem TADODataset jak budulec formatek listujących dane, gdyż ma fajne możliwości sortowania (IndexFieldName).

Drugie pytanko, już odnośnie tego asynchronicznego pobierania. Do wyboru są 3/4 opcji: eoAsyncExecute, eoAsyncFetch, eoAsyncFetchNonBlocking w sumie najciekawiej, działa u mnie eoAsyncFetch, bo czas otwarcia zapytanka jest mimimalny, a potem w tle dociąga resztę. Trochę mnie martwi tylko to że czasem po otwarciu zapytanka ustawiam kursor na podany rekord (np który user właśnie skończył edytować w innej formatce). Robię to przy użyciu Locate. No i tak się zastanawiam (nie miałem szansy jeszcze sprawdzić) co będzie jak ten rekord znajdzie się wśród tych dociąganych ? Pewnie jeśli Locate będzie wywołany wcześniej niż asynchroniczne pobranie danych, to zwróci False : ( W każdym razie chodzi mi o inną rzecz. Po ustawieniu jednej z opcji (eoAsyncFetch, eoAsyncExecute), rezultat u mnie jest taki, że dane wyświetlają się w gridzie - OK. Suwak (scroll) jest ustawiony na samej górze - wygląda to jakby zbiór był na początku - faktycznie próba przesunięcia kursora wyżej niczym nie skutkuje - ale ... - jak się zjedzie jeden rekord w dół, to potem już można się cofnąć o więcej rekordów do góry. Wkurzające to jest. Czy taka jest cena asynchronicznego pobierania danych ? Czy jest to jakiś bug w ADO ?

No i trzecie pytanko, śmieszne. Pamiętam że w BDE na poziomie chyba sesji (TSession) była taka opcja jak SQLHourGlass. Czasem było to wkurzające, ale ja akurat chciałbym sobie to włączyć. Czy istnieje odpowiednik tej property w ADO ? Czy pozostaje tylko ręczne zmienianie kursora ?

Z góry dziękuję za wszystkie odpowiedzi
Pozdrawiam

P.S. Oczywiście przed pytanie googlowałem i helpowałem, ale nie znalazłem wyczerpujących wyjaśnień.

0

Cześć
Też mam ten problem, używam ado i chciałbym cała strukture zmiescic w jednym zapytaniu, ale niestety nie wyswietla mi calej struktury, tylko obcina;/
Czy rozwiazal Pan ten problem
Dzieki za info
Pozdrawiam

0

Cześć
Też mam ten problem, używam ado i chciałbym cała strukture zmiescic w jednym zapytaniu, ale niestety nie wyswietla mi calej struktury, tylko obcina;/
Czy rozwiazal Pan ten problem
Dzieki za info
Pozdrawiam

0

Z ADO jest tak że wszystko ładnie działa ale w połączeniu z MS Access lub MS SQL. Kiedyś miałem podobną konfigurację (TD ADO ODBC FB) i uzyskać tego co w BDE był na starcie mi się nie udało. Ale jak poczytasz o kursorach, to przy clUseClient zasze pisze że wszystkie dane są ściągane, więc przy tym trybie inaczej nie pójdzie. Z kolei clUseServer pamiętam że tak sobie działało.

Co do tego Locate, to może się tak zdarzyć że Ci rekordu nie znajdzie, i jest to wysoce prawdopodobne.

Co do SELECT TOP 50 - w sumie wydaje się to głupota, ale z drugiej strony ... Po co użytkownikowi 100 000 rekordów ? Może żeby widzieć podusmowanie - ale tutaj polecam taką opcję, żeby zrobić podsumowanie odrębnym zapytankiem. Najmniej ciekawie robi się jeśli user chce mieć coś w określonej kolejności. Przy opcji FIRST 50, jest kicha bo trzeba by dawać ORDER'y. Podejrzewam że wybrałeś taką technologię bo ma bardzo fajne (szybkie) opcje sortowania po stronie klienta (ja wybrałem ją właśnie dlatego), zaletą też jest to ze unika sie ORDER'ów (z którymi FB czasem radzi sobie średnio wydajnie).

Co do kursora na drugim rekordzie, to pamiętam że tez to u mnie występowało. Taki strasznie upierdliwy problem. Ale może google by coś zaradziły ...

Co do ikonki, to ja to ustawiam z łapy, nie doszukałem się odpowiednika BDE.

Pozdro
b

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