Udostępnij za pośrednictwem


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 CDatabasefunkcja jest ExecuteSQL używana, przydzielono tymczasowo funkcję HSTMT). Jeśli więc wymagana jest wielokrotna wielokrotna CDatabaseobsł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_MODEpolecenia , 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_TIMEOUTi SQL_ASYNC_ENABLE mogą być wywoływane na CDatabaseHDBC.

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

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

Executesql

Oprócz przydzielania i zwalniania tymczasowego narzędzia HSTMT wywołania ExecuteSQL SQLExecDirect, SQLFetchSQLNumResultCol i SQLMoreResults. SQLCancelmoż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, , SQLPrepareSQLExecute (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 SQLExecDirecti 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 SQLExtendedFetchelementu i zapewnia niezbędną obsługę.

SQLGetInfoSQL_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".

SQLGetInfoSQL_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