Opis typów kursorów

pobierz sterownik JDBC

Operacje w relacyjnej bazie danych działają na pełnym zestawie wierszy. Zestaw wierszy zwracanych przez instrukcję SELECT składa się ze wszystkich wierszy spełniających warunki w klauzuli WHERE instrukcji. Ten kompletny zestaw wierszy zwracanych przez instrukcję jest znany jako zestaw wyników. Aplikacje nie zawsze mogą efektywnie pracować z całym zestawem wyników jako jednostką. Te aplikacje wymagają sposobu pracy z jednym wierszem lub małym blokiem wierszy naraz. Kursory są rozszerzeniem zestawów wyników, które zapewniają ten mechanizm.

Kursory rozszerzają przetwarzanie zestawu wyników, wykonując następujące elementy:

  • Zezwalanie na pozycjonowanie w określonych wierszach zestawu wyników.
  • Pobieranie jednego wiersza lub bloku wierszy z bieżącego położenia w zestawie wyników.
  • Obsługa modyfikacji danych w wierszu w bieżącym położeniu w zestawie wyników.
  • Obsługa różnych poziomów widoczności zmian wprowadzonych w danych bazy danych przez innych użytkowników przedstawionych w zestawie wyników.

Uwaga / Notatka

Aby uzyskać pełny opis typów kursorów programu SQL Server, zobacz Typ kursorów.

Specyfikacja JDBC zapewnia obsługę kursorów jednokierunkowych (tylko do przodu) i przewijalnych, które mogą być wrażliwe lub niewrażliwe na zmiany wprowadzone przez inne zadania oraz mogą być tylko do odczytu lub umożliwiające aktualizację. Ta funkcja jest udostępniana przez sterownik JDBC firmy Microsoft dla klasySQL Server SQLServerResultSet .

Uwagi

Sterownik JDBC obsługuje następujący zestaw wyników i typy kursorów wraz z określonymi opcjami zachowania.

Typ zestawu wyników (kursora) Typ kursora programu SQL Server Charakterystyka wybierz metodę buforowanie odpowiedzi
TYPE_FORWARD_ONLY (CONCUR_READ_ONLY) N/A Tylko do przodu, tylko do odczytu bezpośredni pełny

Aplikacja musi wykonać pojedyncze przetwarzanie (forward pass) przez zbiór wyników. Ten tryb jest domyślnym zachowaniem i działa tak samo jak kursor typu TYPE_SS_DIRECT_FORWARD_ONLY. Sterownik odczytuje cały zestaw wyników z serwera do pamięci w czasie wykonywania instrukcji.

Typ zestawu wyników (kursora) Typ kursora programu SQL Server Charakterystyka wybierz metodę buforowanie odpowiedzi
TYPE_FORWARD_ONLY (CONCUR_READ_ONLY) N/A Tylko do przodu, tylko do odczytu bezpośredni adaptacyjny

Aplikacja musi wykonać pojedyncze przetwarzanie (forward pass) przez zbiór wyników. Zachowuje się tak samo jak kursor TYPE_SS_DIRECT_FORWARD_ONLY. Sterownik odczytuje wiersze z serwera, gdy aplikacja żąda ich i minimalizuje użycie pamięci po stronie klienta.

Typ zestawu wyników (kursora) Typ kursora programu SQL Server Charakterystyka wybierz metodę buforowanie odpowiedzi
TYPE_FORWARD_ONLY (CONCUR_READ_ONLY) Szybko do przodu Tylko do przodu, tylko do odczytu kursor N/A

Aplikacja musi wykonać pojedyncze przejście do przodu przez zbiór wyników przy użyciu kursora serwera. Zachowuje się tak samo jak kursor TYPE_SS_SERVER_CURSOR_FORWARD_ONLY.

Wiersze są pobierane z serwera w blokach określonych przez rozmiar pobierania.

