Sterownik OLE DB firmy Microsoft dla programu SQL Server

pobierz sterownik OLE DB

Microsoft OLE DB Driver for SQL Server to samodzielny interfejs programowania aplikacji (API) do dostępu do danych, będący częścią OLE DB. Łączy aplikacje C i C++ z Microsoft SQL Database Engine w Azure SQL Database, bazą SQL w Microsoft Fabric, Azure SQL Managed Instance oraz w obsługiwanych wersjach SQL Server. Microsoft po raz pierwszy wydał go w 2018 roku jako wersję 18 i dołączył do SQL Server 2019 (15.x).

MSOLEDBSQL19 jest obecnym kierowcą. Zazwyczaj jest kompatybilny wstecznie z SQL Server Native Client (SNAC) i oferuje funkcje wykraczające poza SNAC oraz dostawcę OLE DB SQL Server, który oferuje Windows Data Access Components (Windows DAC, dawniej Microsoft Data Access Components lub MDAC).

Wybieranie punktu początkowego

Plan bazowy produkcji dla Azure SQL

Użyj tego fragmentu kodu jako punktu wyjścia dla połączenia zorientowanego na środowisko produkcyjne Azure SQL. Ładuje nazwę serwera i nazwę bazy danych z konfiguracji aplikacji, uwierzytelnia się za pomocą zarządzanej tożsamości, aby żadna tajemnica nie pojawiała się w parametry połączenia, oraz umożliwia szyfrowanie Tabular Data Stream (TDS) 8.0 z pełną weryfikacją certyfikatów. Ustawia limit czasu dla każdej próby połączenia i ponawia próby w przypadku przejściowych błędów, stosując wykładniczo wydłużany czas ponawiania i losowy rozrzut.

Fragment kodu C++ w tym artykule pomija dyrektywy #include, inicjalizację COM oraz pomocniczą funkcję logowania dla zachowania zwięzłości.

std::wstring BuildConnectionString(const wchar_t* server, const wchar_t* database) {
    std::wstring cs = L"Provider=MSOLEDBSQL19";
    cs += L";Data Source=tcp:"; cs += server; cs += L",1433";
    cs += L";Initial Catalog="; cs += database;
    cs += L";Authentication=ActiveDirectoryMSI";   // managed identity, no stored secret
    cs += L";Use Encryption for Data=Strict";      // TDS 8.0 with certificate validation
    cs += L";Connect Timeout=30";                  // per-attempt connect timeout, in seconds
    cs += L";Connect Retry Count=3";               // idle connection resiliency, not initial connect
    cs += L";Connect Retry Interval=10";
    return cs;
}

// Transient fault codes documented for Azure SQL, plus the resource governance
// codes. Network termination and timeout errors (64, 233, 258, 10053, 10054,
// 10060) are retried a bounded number of times, which is the documented
// guidance for them. 258 is the code the driver reports for a connect timeout.
// 10053 and 10054 can also mean the encryption handshake failed rather than a
// plain network reset, so read the error text before assuming a network fault.
bool IsTransient(LONG nativeError) {
    switch (nativeError) {
        case 615: case 926: case 4060: case 4221:
        case 10928: case 10929: case 10936:
        case 40197: case 40501: case 40613:
        case 42108: case 42109:
        case 49918: case 49919: case 49920:
        case 40020: case 40143: case 40166: case 40540:   // failover subcodes
        case 64: case 233: case 258:
        case 10053: case 10054: case 10060:
            return true;
        default:
            return false;
    }
}

