Udostępnij za pośrednictwem


TN042: zalecenia dla deweloperów sterowników ODBC

[!UWAGA]

Następująca uwaga techniczna nie został zaktualizowana od pierwszego uwzględnienia jej w dokumentacji online.W rezultacie niektóre procedury i tematy może być nieaktualne lub nieprawidłowe.Aby uzyskać najnowsze informacje, zaleca się wyszukać temat w indeksie dokumentacji online.

Uwaga ta opisuje wytyczne autorzy sterownika ODBC.Przedstawia on wymagania ogólne i założenia funkcji ODBC, które czynią klasami baz danych MFC i różne oczekiwane informacje semantyczne.Wymagany sterownik funkcji pomagających w trzy CRecordset Otwórz trybów (forwardOnly, Migawka i dynamiczny) są opisane.

Biblioteka kursorów ODBC's

Klasami baz danych MFC przedstawia funkcje użytkownika, że w wielu przypadkach przewyższa funkcji zapewnianych przez większość sterowników ODBC poziom 1.Na szczęście Biblioteka kursorów ODBC firmy będzie sama warstwa między klasami baz danych i sterownik i automatycznie zapewnia wiele z tym dodatkowe funkcje.

Na przykład większość kierowców 1.0 nie obsługują przewijanie do tyłu.Biblioteka kursorów można wykryć i będzie buforować wiersze ze sterownika i przedstawić je zgodnie z żądaniem na wywołania FETCH_PREV w procedury SQLExtendedFetch.

Innym ważnym przykładem uzależnieniu od biblioteki kursor jest pozycjonowane.Większość sterowników 1.0 również nie mają pozycjonowane, ale Biblioteka kursorów spowoduje wygenerowanie instrukcji update, które określają miejsce docelowe wierszy w źródle danych, na podstawie jego bieżące wartości buforowanych danych lub wartość buforowanych sygnatury czasowej.

Biblioteka klas nigdy nie korzysta z wielu zestawów wierszy.W związku z tym, kilka SQLSetPos instrukcje są zawsze stosowane w wierszu 1 zestawu wierszy.

CDatabases

Każdy CDatabase przydziela jeden HDBC. (Jeśli CDatabasew ExecuteSQL funkcja jest używana, HSTMT jest tymczasowo przydzielona.) Tak, jeśli wiele CDatabase's są wymagane, wiele HDBCs na HENV musi być obsługiwany.

Klasy bazy danych wymagają Biblioteka kursorów.Jest to odzwierciedlenie w SQLSetConnections call SQL_ODBC_CURSORS, SQL_CUR_USE_ODBC.

SQLDriverConnect, SQL_DRIVER_COMPLETE jest używana przez CDatabase::Open do nawiązania 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 kolejności dla transakcji mają być obsługiwane dla CDatabase i jego zależne zestawy rekordów, SQLGetInfoSQL_CURSOR_COMMIT_BEHAVIOR i SQL_CURSOR_ROLLBACK_BEHAVIOR musi być SQL_CR_PRESERVE. W przeciwnym razie próby wykonania kontroli transakcji zostaną zignorowane.

SQLGetInfoSQL_DATA_SOURCE_READ_ONLY musi być obsługiwany. Jeśli zwróci "Y", zostaną wykonane operacje nie aktualizacji w źródle danych.

Jeśli CDatabase jest otwarty tylko do odczytu, aby ustawić źródła danych, przeczytaj tylko spowoduje próby z SQLSetConnectOptionSQL_ACCESS_MODE, SQL_MODE_READ_ONLY

Jeśli identyfikatory wymagają, cytując, informacje te powinny być zwrócone ze sterownika z SQLGetInfoSQL_IDENTIFIER_QUOTE_CHAR zadzwonić. 

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 CDatabasew HDBC

SQLError może być wywołana z dowolnego lub wszystkich argumentów wartości NULL.

Oczywiście SQLAllocEnv, SQLAllocConnect, SQLDisconnect i SQLFreeConnect musi być obsługiwany.

ExecuteSQL

Oprócz podziału i zwalnianiu tymczasowego HSTMT, ExecuteSQL wywołania SQLExecDirect, SQLFetch, SQLNumResultCol i SQLMoreResults.SQLCancel może być wywołana dla HSTMT.

GetDatabaseName

SQLGetInfoSQL_DATABASE_NAME zostanie wywołany. 

BeginTrans, CommitTrans, wycofywania

SQLSetConnectOptionSQL_AUTOCOMMIT i SQLTransactSQL_COMMIT, SQL_ROLLBACK i SQL_AUTOCOMMIT zostanie wywołany, jeśli transakcja żądań.  

CRecordsets

SQLAllocStmt, SQLPrepare, SQLExecute (dla Otwórz i Requery), SQLExecDirect (przy aktualizacji), SQLFreeStmt musi być obsługiwany.SQLNumResultCols i SQLDescribeCol zostanie wywołana wyniki zestaw w różnych okresach.

SQLSetParam jest szeroko stosowane do wiązania danych parametru i DATA_AT_EXEC funkcjonalność.

Procedura SQLBindCol jest szeroko stosowane do rejestrowania wyjście lokalizacje przechowywania 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źć całkowitą długość wartości kolumny przez wywołanie SQLGetData cbMaxValue 0, ale z prawidłową pcbValue.Jeśli posiada pcbValue SQL_NO_TOTAL, wyjątek.W przeciwnym razie HGLOBAL została przydzielona i innym SQLGetData rozmowy do pobierania całego wyniku.

Aktualizowanie

Jeśli wymagana jest pesymistycznego blokowania, SQLGetInfoSQL_LOCK_TYPES będą badane. Jeśli SQL_LCK_EXCLUSIVE jest nieobsługiwana, pojawi się wyjątek.

Próby aktualizacji CRecordset (Migawka lub dynamiczny) spowoduje, że drugi HSTMT do przydzielenia.W przypadku sterowników, które nie obsługują drugi HSTMT, bibliotece kursorów będzie symulować tę funkcję.Niestety, czasami oznaczać wymuszanie bieżącej kwerendy na pierwszym HSTMT do zakończenia przed przetworzeniem drugi HSTMTwniosek.

SQLFreeStmtSQL_CLOSE i SQL_RESET_PARAMS i SQLGetCursorName będzie wywoływana podczas operacji update. 

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

SQLRowCount nazywa się po wykonaniu w celu sprawdzenia, czy tylko 1 rekord został zaktualizowany przez SQLExecDirect.

Kursory ForwardOnly

Tylko SQLFetch jest wymagane dla przenieść operacji.Należy zauważyć, że forwardOnly kursory nie obsługują aktualizacji.

Kursory migawka

Funkcja migawki wymaga procedury SQLExtendedFetch obsługi.Jak wspomniano powyżej, Biblioteka kursorów ODBC wykryje sterownik nie obsługuje procedury SQLExtendedFetchi zapewniają niezbędne wsparcie sam.

SQLGetInfo, SQL_SCROLL_OPTIONS musi obsługiwać SQL_SO_STATIC.

Kursory dynamiczny

Poniżej jest minimalna obsługa wymagana do otwarcia 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 numer telefonu, aby SQLSetPos z irow 1, fRefresh wartość FALSE i stada SQL_LCK_EXCLUSIVE zostaną wprowadzone.

Zobacz też

Inne zasoby

Uwagi techniczne według numerów

Uwagi techniczne według kategorii