TN042: ODBC Driver Developer zalecenia
[!UWAGA]
Następujące Uwaga techniczna została zaktualizowana, ponieważ najpierw została uwzględniona w dokumentacji online.W rezultacie niektóre procedur i tematów może być nieaktualne lub nieprawidłowe.Najnowsze informacje zaleca się wyszukać temat zainteresowanie Indeks dokumentacji online.
Uwaga ta opisuje wytycznych autorzy sterownika ODBC.Zawiera ogólne wymagania i założenia funkcji ODBC, aby klas MFC bazy danych i różnych szczegółów semantyczne oczekiwane.Wymagany sterownik funkcję obsługi trzy CRecordset Otwórz trybów (forwardOnly, Migawka i dynamiczny) są opisane.
Biblioteka kursorów ODBC firmy
Klas MFC bazy danych przedstawia funkcji użytkownika, że w wielu przypadkach nadanymi funkcji większość sterowników ODBC poziomu 1.Na szczęście Biblioteka kursorów ODBC's warstw samego między klasami baz danych i sterownik i będzie automatycznie znaczna część tej dodatkowej funkcjonalności.
Na przykład większość sterowników 1.0 obsługuje przewijanie do tyłu.Biblioteka kursorów można wykryć, pamięci podręcznej wierszy od kierowcy i przedstawić je na żądanie na wywołania FETCH_PREV w SQLExtendedFetch.
Innym ważnym przykładem zależność biblioteki kursor jest pozycjonowane aktualizacje.Większość sterowników 1.0 również ma pozycjonowane aktualizacje, ale Biblioteka kursorów spowoduje wygenerowanie instrukcji update identyfikujące wiersza docelowego w źródle danych, oparte na jego bieżące wartości buforowanych danych lub wartość buforowanych sygnatury czasowej.
Biblioteka klas nigdy nie wykorzystuje wiele zestawów wierszy.Dlatego kilka SQLSetPos sprawozdania są zawsze stosowane do wiersza 1 zestawu wierszy.
CDatabases
Każdy CDatabase przydziela pojedynczego HDBC.(Jeśli CDatabasena ExecuteSQL jest używana funkcja, HSTMT jest tymczasowo przyznane.) Jeśli wiele CDatabase's są wymagane, wiele HDBCs HENV musi być obsługiwany.
Klasy bazy danych wymaga Biblioteka kursorów.Znalazło to odzwierciedlenie w SQLSetConnections wywołania SQL_ODBC_CURSORS, SQL_CUR_USE_ODBC.
SQLDriverConnect, SQL_DRIVER_COMPLETE jest używana przez CDatabase::Open do ustanowienia połączenia ze źródłem danych.
Sterownik musi obsługiwać SQLGetInfoSQL_ODBC_API_CONFORMANCE > = SQL_OAC_LEVEL1, SQLGetInfoSQL_ODBC_SQL_CONFORMANCE > = SQL_OSC_MINIMUM.
W celu transakcji może być obsługiwany przez CDatabase i zależne zestawy rekordów, SQLGetInfoSQL_CURSOR_COMMIT_BEHAVIOR i SQL_CURSOR_ROLLBACK_BEHAVIOR musi mieć SQL_CR_PRESERVE.W przeciwnym razie próby wykonania kontroli transakcji będą ignorowane.
SQLGetInfoSQL_DATA_SOURCE_READ_ONLY musi być obsługiwany.Jeśli zwraca "Y", zostaną wykonane operacje nie aktualizacji źródła danych.
Jeśli CDatabase jest otwarty tylko do odczytu, aby ustawić źródła danych, odczytać tylko zostanie wykonana próba z SQLSetConnectOptionSQL_ACCESS_MODE, SQL_MODE_READ_ONLY.
Jeśli identyfikatory wymagają cytowanie, te informacje powinny zostać zwrócone z sterownika z SQLGetInfoSQL_IDENTIFIER_QUOTE_CHAR wywołania.
Do debugowania, SQLGetInfo SQL_DBMS_VER i SQL_DBMS_NAME są pobierane ze sterownika.
SQLSetStmtOptionSQL_QUERY_TIMEOUT i SQL_ASYNC_ENABLE może być wywołana dla CDatabasena HDBC.
SQLError może być wywołana z dowolnego lub wszystkich argumentów wartości NULL.
Oczywiście SQLAllocEnv, SQLAllocConnect, funkcja ODBC SQLDisconnect i SQLFreeConnect musi być obsługiwany.
ExecuteSQL
Oprócz alokowanie i zwalnianie czasowego HSTMT, ExecuteSQL wywołania SQLExecDirect, SQLFetch, SQLNumResultCol i SQLMoreResults.SQLCancel może być wywołana dla HSTMT.
GetDatabaseName
SQLGetInfoSQL_DATABASE_NAME zostanie wywołana.
BeginTrans, CommitTrans, wycofywania
SQLSetConnectOptionSQL_AUTOCOMMIT i SQLTransactSQL_COMMIT, SQL_ROLLBACK i SQL_AUTOCOMMIT zostanie wywołana, jeśli transakcja żądań.
CRecordsets
SQLAllocStmt, SQLPrepare, SQLExecute (dla Otwórz i Requery), SQLExecDirect (dla operacji update), SQLFreeStmt musi być obsługiwany.SQLNumResultCols i SQLDescribeCol zostanie wywołana z wyników, ustaw w różnym czasie.
SQLSetParam jest stosowana do wiązania danych parametrów i DATA_AT_EXEC funkcji.
Procedura SQLBindCol używana do rejestracji wyjściowe Lokalizacja magazynów danych kolumny z ODBC.
Dwa SQLGetData połączeń są używane do pobierania SQL_LONG_VARCHAR i SQL_LONG_VARBINARY danych.Pierwsze wywołanie próbuje znaleźć długość całkowita wartość kolumny, wywołując SQLGetData cbMaxValue, 0, ale pcbValue prawidłowy.Jeśli posiada pcbValue SQL_NO_TOTAL, jest wyjątek.W przeciwnym razie HGLOBAL jest przydzielany i innym SQLGetData apel pobrać cały wynik.
Aktualizowanie
Jeśli wymagana jest pesymistycznego blokowania, SQLGetInfoSQL_LOCK_TYPES będą badane.Jeśli SQL_LCK_EXCLUSIVE jest nieobsługiwana, będzie się wyjątek.
Próby aktualizacji CRecordset (Migawka lub dynamiczny) spowoduje, że drugi HSTMT do przydzielenia.Sterowniki, które nie obsługują drugi HSTMT, bibliotece kursorów będzie symulować tej funkcji.Niestety, mogą czasami oznacza to wymuszanie bieżącej kwerendy w pierwszym HSTMT do zakończenia przed przetworzeniem drugi HSTMTna żądanie.
SQLFreeStmtSQL_CLOSE i SQL_RESET_PARAMS i SQLGetCursorName będzie wywoływana podczas operacji update.
Jeśli istnieją CLongBinarys w outputColumns, ODBC's DATA_AT_EXEC musi być obsługiwana funkcjonalność.Obejmuje to zwracanie SQL_NEED_DATA z SQLExecDirect, SQLParamData i SQLPutData.
SQLRowCount jest wywoływana po wykonaniu, aby zweryfikować, że tylko 1 rekord został zaktualizowany przez SQLExecDirect.
Kursory ForwardOnly
Tylko SQLFetch jest wymagane dla przenieść operacji.Należy zauważyć, że forwardOnly kursorów nie obsługują aktualizacji.
Kursory migawki
Funkcja migawki wymaga SQLExtendedFetch wsparcia.Jak wspomniano powyżej, Biblioteka kursorów ODBC wykryje, gdy sterownik nie obsługuje SQLExtendedFetchi zapewniają niezbędne wsparcie, sam.
SQLGetInfo, SQL_SCROLL_OPTIONS musi obsługiwać SQL_SO_STATIC.
Kursory dynamiczny
Poniżej jest minimalna obsługa wymaganych do otwierania dynamiczny zestaw wyników:
SQLGetInfo, SQL_ODBC_VER musi zwracać > "01".
SQLGetInfo, SQL_SCROLL_OPTIONS musi obsługiwać SQL_SO_KEYSET_DRIVEN.
SQLGetInfo, SQL_ROW_UPDATES musi zwracać "Y".
SQLGetInfo, SQL_POSITIONED_UPDATES musi obsługiwać SQL_PS_POSITIONED_DELETE i SQL_PS_POSITIONED_UPDATE.
Ponadto, jeśli wymagana jest pesymistycznego blokowania wywołanie do SQLSetPos irow 1, fRefresh FALSE i stada SQL_LCK_EXCLUSIVE zostaną wprowadzone.