// Retries only errors that a new connection can clear, with exponential backoff
// plus jitter so that concurrent clients don't retry in lockstep.
HRESULT ConnectWithRetry(IDataInitialize* pDataInit, const std::wstring& connectionString,
                         int maxAttempts, IDBInitialize** ppDbInit) {
    HRESULT hr = E_FAIL;
    *ppDbInit = nullptr;
    for (int attempt = 1; attempt <= maxAttempts; ++attempt) {
        IDBInitialize* pDbInit = nullptr;
        hr = pDataInit->GetDataSource(nullptr, CLSCTX_INPROC_SERVER, connectionString.c_str(),
                                      IID_IDBInitialize, reinterpret_cast<IUnknown**>(&pDbInit));
        if (SUCCEEDED(hr) && SUCCEEDED(hr = pDbInit->Initialize())) {
            Log("INFO", "connected on attempt %d/%d", attempt, maxAttempts);
            *ppDbInit = pDbInit;
            return S_OK;
        }

        // Walks IErrorRecords and returns the first record that carries a real
        // SQL Server error number. Transport and timeout failures report a
        // generic wrapper record first, whose native error is 0. Errors the
        // server returns carry the number on the first record.
        LONG native = LogProviderErrors("connect", hr);
        if (pDbInit) pDbInit->Release();
        if (attempt == maxAttempts || !IsTransient(native)) return hr;

        // Cap the backoff at 64 seconds. This also keeps the shift in range
        // when a caller passes a large maxAttempts.
        int shift = (attempt - 1 < 6) ? attempt - 1 : 6;
        DWORD delayMs = (1UL << shift) * 1000UL + (DWORD)(GetTickCount64() % 500);
        Log("WARN", "retrying in %lu ms (attempt %d/%d)", delayMs, attempt + 1, maxAttempts);
        Sleep(delayMs);
    }
    return hr;
}

Connect Retry Count oraz Connect Retry Interval umożliwiają odporność połączenia w stanie bezczynności, co automatycznie przywraca połączenie przerwane w stanie bezczynności. Nie ponawiają początkowej próby połączenia, dlatego ten fragment implementuje także mechanizm ponawiania na poziomie aplikacji. Zachowaj oba.

Ten fragment kodu tworzy swój ciąg połączenia dla IDataInitialize::GetDataSource, który używa nazw słów kluczowych zawierających spacje, pokazanych tutaj, takich jak Use Encryption for Data i Connect Retry Count. IDBInitialize::Initialize a ADO używają różnych nazw dla tych samych ustawień, takich jak Encrypt i ConnectRetryCount.

GetDataSource przyjmuje nazwę z niewłaściwego zbioru, nie zgłaszając błędu, a ustawienie nigdy nie zaczyna obowiązywać. Połączenie wtedy korzysta z domyślnego sterownika, co może je osłabić. Encrypt=Strictna tej ścieżce pozostawia szyfrowanie na Mandatory na MSOLEDBSQL19, więc połączenie rezygnuje z TDS 8.0 i negocjuje szyfrowanie w fazie prelogin przesyłanej otwartym tekstem, a na MSOLEDBSQL pozostawia szyfrowanie całkowicie wyłączone. Nie każdy przypadek kończy się trybem fail-open: nieprawidłowo ustawiona wartość TrustServerCertificate jest odrzucana w ten sam sposób, co pozostawia właściwość przy domyślnej wartości false i pozostawia włączoną walidację certyfikatów.

Nie licz na błąd, który go wykryje. Nazwa, która nie należy do żadnego zbioru, taka jak ZzzNotAKeyword, powoduje utworzenie rekordu Invalid parametry połączenia attribute, ale nazwa z błędnego zbioru nie powoduje utworzenia żadnego rekordu. Aby potwierdzić, że ustawienie zostało zastosowane, odczytaj ponownie właściwość za pomocą IDBProperties::GetProperties przed nawiązaniem połączenia. Informacje o zestawie słów kluczowych używanych z każdym interfejsem API można znaleźć w artykule Using parametry połączenia keywords with OLE DB Driver for SQL Server.

OLE DB zgłasza informacje diagnostyczne za pośrednictwem obiektu błędu, a nie tylko przez samo HRESULT, dlatego przed ponowną próbą sklasyfikuj niepowodzenia. Wtedy błąd uwierzytelniania lub konfiguracji od razu kończy się niepowodzeniem, zamiast wyczerpywać cały limit ponownych prób.

Aby uzyskać więcej informacji na temat każdej części tej konfiguracji, zobacz:

Aby zobaczyć katalog przejściowych błędów Azure SQL, zobacz kody błędów przejściowych.

Kluczowe funkcje

  • Uwierzytelnianie Microsoft Entra ID: połączenia bezhasłowe z zarządzaną tożsamością, zasadą usługi, interaktywnymi i zintegrowanymi przepływami.
  • Ścisłe szyfrowanie: połączenia TDS 8.0 z pełną walidacją certyfikatów oraz TLS 1.3 w wersjach 19.2.0 i nowszych.
  • Odporność połączenia bezczynnego: Przezroczyste przywrócenie połączenia, które zerwało się podczas bezczynności.
  • Wiele aktywnych zestawów wyników (MARS): Więcej niż jedno oczekujące żądanie na połączenie.
  • Kopiowanie zbiorcze: Wstawianie danych z dużą przepustowością za pomocą interfejsów kopiowania zbiorczego.
  • Parametry tabelowe: Cały zbiór wyników przekazywany serwerowi jako jeden parametr.
  • Grupy dostępności Always On: Obsługa listenera z użyciem MultiSubnetFailover w celu szybkiego przełączania awaryjnego.
  • Obsługa UTF-8 i UTF-16: Dane znakowe w obu kodowaniach.
  • Klasyfikacja danych: Metadane wrażliwości dla kolumn klasyfikowanych.
  • Operacje asynchroniczne: Nieblokujące operacje na źródłach danych i zestawach wierszy.