Typ zestawu wyników (kursora) Typ kursora programu SQL Server Charakterystyka wybierz metodę buforowanie odpowiedzi
TYLKO_DO_PRZODU (ZGODNY Z AKTUALIZACJĄ) Dynamiczne (tylko do przodu) Jednokierunkowy, aktualizowalny N/A N/A

Aplikacja musi wykonać pojedyncze przejście (przesunięcie do przodu) przez zbiór wyników, aby zaktualizować jeden lub więcej wierszy.

Wiersze są pobierane z serwera w blokach określonych przez rozmiar pobierania.

Domyślnie rozmiar pobierania jest stały, gdy aplikacja wywołuje metodę setFetchSize obiektu SQLServerResultSet .

Uwaga / Notatka

Sterownik JDBC udostępnia funkcję adaptacyjnego buforowania, która umożliwia pobieranie wyników wykonywania instrukcji z programu SQL Server, ponieważ aplikacja ich potrzebuje, a nie wszystkich jednocześnie. Jeśli na przykład aplikacja powinna pobrać duże dane, które są zbyt duże, aby zmieścić się całkowicie w pamięci aplikacji, buforowanie adaptacyjne umożliwia aplikacji klienckiej pobieranie takiej wartości jako strumienia. Domyślne zachowanie sterownika jest "adaptacyjne". Jednak aby uzyskać adaptacyjne buforowanie dla zestawów wyników z możliwością aktualizacji tylko do przodu, aplikacja musi jawnie wywołać metodę setResponseBuffering obiektu SQLServerStatement, podając wartość ciągu "adaptacyjne". Przykładowy kod można znaleźć w temacie Aktualizowanie przykładu dużych danych.

Typ zestawu wyników (kursora) Typ kursora programu SQL Server Charakterystyka wybierz metodę buforowanie odpowiedzi
TYPE_SCROLL_INSENSITIVE Statyczny Przewijany, nieaktualizowalny.

Zewnętrzne aktualizacje, wstawienia i usunięcia wierszy nie są widoczne.
N/A N/A

Aplikacja wymaga migawki bazy danych. Zestaw wyników nie jest aktualizowalny. Obsługiwane są tylko CONCUR_READ_ONLY. Wszystkie inne typy współbieżności spowodują wyjątek w przypadku użycia z tym typem kursora.

Wiersze są pobierane z serwera w blokach określonych przez rozmiar pobierania.

Typ zestawu wyników (kursora) Typ kursora programu SQL Server Charakterystyka wybierz metodę buforowanie odpowiedzi
TYPE_SCROLL_SENSITIVE (CONCUR_READ_ONLY) Zbiór kluczy Przewijany, tylko do odczytu. Aktualizacje wierszy zewnętrznych są widoczne, a usunięcia są wyświetlane jako brakujące dane.

Dodatki wierszy zewnętrznych nie są widoczne.
N/A N/A

Aplikacja musi wyświetlać tylko zmienione dane dla istniejących wierszy.

Wiersze są pobierane z serwera w blokach określonych przez rozmiar pobierania.

Typ zestawu wyników (kursora) Typ kursora programu SQL Server Charakterystyka wybierz metodę buforowanie odpowiedzi
TYPE_SCROLL_SENSITIVE (CONCUR_UPDATABLE, CONCUR_SS_SCROLL_LOCKS, CONCUR_SS_OPTIMISTIC_CC, CONCUR_SS_OPTIMISTIC_CCVAL) Zbiór kluczy Przewijany, aktualizowalny.

Aktualizacje wierszy zewnętrznych i wewnętrznych są widoczne, a usunięcia są wyświetlane jako brakujące dane; wstawki nie są widoczne.
N/A N/A

Aplikacja może zmienić dane w istniejących wierszach przy użyciu obiektu ResultSet. Aplikacja musi również wyświetlać zmiany wierszy wprowadzonych przez inne osoby spoza obiektu ResultSet.

