Udostępnij przez


SQLSTATE

SqlSTATEs zawierają szczegółowe informacje o przyczynie ostrzeżenia lub błędu. Stany SQLSTATE w tym podręczniku są oparte na tych, które znajdują się w specyfikacji ISO/IEF CLI, chociaż te stany SQLSTATE, które zaczynają się od IM, są specyficzne dla ODBC.

W przeciwieństwie do kodów powrotnych, kody SQLSTATE w tym podręczniku są wytycznymi, a sterowniki nie mają obowiązku ich zwracania. W związku z tym sterowniki powinny zwrócić właściwą wartość SQLSTATE dla dowolnego błędu lub ostrzeżenia, które są w stanie wykryć, ale aplikacje nie powinny liczyć na to, że może się to nie zawsze zdarzać. Przyczyny tej sytuacji są dwojakie:

  • Niekompletność Chociaż w tym podręczniku wymieniono dużą liczbę błędów i ostrzeżeń oraz możliwe przyczyny tych błędów i ostrzeżeń, nie jest ona kompletna i prawdopodobnie nigdy nie będzie; implementacje sterowników po prostu różnią się zbytnio. Każdy dany sterownik prawdopodobnie nie zwróci wszystkich elementów SQLSTATE wymienionych w tym podręczniku i może zwrócić wartości SQLSTATE, które nie zostały wymienione w tym podręczniku.

  • Złożoność Niektóre silniki baz danych — szczególnie relacyjne silniki baz danych — zwracają dosłownie tysiące błędów i ostrzeżeń. Sterowniki dla takich silników raczej nie mapują wszystkich tych błędów i ostrzeżeń na SQLSTATEs ze względu na wymaganą pracę, nieprecyzyjność mapowań, dużą wielkość powstałego kodu oraz jego niską wartość, co często prowadzi do zwracania błędów programowania, które nigdy nie powinny wystąpić podczas czasu wykonywania. W związku z tym sterowniki powinny mapować tyle błędów i ostrzeżeń, co wydaje się uzasadnione i należy zamapować te błędy i ostrzeżenia, na których może być oparta logika aplikacji, na przykład SQLSTATE 01004 (obcięte dane).

Ponieważ wartości SQLSTATE nie są zwracane niezawodnie, większość aplikacji po prostu wyświetla je użytkownikowi wraz ze skojarzonym komunikatem diagnostycznym, który jest często dostosowany do określonego błędu lub ostrzeżenia, które wystąpiło, i natywnego kodu błędu. W ten sposób rzadko dochodzi do utraty funkcjonalności, ponieważ aplikacje nie mogą opierać logiki programowania na większości funkcji SQLSTATE. Załóżmy na przykład, że funkcja SQLExecDirect zwraca wartość SQLSTATE 42000 (błąd składniowy lub naruszenie dostępu). Jeśli instrukcja SQL, która spowodowała ten błąd, jest zakodowana na stałe lub skompilowana przez aplikację, jest to błąd programowania i należy naprawić kod. Jeśli instrukcja SQL zostanie wprowadzona przez użytkownika, jest to błąd użytkownika, a aplikacja wykonała wszystko, co jest możliwe, informując użytkownika o problemie.

Gdy aplikacje opierają podstawową logikę programowania na SQLSTATE, powinny być przygotowane na to, że SQLSTATE nie zostanie zwrócony lub zostanie zwrócony inny SQLSTATE. Dokładne określenie, które stany SQLSTATE są zwracane niezawodnie, można oprzeć tylko na doświadczeniu z wieloma sterownikami. Jednak ogólna zasada mówi, że błędy SQLSTATE występujące w sterowniku lub Menedżerze sterowników, w przeciwieństwie do błędów ze źródła danych, są bardziej niezawodnie zwracane. Na przykład większość sterowników prawdopodobnie zwraca SQLSTATE HYC00 (funkcja opcjonalna nie zaimplementowana), a mniej sterowników prawdopodobnie zwraca SQLSTATE 42021 (kolumna już istnieje).

Poniższe kody SQLSTATE wskazują błędy lub ostrzeżenia czasu wykonywania i są dobrymi kandydatami, na których można oprzeć logikę programowania. Nie ma jednak gwarancji, że wszyscy kierowcy je zwracają.

  • 01004 (Obcięte dane)

  • 01S02 (Zmieniono wartość opcji)

  • HY008 (Operacja anulowana)

  • HYC00 (opcjonalna funkcja nie zaimplementowana)

  • HYT00 (upłynął limit czasu)

Funkcja HYC00 SQLSTATE (opcjonalna funkcja nie zaimplementowana) jest szczególnie istotna, ponieważ jest to jedyny sposób, w jaki aplikacja może określić, czy sterownik obsługuje konkretną instrukcję lub atrybut połączenia.

Aby uzyskać pełną listę funkcji SQLSTATEs i ich zwracanych funkcji, zobacz Dodatek A: Kody błędów ODBC. Aby uzyskać szczegółowe wyjaśnienie warunków, w których każda funkcja może zwrócić określony element SQLSTATE, zobacz tę funkcję.