Wprowadzenie

Article Description
Kiedy używać sterownika OLE DB Kiedy wybrać sterownik OLE DB Driver for SQL Server zamiast innych sterowników SQL Server.
Download Pobieranie instalatorów dla każdej obsługiwanej wersji sterownika.
Wymagania systemowe Obsługiwane systemy operacyjne, wersje SQL Server oraz wymagania wstępne do instalacji.
Zastosowania budowlane Pliki nagłówkowe i biblioteczne, układ instalacji oraz to, co zmienia się po aktualizacji z MDAC.
Tworzenie aplikacji Sekwencja wywołań, którą wykonuje aplikacja, od połączenia przez wykonanie polecenia aż po odczyt wyników.
Cykl życia wsparcia Które wersje sterowników są wspierane i kiedy każda z nich kończy wsparcie.

Konfigurowanie i łączenie

Article Description
Słowa kluczowe parametrów połączenia Każde słowo kluczowe ciągu połączenia akceptowane przez sterownik wraz z dopuszczalnymi wartościami.
Obiekty źródła danych Utwórz i inicjalizuj źródło danych i obiekty sesji, z których budowane jest połączenie.
Używanie ADO z driverem Uzyskaj dostęp do funkcji sterownika, takich jak MARS, powiadomienia o zapytaniach oraz typ XML w ADO.
Wysoka dostępność i odzyskiwanie po awarii Połącz się za pomocą detektora grupy dostępności oraz słów kluczowych sterujących zachowaniem przełączania awaryjnego.
Odporność na połączenie bezczynne Automatycznie przywracaj połączenie, które zerwało się podczas bezczynności.
Obsługa LocalDB Połącz się z instancją LocalDB do lokalnego rozwoju i testowania.

Uwierzytelnianie i zabezpieczenie

Article Description
Korzystanie z identyfikatora Entra firmy Microsoft Tryby uwierzytelniania Microsoft Entra obsługiwane przez sterownik, w tym zarządzana tożsamość i interaktywność.
Szyfrowanie i walidacja certyfikatów Ustaw Encrypt i TrustServerCertificate oraz kontroluj sposób walidacji certyfikatu serwera.
Programowa zmiana haseł Zajmij się wygasłym hasłem i ustaw nowe, nie opuszczając aplikacji.
Obsługa nazwy głównej usługi (SPN) w połączeniach klientów Ustaw nazwę głównej usługi na połączeniu, aby wzajemna autentyzacja Kerberos zakończyła się sukcesem.
Używanie klasyfikacji danych Przeczytaj etykiety wrażliwości, które SQL Server zwraca dla kolumn klasyfikowanych.

Wykonaj polecenia i przetwarzaj wyniki

Article Description
Polecenia Interfejs ICommand oraz model obiektów poleceń, na których opiera się wykonywanie poleceń.
Składnia poleceń Mieszanka składni ODBC, ISO i składni Transact-SQL, którą sterownik akceptuje w tekście poleceń.
Parametry poleceń Oznacz parametry w tekście poleceń i powiązaj typy, które sterownik obsługuje dla każdego z nich.
Wykorzystanie wielu aktywnych zbiorów wyników (MARS) Utrzymuj więcej niż jeden otwarty zestaw wyników oczekujących w ramach jednego połączenia.
Wykonywanie operacji asynchronicznych Rozpocznij operację bez blokowania wątku wywołującego i przepytuj lub czekaj, aż się zakończy.
Praca z powiadomieniami zapytań Zarejestruj się na powiadomienie, gdy wynik zapytania zmieni się na serwerze.
Artykuły instruktażowe dotyczące przetwarzania wyników Pracowałem nad przykładami wykonującymi procedurę lub funkcję przechowywaną oraz odczytującymi kody powrotne, parametry wyjściowe i wiersze.