Wiersze są pobierane z serwera w blokach określonych przez rozmiar pobierania.

Typ zestawu wyników (kursora) Typ kursora programu SQL Server Charakterystyka wybierz metodę buforowanie odpowiedzi
TYPE_SS_DIRECT_FORWARD_ONLY N/A Tylko do przodu, tylko do odczytu N/A pełne lub adaptacyjne

Wartość całkowita = 2003. Udostępnia kursor po stronie klienta tylko do odczytu, który jest w pełni buforowany. Nie utworzono kursora serwera.

Obsługiwany jest tylko typ współbieżności CONCUR_READ_ONLY. Wszystkie inne typy współbieżności powodują wyjątek w przypadku użycia z tym typem kursora.

Typ zestawu wyników (kursora) Typ kursora programu SQL Server Charakterystyka wybierz metodę buforowanie odpowiedzi
TYPE_SS_SERVER_CURSOR_FORWARD_ONLY (tylko do przodu, kursor serwera) Szybko do przodu Tylko do przodu N/A N/A

Wartość całkowita = 2004. Szybko uzyskuje dostęp do wszystkich danych przy użyciu kursora serwera. Jest to możliwe do zaktualizowania w przypadku użycia z typem współbieżności CONCUR_UPDATABLE.

Wiersze są pobierane z serwera w blokach określonych przez rozmiar pobierania.

Aby uzyskać adaptacyjne buforowanie dla tego przypadku, aplikacja musi jawnie wywołać metodę setResponseBuffering obiektu SQLServerStatement, podając wartość ciągu "adaptacyjna". Przykładowy kod można znaleźć w temacie Aktualizowanie przykładu dużych danych.

Typ zestawu wyników (kursora) Typ kursora programu SQL Server Charakterystyka wybierz metodę buforowanie odpowiedzi
TYPE_SS_SCROLL_STATIC Statyczny Aktualizacje innych użytkowników nie są odzwierciedlane. N/A N/A

Wartość całkowita = 1004. Aplikacja wymaga migawki bazy danych. Ta opcja jest specyficznym dla SQL Server synonimem dla JDBC TYPE_SCROLL_INSENSITIVE i ma takie samo zachowanie w ustawieniu współbieżności.

Wiersze są pobierane z serwera w blokach określonych przez rozmiar pobierania.

Typ zestawu wyników (kursora) Typ kursora programu SQL Server Charakterystyka wybierz metodę buforowanie odpowiedzi
TYPE_SS_SCROLL_KEYSET (CONCUR_READ_ONLY) Zbiór kluczy Przewijany, tylko do odczytu. Aktualizacje wierszy zewnętrznych są widoczne, a usunięcia są wyświetlane jako brakujące dane.

Dodatki wierszy zewnętrznych nie są widoczne.
N/A N/A

Wartość całkowita = 1005. Aplikacja musi wyświetlać zmienione dane tylko dla istniejących wierszy. Ta opcja jest specyficznym dla SQL Server synonimem TYPE_SCROLL_SENSITIVE JDBC i zachowuje się tak samo w kontekście ustawień współbieżności.

Wiersze są pobierane z serwera w blokach określonych przez rozmiar pobierania.

Typ zestawu wyników (kursora) Typ kursora programu SQL Server Charakterystyka wybierz metodę buforowanie odpowiedzi
TYPE_SS_SCROLL_KEYSET (CONCUR_UPDATABLE, CONCUR_SS_SCROLL_LOCKS, CONCUR_SS_OPTIMISTIC_CC, CONCUR_SS_OPTIMISTIC_CCVAL) Zbiór kluczy Przewijany, aktualizowalny.

Aktualizacje wierszy zewnętrznych i wewnętrznych są widoczne, a usunięcia są wyświetlane jako brakujące dane; wstawki nie są widoczne.
N/A N/A

