Udostępnij przez


TN042: zalecenia dla deweloperów sterowników ODBC

Uwaga / Notatka

Następująca uwaga techniczna nie została zaktualizowana, ponieważ została po raz pierwszy uwzględniona w dokumentacji online. W związku z tym niektóre procedury i tematy mogą być nieaktualne lub nieprawidłowe. Aby uzyskać najnowsze informacje, zaleca się wyszukanie interesującego tematu w indeksie dokumentacji online.

Niniejsza notatka opisuje wytyczne dla autorów sterowników ODBC. Zawiera on ogólne wymagania i założenia dotyczące funkcji ODBC, które tworzą klasy bazy danych MFC, oraz różne oczekiwane szczegóły semantyczne. Opisano wymagane funkcje sterownika do obsługi trzech CRecordset trybów otwierania (forwardOnly, snapshot i dynaset).

Biblioteka kursorów ODBC

Klasy bazy danych MFC przedstawiają użytkownikowi funkcjonalność, która w wielu przypadkach przekracza funkcjonalność zapewnianą przez większość sterowników ODBC na poziomie 1. Na szczęście biblioteka kursorów ODBC będzie pełniła funkcję warstwy między klasami baz danych a sterownikiem, automatycznie zapewniając wiele z tych dodatkowych funkcji.

Na przykład większość sterowników 1.0 nie obsługuje przewijania do tyłu. Biblioteka kursorów może to wykryć, zapisywać w buforze wiersze ze sterownika i prezentować je zgodnie z żądaniem w wywołaniach FETCH_PREV w SQLExtendedFetch.

Kolejnym ważnym przykładem zależności od biblioteki kursorów są aktualizacje pozycyjne. Większość sterowników 1.0 również nie wspiera aktualizacji z lokalizacją, ale biblioteka kursorów wygeneruje instrukcje aktualizacji, które identyfikują docelowy wiersz w źródle danych na podstawie aktualnych zbuforowanych wartości danych lub buforowanej wartości znacznika czasu.

Biblioteka klas nigdy nie korzysta z wielu zestawów wierszy. W związku z tym kilka instrukcji SQLSetPos jest zawsze stosowanych do wiersza 1 w zestawie wierszy.

Bazy danych C

Każdy CDatabase przydzieli jeden HDBC. (Jeśli używana jest funkcja CDatabase, tymczasowo przydzielany jest ExecuteSQL.) Jeśli więc wymagana jest wielokrotna , należy obsługiwać wiele CDatabase dla HENV.

Klasy baz danych wymagają biblioteki kursorów. Jest to odzwierciedlone w wywołaniu SQLSetConnectionsSQL_ODBC_CURSORS, SQL_CUR_USE_ODBC.

SQLDriverConnect, SQL_DRIVER_COMPLETE służy CDatabase::Open do nawiązywania połączenia ze źródłem danych.

Sterownik musi obsługiwać SQLGetInfo SQL_ODBC_API_CONFORMANCE>= SQL_OAC_LEVEL1, SQLGetInfo SQL_ODBC_SQL_CONFORMANCE>= SQL_OSC_MINIMUM.

Aby transakcje mogły być obsługiwane dla CDatabase i jego zależnych zestawów rekordów SQLGetInfo SQL_CURSOR_COMMIT_BEHAVIOR, SQL_CURSOR_ROLLBACK_BEHAVIOR musi mieć wartość SQL_CR_PRESERVE. W przeciwnym razie próby wykonania kontroli transakcji zostaną zignorowane.

SQLGetInfo SQL_DATA_SOURCE_READ_ONLY musi być obsługiwany. Jeśli zwraca wartość "Y", żadne operacje aktualizacji nie zostaną wykonane w źródle danych.

Jeśli CDatabase zostanie otwarte w trybie tylko do odczytu, zostanie podjęta próba ustawienia źródła danych jako tylko do odczytu przy użyciu SQLSetConnectOption SQL_ACCESS_MODE, SQL_MODE_READ_ONLY.

Jeśli identyfikatory wymagają cudzysłów, te informacje powinny być zwracane ze sterownika za pomocą wywołania SQLGetInfo SQL_IDENTIFIER_QUOTE_CHAR .

Dla celów debugowania SQLGetInfo SQL_DBMS_VERSQL_DBMS_NAME są pobierane ze sterownika.

SQLSetStmtOption SQL_QUERY_TIMEOUT i SQL_ASYNC_ENABLE mogą być wywoływane na obiekcie CDatabaseHDBC.

SQLError może być wywoływana z dowolnym lub wszystkimi argumentami NULL.

Oczywiście, SQLAllocEnv, SQLAllocConnectSQLDisconnect i SQLFreeConnect musi być obsługiwane.