Pracuj z zestawami wierszy i kursorami

Article Description
Zestawy wierszy Interfejsy zestawu wierszy oraz właściwości, które decydują o tym, jaki rodzaj zestawu wierszy otrzymasz.
Pobieranie wierszy Użyj IRowset, aby sekwencyjnie pobierać wiersze, odczytywać wartości kolumn i zwalniać wiersze.
Aktualizacja danych w zestawach wierszy Poproś IRowsetChange lub IRowsetUpdate o zdobycie modyfikowalnego zestawu wiersza i kontroluj jego blokadę.
Bookmarks Zapisz pozycję wiersza i wróć do niej później, zamiast ponownie pobierać ją sekwencyjnie.
Zestawy wierszy i kursory programu SQL Server Kiedy sterownik używa domyślnego zestawu wyników, a kiedy zamiast tego otwiera kursor serwera.

Kopiowanie zbiorcze

Article Description
Wykonywanie operacji kopiowania masowego Przesuwaj duże ilości wierszy do lub z tabeli poprzez pliki danych lub zmienne programowe.
Kopiowanie danych masowo za pomocą IRowsetFastLoad Kopiuj dane masowo do tabeli SQL Server za pomocą interfejsuIRowsetFastLoad.
Wysyłaj dane BLOB za pomocą IRowsetFastLoad i ISequentialStream Użyj IRowsetFastLoad, aby przesyłać strumieniowo dane BLOB o różnej długości w każdym wierszu do programu SQL Server.

Parametry tabelaryczne

Article Description
Przegląd parametrów tabelowych Jak parametry tabelowe przekazują serwerowi wiele wierszy danych w jednym parametrze.
Informacje o parametrze o wartości tabelarycznej Tworzenie wierszy parametrów i odkrywanie typów parametrów.
Wstawianie danych do parametrów o wartościach tabelarycznych Model wypychania i model pobierania do dostarczania wierszy parametrów tabelarycznych.
Użyj parametrów tabelowych Utwórz parametr tabelowy i przekaż jego wiersze do procedury przechowywanej.

Praca z dużymi i binarnymi danymi

Article Description
BLOB-y i obiekty OLE Odczytuj i zapisuj kolumny BLOB jako strumienie za pośrednictwem ISequentialStream.
Pozyskiwanie dużych danych Pobierz dużą wartość kolumny w fragmentach zamiast jednego bufora związanego.
Ustawianie dużych danych Wyślij dużą wartość kolumny do serwera z obiektu pamięci użytkowej.
Wsparcie dla FILESTREAM Przechowuj duże wartości binarne, które możesz odczytać przez SQL Server lub system plików.
Artykuły instruktażowe FILESTREAM Przykłady odczytu i zapisu kolumn FILESTREAM za pomocą interfejsów strumieniowych.

Zarządzaj tabelami, indeksami i procedurami przechowywanymi

Article Description
Tabele i indeksy Twórz, zmieniaj i usuwaj tabele oraz indeksy przez ITableDefinition i IIndexDefinition.
Tworzenie tabel SQL Server Zdefiniuj kolumny i wywołaj wywołanie ITableDefinition::CreateTable , aby utworzyć tabelę.
Tworzenie indeksów SQL Server Zdefiniuj nowy indeks w istniejącej tabeli za pomocą IIndexDefinition::CreateIndex.
Procedury składowane Wywołaj procedurę przechowywaną z składnią ODBC CALL lub RPC i odczytuj jej kod zwrotny oraz parametry wyjściowe.

Typy danych

Article Description
Przegląd typów danych Jak typy SQL Server odwzorowują się na typy OLE DB podczas wiązania parametrów i kolumn.
Mapowanie typów danych w wierszach i parametrach Pełna tabela mapowania typów dla kolumn wierszy i parametrów poleceń.
Używanie typów dużych wartości Zwiąż typy varchar(max), nvarchar(max) i varbinary(max).
Wykorzystanie typów danych XML Przechowywanie i pobieranie dokumentów oraz fragmentów XML w kolumnie xml.
Używanie typów zdefiniowanych przez użytkownika Powiąż typy CLR zdefiniowane przez użytkownika, które sterownik udostępnia jako wartości binarne z metadanymi typu.
Wsparcie rzadkich kolumn Obsługa sterowników dla kolumn rzadkich, które są zoptymalizowane pod kątem przechowywania wartości NULL.
Obsługa protokołu UTF-8 Pracuj z kolacjami serwerów UTF-8 oraz kodowaniem klienta UTF-8.
Wsparcie UTF-16 Jak sterownik obsługuje pary zastępcze podczas wypełniania buforu po stronie klienta.
Ulepszenia dotyczące daty i czasu Powiąż typy date, time, datetime2 i datetimeoffset oraz konwersje, na które zezwalają.