Wartość całkowita = 1005. Aplikacja musi zmienić dane lub wyświetlić zmienione dane dla istniejących wierszy. Ta opcja jest specyficznym dla SQL Server synonimem TYPE_SCROLL_SENSITIVE JDBC i zachowuje się tak samo w kontekście ustawień współbieżności.

Wiersze są pobierane z serwera w blokach określonych przez rozmiar pobierania.

Typ zestawu wyników (kursora) Typ kursora programu SQL Server Charakterystyka wybierz metodę buforowanie odpowiedzi
TYPE_SS_SCROLL_DYNAMIC (CONCUR_READ_ONLY) Dynamiczny Przewijany, tylko do odczytu.

Zewnętrzne aktualizacje i wstawienia wierszy są widoczne, a usunięcia pojawiają się jako brakujące dane przejściowe w bieżącym buforze pobierającym.
N/A N/A

Wartość całkowita = 1006. Aplikacja musi widzieć zmienione dane dla istniejących wierszy i zobaczyć wstawione i usunięte wiersze w okresie istnienia kursora.

Wiersze są pobierane z serwera w blokach określonych przez rozmiar pobierania.

Typ zestawu wyników (kursora) Typ kursora programu SQL Server Charakterystyka wybierz metodę buforowanie odpowiedzi
TYPE_SS_SCROLL_DYNAMIC (CONCUR_UPDATABLE, CONCUR_SS_SCROLL_LOCKS, CONCUR_SS_OPTIMISTIC_CC, CONCUR_SS_OPTIMISTIC_CCVAL) Dynamiczny Przewijany, aktualizowalny.

Zewnętrzne i wewnętrzne aktualizacje wierszy i wstawiania są widoczne, a usunięcia są wyświetlane jako przejściowe brakujące dane w bieżącym buforze pobierania.
N/A N/A

Wartość całkowita = 1006. Aplikacja może zmienić dane dla istniejących wierszy lub wstawić lub usunąć wiersze przy użyciu obiektu ResultSet. Aplikacja musi również mieć możliwość wyświetlenia zmian, wstawiania i usuwania wprowadzonych przez inne osoby spoza obiektu ResultSet.

Wiersze są pobierane z serwera w blokach określonych przez rozmiar pobierania.

Pozycjonowanie kursora

Kursory TYPE_FORWARD_ONLY, TYPE_SS_DIRECT_FORWARD_ONLY i TYPE_SS_SERVER_CURSOR_FORWARD_ONLY obsługują tylko następną metodę pozycjonowania.

Kursor TYPE_SS_SCROLL_DYNAMIC nie obsługuje metod bezwzględnych i getRow . Metoda bezwzględna może być przybliżona przez kombinację wywołań do pierwszych i względnych metod dla kursorów dynamicznych.

Metoda getRow jest obsługiwana tylko przez kursory TYPE_FORWARD_ONLY, TYPE_SS_DIRECT_FORWARD_ONLY, TYPE_SS_SERVER_CURSOR_FORWARD_ONLY, TYPE_SS_SCROLL_KEYSET i TYPE_SS_SCROLL_STATIC. Metoda getRow ze wszystkimi typami kursorów tylko do przodu zwraca liczbę wierszy odczytanych do tej pory przez kursor.

Uwaga / Notatka

Gdy aplikacja wykonuje nieobsługiwane wywołanie pozycjonowania kursora lub nieobsługiwane wywołanie metody getRow, zostanie zgłoszony wyjątek z komunikatem "Żądana operacja nie jest obsługiwana w przypadku tego typu kursora".