ExecuteSQL

Oprócz przydzielania i zwalniania tymczasowego narzędzia HSTMT wywołuje ExecuteSQL, SQLExecDirect, SQLFetch, SQLNumResultCol i SQLMoreResults. SQLCancel może być wywoływany na HSTMT.

PobierzNazwęBazyDanych

SQLGetInfo SQL_DATABASE_NAME zostanie wywołana.

BeginTrans, CommitTrans, Rollback

SQLSetConnectOption SQL_AUTOCOMMIT i SQLTransact SQL_COMMIT, SQL_ROLLBACK i SQL_AUTOCOMMIT będą wywoływane w przypadku żądań transakcji.

Zestawy CRecordset

SQLAllocStmt, SQLPrepare, SQLExecute (Dla Open i Requery), SQLExecDirect (dla operacji aktualizacji) SQLFreeStmt musi być obsługiwane. SQLNumResultCols i SQLDescribeCol będą wywoływane na zestaw wyników w różnym czasie.

SQLSetParam jest szeroko używany do wiązania danych parametrów oraz funkcjonalności DATA_AT_EXEC.

SQLBindCol jest szeroko używany do rejestrowania lokalizacji przechowywania danych wyjściowych kolumny za pomocą ODBC.

Dwa SQLGetData wywołania służą do pobierania SQL_LONG_VARCHAR i SQL_LONG_VARBINARY danych. Pierwsze wywołanie próbuje znaleźć łączną długość wartości kolumny, wywołując SQLGetData z parametrem cbMaxValue o wartości 0, ale z prawidłowym pcbValue. Jeśli parametr pcbValue przechowuje SQL_NO_TOTAL, zgłaszany jest wyjątek. W przeciwnym razie zostaje przydzielony element HGLOBAL, a kolejne SQLGetData wywołanie wykonywane, aby pobrać cały wynik.

Aktualizowanie

Jeśli zażądano pesymistycznego blokowania, SQLGetInfo SQL_LOCK_TYPES zostanie zapytane. Jeśli SQL_LCK_EXCLUSIVE nie jest obsługiwana, zostanie zgłoszony wyjątek.

Próby zaktualizowania CRecordset (migawki lub zestawu dynamicznych) spowodują przydzielenie drugiego narzędzia HSTMT . W przypadku sterowników, które nie obsługują drugiego narzędzia HSTMT, biblioteka kursorów symuluje tę funkcję. Niestety, czasami może to oznaczać wymuszenie bieżącego zapytania na pierwszym narzędziu HSTMT do ukończenia przed przetworzeniem drugiego żądania HSTMT.

SQLFreeStmt SQL_CLOSE i SQL_RESET_PARAMS i SQLGetCursorName będą wywoływane podczas operacji aktualizacji.

Jeśli w kolumnach wyjściowych istnieją CLongBinarys, funkcja DATA_AT_EXEC ODBC musi być obsługiwana. Obejmuje to zwracanie SQL_NEED_DATA z SQLExecDirect, SQLParamData i SQLPutData.

SQLRowCount jest wywoływana po wykonaniu polecenia w celu sprawdzenia, czy tylko 1 rekord został zaktualizowany przez element SQLExecDirect.

Kursory jednokierunkowe

Do wykonania operacji SQLFetch wymagane jest tylko Move. Pamiętaj, że kursory forwardOnly nie obsługują aktualizacji.

Migawkowe kursory

Funkcjonalność migawki wymaga SQLExtendedFetch obsługi. Jak wspomniano powyżej, biblioteka kursorów ODBC wykryje, gdy sterownik nie obsługuje SQLExtendedFetch, i zapewni niezbędną obsługę.

SQLGetInfoSQL_SCROLL_OPTIONS musi obsługiwać SQL_SO_STATIC.

Kursory dynaset

Poniżej przedstawiono minimalne wsparcie wymagane do otwarcia dynasetu:

SQLGetInfo, SQL_ODBC_VER musi zwrócić > wartość "01".

SQLGetInfo SQL_SCROLL_OPTIONS musi obsługiwać SQL_SO_KEYSET_DRIVEN.

SQLGetInfo, SQL_ROW_UPDATES musi zwrócić wartość "Y".

SQLGetInfo SQL_POSITIONED_UPDATES musi obsługiwać SQL_PS_POSITIONED_DELETE i SQL_PS_POSITIONED_UPDATE.

Ponadto, jeśli zażądano pesymistycznego blokowania, zostanie wykonane wywołanie z SQLSetPos irow 1, fRefresh FALSE i fLock SQL_LCK_EXCLUSIVE .

Zobacz także

Uwagi techniczne według numeru
Uwagi techniczne według kategorii