TN042: zalecenia dla deweloperów sterowników ODBC
Uwaga
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.
W tej notatce opisano wytyczne dotyczące składników zapisywania 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 warstwą między klasami baz danych a sterownikiem i automatycznie zapewni 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ć i buforuje wiersze ze sterownika i przedstawia je zgodnie z żądaniem w FETCH_PREV wywołaniach w pliku SQLExtendedFetch
.
Innym ważnym przykładem zależności biblioteki kursorów jest położenie aktualizacji. Większość sterowników 1.0 również nie ma aktualizacji umieszczonych, ale biblioteka kursorów wygeneruje instrukcje aktualizacji, które identyfikują wiersz docelowy w źródle danych na podstawie bieżących wartości danych w pamięci podręcznej lub buforowanej wartości znacznika czasu.
Biblioteka klas nigdy nie korzysta z wielu zestawów wierszy. W związku z tym kilka SQLSetPos
instrukcji jest zawsze stosowanych do wiersza 1 zestawu wierszy.
Bazy danych C
Każdy CDatabase
przydzieli jeden plik HDBC. (Jeśli CDatabase
funkcja jest ExecuteSQL
używana, przydzielono tymczasowo funkcję HSTMT). Jeśli więc wymagana jest wielokrotna wielokrotna CDatabase
obsługa protokołu HDBCna HENV.
Klasy baz danych wymagają biblioteki kursorów. Jest to odzwierciedlone w SQL_ODBC_CURSORS wywołania SQLSetConnections
, 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
>wartość = SQL_OAC_LEVEL1, SQLGetInfo SQL_ODBC_SQL_CONFORMANCE
>= SQL_OSC_MINIMUM.
Aby transakcje mogły być obsługiwane dla CDatabase
zestawów rekordów SQLGetInfo SQL_CURSOR_COMMIT_BEHAVIOR
zależnych i oraz SQL_CURSOR_ROLLBACK_BEHAVIOR muszą mieć 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.
CDatabase
Jeśli plik readOnly zostanie otwarty, zostanie podjęta próba ustawienia tylko do odczytu źródła danych za pomocą SQLSetConnectOption SQL_ACCESS_MODE
polecenia , 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
.
W celach SQLGetInfo SQL_DBMS_VER
debugowania i SQL_DBMS_NAME są pobierane ze sterownika.
SQLSetStmtOption SQL_QUERY_TIMEOUT
i SQL_ASYNC_ENABLE mogą być wywoływane na CDatabase
HDBC.
SQLError
może być wywoływana z dowolnym lub wszystkimi argumentami o wartości NULL.
Oczywiście, SQLAllocEnv
, SQLAllocConnect
SQLDisconnect
i SQLFreeConnect
musi być obsługiwane.
Executesql
Oprócz przydzielania i zwalniania tymczasowego narzędzia HSTMT wywołania ExecuteSQL
SQLExecDirect
, SQLFetch
SQLNumResultCol
i SQLMoreResults
. SQLCancel
może być wywoływany na HSTMT.
Getdatabasename
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 i Requery
), SQLExecDirect
(w Open
przypadku operacji aktualizacji) SQLFreeStmt
musi być obsługiwana. SQLNumResultCols
i SQLDescribeCol
będzie wywoływany na zestaw wyników w różnym czasie.
SQLSetParam
jest szeroko używany do tworzenia powiązań danych parametrów i DATA_AT_EXEC funkcjonalności.
SQLBindCol
jest szeroko używany do rejestrowania wyjściowych lokalizacji przechowywania danych 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
element cbMaxValue o wartości 0, ale z prawidłową wartością pcbValue. Jeśli parametr pcbValue przechowuje SQL_NO_TOTAL, zgłaszany jest wyjątek. W przeciwnym razie przydzielono element HGLOBAL , a kolejne SQLGetData
wywołanie wykonane w celu pobrania całego wyniku.
Aktualizowanie
Jeśli zażądano pesymistycznego blokowania, SQLGetInfo SQL_LOCK_TYPES
zostanie odpytywane. Jeśli SQL_LCK_EXCLUSIVE nie jest obsługiwana, zostanie zgłoszony wyjątek.
Próby zaktualizowania (migawki lub zestawu dynamicznych) spowodują przydzielenie drugiego narzędzia HSTMT.CRecordset
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 danych wyjściowychColumns istnieją obiekty CLongBinary, funkcja DATA_AT_EXEC ODBC musi być obsługiwana. Obejmuje to zwracanie SQL_NEED_DATA z parametrów SQLExecDirect
i SQLParamData
SQLPutData
.
SQLRowCount
jest wywoływana po wykonaniu polecenia w celu sprawdzenia, czy tylko 1 rekord został zaktualizowany przez element SQLExecDirect
.
Kursory przesyłania dalej
W przypadku Move
operacji wymagane są tylko SQLFetch
te operacje. Pamiętaj, że kursory forwardOnly nie obsługują aktualizacji.
Kursory migawek
Funkcje migawek wymagają SQLExtendedFetch
obsługi. Jak wspomniano powyżej, biblioteka kursorów ODBC wykryje, gdy sterownik nie obsługuje SQLExtendedFetch
elementu i zapewnia niezbędną obsługę.
SQLGetInfo
SQL_SCROLL_OPTIONS musi obsługiwać SQL_SO_STATIC.
Kursory dynaset
Poniżej przedstawiono minimalną obsługę wymaganą do otwarcia zestawu dynamicznych:
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 też
Uwagi techniczne według numerów
Uwagi techniczne według kategorii