Tylko TYPE_SS_SCROLL_KEYSET i równoważne kursory TYPE_SCROLL_SENSITIVE uwidacznia usunięte wiersze. Jeśli kursor jest umieszczony w usuniętym wierszu, wartości kolumn są niedostępne, a metoda rowDeleted zwraca wartość "true". Wywołania metod <getType> zgłaszają wyjątek z komunikatem "Nie można pobrać wartości z wiersza, który został usunięty". Nie można zaktualizować usuniętych wierszy. Jeśli spróbujesz wywołać metodę typu< aktualizacji>w usuniętym wierszu, zostanie zgłoszony wyjątek z komunikatem "Nie można zaktualizować usuniętego wiersza". Kursor TYPE_SS_SCROLL_DYNAMIC zachowuje się w ten sam sposób, dopóki nie zostanie przeniesiony poza bieżący bufor pobierania.

Kursory do przodu i dynamiczne uwidaczniają usunięte wiersze w podobny sposób, ale tylko wtedy, gdy kursory pozostają dostępne w buforze pobierania. W przypadku kursorów do przodu to zachowanie jest dość proste. W przypadku kursorów dynamicznych problem jest bardziej skomplikowany, gdy wielkość pobierania jest większa niż 1. Aplikacja może przesunąć kursor do przodu i do tyłu w oknie zdefiniowanym przez bufor pobierania, ale usunięty wiersz zniknie, gdy oryginalny bufor pobierania, w którym został zaktualizowany, zostanie pozostawiony. Jeśli aplikacja nie chce widzieć przejściowych usuniętych wierszy przy użyciu kursorów dynamicznych, należy użyć względnego pobierania (0).

Jeśli wartości klucza TYPE_SS_SCROLL_KEYSET lub TYPE_SCROLL_SENSITIVE wiersza kursora są aktualizowane za pomocą kursora, wiersz zachowuje oryginalną pozycję w zestawie wyników, niezależnie od tego, czy zaktualizowany wiersz spełnia kryteria wyboru kursora. Jeśli wiersz został zaktualizowany poza kursorem, usunięty wiersz pojawi się w oryginalnej pozycji wiersza, ale wiersz pojawi się w kursorze tylko wtedy, gdy inny wiersz z nowymi wartościami klucza był obecny w kursorze, ale od tego czasu został usunięty.

W przypadku kursorów dynamicznych zaktualizowane wiersze pozostaną w buforze pobierania, dopóki okno zdefiniowane przez bufor pobierania nie zostanie opuszczone. Zaktualizowane wiersze mogą później pojawiać się ponownie na różnych pozycjach w zestawie wyników lub całkowicie zniknąć. Aplikacje, które muszą unikać przejściowych niespójności w zestawie wyników, powinny używać rozmiaru pobierania 1 (wartość domyślna to 8 wierszy z CONCUR_SS_SCROLL_LOCKS współbieżności i 128 wierszy z innymi współbieżnościami).

Przekształcenie kursora

Program SQL Server może czasami zdecydować się na zaimplementowanie typu kursora innego niż żądany, który jest określany jako niejawna konwersja kursora (lub degradacja kursora).

W programie SQL Server 2000 (8.x), gdy aktualizujesz dane używając zestawu wyników ResultSet.TYPE_SCROLL_SENSITIVE i ResultSet.CONCUR_UPDATABLE, zgłaszany jest wyjątek z komunikatem "Kursor jest tylko do odczytu". Ten wyjątek występuje, ponieważ program SQL Server 2000 (8.x) wykonał niejawną konwersję kursora dla tego zestawu wyników i nie zwrócił żądanego kursora z możliwością aktualizacji.

Aby obejść ten problem, możesz wykonać jedno z następujących rozwiązań:

Aktualizowanie kursora

Aktualizacje w miejscu są obsługiwane dla kursorów, których typ i obsługa współbieżności pozwalają na aktualizacje. Jeśli kursor nie jest umieszczony w wierszu aktualizowalnym w zestawie wyników (nie powiodło się wywołanie metody get<Type), wywołanie metody update>Type<> zgłosi wyjątek z komunikatem "Zestaw wyników nie ma bieżącego wiersza". Specyfikacja JDBC stwierdza, że występuje wyjątek, gdy metoda aktualizacji jest wywoływana dla kolumny kursora, który jest CONCUR_READ_ONLY. W sytuacjach, gdy wiersz nie jest aktualizowalny, na przykład z powodu optymistycznego konfliktu współbieżności, takiego jak konkurująca aktualizacja lub usunięcie, wyjątek może wystąpić dopiero po wywołaniu insertRow, updateRow lub deleteRow.

