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ń.