Transactions

Article Description
Przegląd transakcji Wsparcie dla lokalnych transakcji oraz Microsoft Distributed Transaction Coordinator dla transakcji rozproszonych.
Poziomy izolacji Ustaw poziom izolacji dla sesji oraz poziom współbieżności dozwolony przez każdy poziom.
Praca z izolacją migawek Użyj wersjonowania wierszy, aby zwiększyć współbieżność operacji odczytu bez blokowania operacji zapisu.
Wsparcie dla transakcji rozproszonych Dołącz sesję do transakcji rozproszonej za pomocą ITransactionJoin::JoinTransaction.

Diagnozowanie i rozwiązywanie problemów

Article Description
Błędy Jak sterownik zgłasza awarie i które interfejsy zawierają szczegóły.
Pobieranie informacji o błędzie Przejrzyj interfejsy błędów, aby odczytać treść komunikatu, SQLSTATE i macierzysty numer błędu.
Uzyskiwanie dostępu do informacji diagnostycznych w dzienniku zdarzeń rozszerzonych Włącz śledzenie sterownika i odczytaj wynikowy rozszerzony dziennik zdarzeń.
Znane problemy Nierozwiązane problemy w aktualnym sterowniku wraz z obejściami, jeśli są dostępne.
Informacje o wydaniu Co zmieniło się w każdym wydaniu sterowników, najnowsze najpierw.

Migracja do aktualnego sterownika

Istnieją trzy generacje dostawców Microsoft OLE DB dla SQL Server. Używaj MSOLEDBSQL19 dla nowych i istniejących aplikacji oraz konwertuj istniejące ciągi połączeń na nie. Dostawca OLE DB został przywrócony i ponownie udostępniony w 2018 roku.

Generation Ciąg dostawcy Status
Microsoft OLE DB Driver for SQL Server (ten artykuł) MSOLEDBSQL19, MSOLEDBSQL Supported. MSOLEDBSQL19 jest obecnym czynnikiem napędowym i tym, którego należy wykorzystać przy nowych inwestycjach.
Natywny klient SQL Server (SNAC) SQLNCLI11, SQLNCLI Usunięto z SQL Server 2022 oraz SQL Server Management Studio 19. Nie jest zalecane do nowych projektów.
Microsoft OLE DB Provider for SQL Server SQLOLEDB Wchodzi w skład Windows Data Access Components. Nie jest już utrzymywany. Nie jest zalecane w nowych projektach.
Article Description
Różnice wersji głównej bazy danych MSOLEDBSQL Niezgodności między sterownikiem OLE DB Driver 19 a wersją 18, w tym domyślne ustawienia szyfrowania, zmiany typów właściwości oraz kroki migracji.
Aktualizacja aplikacji z MDAC Co się zmieniło między starym OLE DB Provider dla SQL Server a obecnym sterownikiem i co sprawdzić przed aktualizacją?
Aktualizacja aplikacji z SQL Server 2005 Native Client Przełomowe zmiany w OLE DB Driver for SQL Server od czasu SQL Server Native Client in SQL Server 2005 (9.x).

Reference

Article Description
Sterownik OLE DB dla funkcji programu SQL Server Indeks cech specyficznych dla kierowców oraz miejsca, gdzie każda z nich jest udokumentowana.
Programowanie w OLE DB Model API COM, który udostępnia sterownik, oraz sposób, w jaki komunikuje się z SQL Server przez TDS.
Artykuły instruktażowe OLE DB Indeks artykułów instruktażowych OLE DB, pogrupowanych według zadań.
Interfejsy OLE DB Interfejsy i metody OLE DB, które wykazują specyficzne dla dostawcy zachowanie w tym sterowniku.
Wsparcie dla wierszy w zbiorach schematów Zachowanie wiersza schematu specyficznego dla dostawcy usługi, w tym metadane zwracane z połączonych serwerów.
Szukanie więcej informacji Specyfikacje, przykłady i zasoby społeczności poza tym zestawem dokumentacji.