Po wywołaniu aktualizacji<Type>, do affected column nie można uzyskać dostępu przy użyciu metody get<Type> aż do momentu wywołania updateRow lub cancelRowUpdates. Takie zachowanie unika problemów, gdy kolumna jest aktualizowana używając typu innego niż ten zwracany przez serwer, a kolejne wywołania pobieracza mogą powodować konwersje typów na kliencie, które dają niedokładne wyniki. Wywołania metody get<Type> zgłaszają wyjątek z komunikatem "Nie można uzyskać dostępu do zaktualizowanych kolumn, dopóki nie zostanie wywołana funkcja updateRow() lub cancelRowUpdates().

Uwaga / Notatka

Jeśli metoda updateRow jest wywoływana, gdy nie zaktualizowano żadnych kolumn, sterownik JDBC zgłosi wyjątek z komunikatem "updateRow() wywoływany, gdy nie zaktualizowano żadnych kolumn".

Po wywołaniu metody moveToInsertRow, zostanie zgłoszony wyjątek, jeśli w zestawie wyników zostanie wywołana jakakolwiek metoda inna niż get<Type>, update<Type>, insertRow oraz metody pozycjonowania kursora (w tym moveToCurrentRow). Metoda moveToInsertRow skutecznie umieszcza zestaw wyników w trybie wstawiania, a metody pozycjonowania kursora kończą tryb wstawiania. Względne wywołania pozycjonowania kursora przenoszą kursor względem pozycji, którą zajmował przed wywołaniem metody moveToInsertRow. Po wywołaniu pozycjonowania kursora ostateczna pozycja kursora docelowego staje się nową pozycją kursora.

Jeśli wywołanie pozycjonowania kursora wykonane w trybie wstawiania nie powiedzie się, pozycja kursora po nieudanym wywołaniu jest oryginalną pozycją kursora przed wywołaniem moveToInsetRow. Jeśli funkcja insertRow nie powiedzie się, kursor pozostanie w wierszu wstawiania, a kursor pozostanie w trybie wstawiania.

Kolumny w wierszu wstawionym są początkowo w stanie niezainicjowanym. Wywołania metody update<Type> ustawiają stan kolumny na zainicjowany. Wywołanie metody get<Type> dla niezainicjowanej kolumny zgłasza wyjątek. Wywołanie metody insertRow powoduje, że wszystkie kolumny w wierszu dodawanym są przywracane do stanu niezainicjowanego.

Jeśli jakiekolwiek kolumny są niezainicjowane w momencie wywołania metody insertRow, zostanie wstawiona domyślna wartość kolumny. Jeśli nie ma wartości domyślnej, ale kolumna ma wartość null, zostanie wstawiona wartość NULL. Jeśli nie ma wartości domyślnej i kolumna nie może mieć wartości null, serwer zwróci błąd i zostanie zgłoszony wyjątek.

Uwaga / Notatka

Wywołania metody getRow zwracają wartość 0 w trybie wstawiania.

Sterownik JDBC nie obsługuje aktualizacji umieszczonych ani usuwania. Zgodnie ze specyfikacją JDBC metoda setCursorName nie ma efektu, a metoda getCursorName zgłosi wyjątek, jeśli zostanie wywołany.

Kursory tylko do odczytu i statyczne nigdy nie są aktualizowalne.

Program SQL Server ogranicza kursory serwera do jednego zestawu wyników. Jeśli partia lub procedura składowana zawiera wiele instrukcji, należy użyć kursora klienta tylko do odczytu wskazującego do przodu.