Rejestry diagnostyczne i pola

Dotyczy:sql ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics

Rekordy diagnostyczne są powiązane ze środowiskiem, połączeniem, instrukcjami lub uchwytami deskryptorów ODBC. Gdy dowolna funkcja ODBC wygeneruje kod zwrotny inny niż SQL_SUCCESS lub SQL_INVALID_HANDLE, uchwyt wywoływany przez tę funkcję posiada powiązane rekordy diagnostyczne zawierające komunikaty informacyjne lub błędne. Te rekordy są zatrzymywane do momentu wywołania innej funkcji za pomocą tego uchwytu, po czym są odrzucane. Nie ma ograniczenia co do liczby rekordów diagnostycznych, które mogą być powiązane z uchwytem jednocześnie.

Istnieją dwa typy rekordów diagnostycznych: nagłówek i status. Rekord nagłówkowy to rekord 0; Gdy istnieją rekordy statusu, są to rekordy 1 i nowsze. Rekordy diagnostyczne zawierają różne pola dla rekordu nagłówka i rekordów statusu. Komponenty ODBC mogą również definiować własne pola rekordu diagnostycznego.

Pola w rekordzie nagłówka zawierają ogólne informacje o wykonaniu funkcji, w tym kod powrotu, liczbę wierszy, liczbę rekordów statusu oraz typ wykonywanego polecenia. Rekord nagłówka jest zawsze tworzony, chyba że funkcja ODBC zwraca SQL_INVALID_HANDLE. Pełną listę pól w rekordzie nagłówka można znaleźć w SQLGetDiagField.

Pola w rekordach statusu zawierają informacje o konkretnych błędach lub ostrzeżeniach zwracanych przez Menedżera sterowników ODBC, sterownik lub źródło danych, w tym SQLSTATE, natywny numer błędu, komunikat diagnostyczny, numer kolumny oraz numer wiersza. Rekordy statusu są tworzone tylko wtedy, gdy funkcja zwraca SQL_ERROR, SQL_SUCCESS_WITH_INFO, SQL_NO_DATA, SQL_NEED_DATA lub SQL_STILL_EXECUTING. Pełną listę pól w rekordach statusu można znaleźć w SQLGetDiagField.

SQLGetDiagRec pobiera pojedynczy rekord diagnostyczny wraz z ODBC SQLSTATE, natywnym numerem błędu oraz polami komunikatu diagnostycznego. Ta funkcjonalność jest podobna do ODBC 2. x funkcja SQLError. Najprostsza funkcja obsługi błędów w ODBC 3. x polega na wielokrotnym wywoływaniu SQLGetDiagRec , zaczynając od parametru RecNumber ustawionego na 1 i zwiększając RecNumber o 1, aż SQLGetDiagRec zwróci SQL_NO_DATA. Jest to równoważne ODBC 2. x aplikacja wywołuje SQLError, aż zwróci SQL_NO_DATA_FOUND.

ODBC 3. x obsługuje znacznie więcej informacji diagnostycznych niż ODBC 2. x. Informacje te są przechowywane w dodatkowych polach w rekordach diagnostycznych pobieranych za pomocą SQLGetDiagField.

Sterownik ODBC dla natywnego klienta SQL Server posiada specyficzne dla sterownika pola diagnostyczne, które można pobrać za pomocą SQLGetDiagField. Etykiety dla tych pól specyficznych dla sterowników są zdefiniowane w sqlncli.h. Użyj tych etykiet, aby pobrać stan SQL Server, poziom poważności, nazwę serwera, nazwę procedury oraz numer linii powiązany z każdym rekordem diagnostycznym. Ponadto sqlncli.h zawiera definicje kodów, których sterownik używa do identyfikacji Transact-SQL instrukcji, jeśli aplikacja wywoła SQLGetDiagField z ustawionym DiagIdentifier na SQL_DIAG_DYNAMIC_FUNCTION_CODE.

SQLGetDiagField jest przetwarzany przez Driver Manager ODBC na podstawie informacji o błędach, które buforuje z podstawowego sterownika. Menedżer sterowników ODBC nie zapisuje bufora pól diagnostycznych specyficznych dla sterownika, dopóki połączenie nie zostanie udane. SQLGetDiagField zwraca SQL_ERROR, jeśli zostanie wywołany, aby uzyskać specyficzne dla sterownika pola diagnostyczne przed zakończeniem udanego połączenia. Jeśli funkcja ODBC Connect zwraca SQL_SUCCESS_WITH_INFO, pola diagnostyczne specyficzne dla sterownika dla funkcji connect nie są jeszcze dostępne. Możesz zacząć wywoływać SQLGetDiagField dla specyficznych dla sterownika pól diagnostycznych dopiero po wykonaniu kolejnego wywołania funkcji ODBC po funkcji connect.

Większość błędów zgłaszanych przez sterownik ODBC klienta natywnego klienta SQL Server można skutecznie zdiagnozować, korzystając wyłącznie z informacji zwracanych przez SQLGetDiagRec. W niektórych przypadkach jednak informacje zwracane przez specyficzne dla sterownika pola diagnostyczne są istotne przy diagnozowaniu błędu. Kodując obsługę błędów ODBC dla aplikacji z użyciem sterownika ODBC SQL Server Native Client, warto również użyć SQLGetDiagField do pobierania przynajmniej pól SQL_DIAG_SS_MSGSTATE i SQL_DIAG_SS_SEVERITY specyficznych dla sterownika. Jeśli konkretny błąd może zostać zgłoszony w kilku miejscach w kodzie SQL Server, SQL_DIAG_SS_MSGSTATE wskazuje inżynierowi wsparcia Microsoft, gdzie został zgłoszony, co czasem pomaga w diagnozie problemu.