Ovladač Microsoft OLE DB pro SQL Server

Stáhnout ovladač OLE DB

Microsoft OLE DB Driver for SQL Server je samostatné rozhraní pro programování aplikací (API) pro přístup k datům, které je součástí OLE DB. Propojuje C a C++ aplikace s Microsoft SQL Database Engine v Azure SQL Database, SQL databází v Microsoft Fabric, Azure SQL Managed Instance a v podporovaných verzích SQL Server. Microsoft jej poprvé vydal v roce 2018 jako verzi 18 a zahrnul ji do SQL Server 2019 (15.x).

MSOLEDBSQL19 je současný řidič. Obecně je zpětně kompatibilní se SQL Server Native Client (SNAC) a poskytuje funkce přesahující SNAC i poskytovatele SQL Server OLE DB, které poskytuje Windows Data Access Components (Windows DAC, dříve Microsoft Data Access Components nebo MDAC).

Výběr výchozího bodu

Směrný plán výroby pro Azure SQL

Tento fragment kódu použijte jako výchozí bod pro produkční Azure SQL připojení. Načítá název serveru a název databáze z konfigurace aplikace, autentizuje se spravovanou identitou, aby se v připojovací řetězec neobjevilo žádné tajemství, a umožňuje šifrování Tabular Data Stream (TDS) 8.0 s plnou validací certifikátů. Nastaví časový limit připojení pro každý pokus a při přechodných selháních opakuje pokusy s exponenciálně rostoucí prodlevou a náhodným rozptylem.

Ukázka kódu v jazyce C++ v tomto článku kvůli stručnosti vynechává direktivy #include, inicializaci COM a pomocnou funkci pro protokolování.

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 a Connect Retry Interval umožňují odolnost nečinného připojení, což transparentně obnovuje spojení, které bylo během nečinnosti přerušeno. Nezkoušejí znovu provádět počáteční připojení, proto tento úryvek také implementuje opakované zkoušení na úrovni aplikace. Ponechte si obojí.

Tento úryvek sestavuje připojovací řetězec pro IDataInitialize::GetDataSource, který používá názvy klíčových slov s mezerami uvedené zde, například Use Encryption for Data a Connect Retry Count. IDBInitialize::Initialize a ADO používají pro stejná nastavení různé názvy, například Encrypt a ConnectRetryCount.

GetDataSource přijímá jméno z nesprávné množiny bez vyvolání chyby a nastavení nikdy nezačne fungovat. Připojení pak používá výchozí ovladač, což ho může oslabit. Encrypt=Strict na této cestě ponechává šifrování na Mandatory na MSOLEDBSQL19, takže připojení upustí od TDS 8.0 a vyjedná šifrování v nezašifrované předpřihlašovací fázi, a na MSOLEDBSQL ponechá šifrování zcela vypnuté. Ne každý případ vede k otevřenému selhání: nesprávně nastavená hodnota TrustServerCertificate je stejným způsobem ignorována, takže vlastnost zůstane na výchozí hodnotě false a ověřování certifikátů zůstane zapnuté.

Nespoléhejte na to, že chyba odhalí omyl. Jméno, které nepatří do žádné množiny, například ZzzNotAKeyword, vytváří záznam, Invalid připojovací řetězec attribute ale jméno z nesprávné množiny nevytváří nic. Chcete-li ověřit, že se nastavení projevilo, znovu načtěte hodnotu vlastnosti pomocí IDBProperties::GetProperties před připojením. Sadu klíčových slov, která se používá s jednotlivými rozhraními API, najdete v tématu Použití klíčových slov připojovacího řetězce s ovladačem OLE DB Driver for SQL Server.

OLE DB hlásí diagnostiku přes chybový objekt, nikoli pouze přes samotný HRESULT objekt, takže před opětovným pokusem klasifikuje chyby. Chyba autentizace nebo konfigurace pak okamžitě selže místo toho, aby se spotřeboval celý rozpočet na opakované pokusy.

Další informace o jednotlivých částech této konfigurace najdete tady:

Pro katalog přechodných chyb v Azure SQL viz přechodné chybové kódy.

Klíčové funkce

  • Ověřování Microsoft Entra ID: Bezheslová připojení pomocí spravované identity, instančního objektu služby a interaktivních a integrovaných postupů.
  • Přísné šifrování: Připojení TDS 8.0 s plnou validací certifikátů a TLS 1.3 ve verzi 19.2.0 a novějších.
  • Odolnost nečinného připojení: Transparentní obnovení spojení, které během nečinnosti vypadlo.
  • Více aktivních sad výsledků (MARS): Více než jeden čekající požadavek na jedno spojení.
  • Hromadné kopírování: Vkládání s vysokou propustností prostřednictvím rozhraní pro hromadné kopírování.
  • Parametry s tabulkovými hodnotami: Celá množina výsledků předaná serveru jako jeden parametr.
  • Skupiny dostupnosti Always On: Podpora naslouchače s prvkem MultiSubnetFailover pro rychlé převzetí služeb při selhání.
  • Podpora UTF-8 a UTF-16: Znaková data v obou kódováních.
  • Klasifikace dat: Citlivostní metadata pro klasifikované sloupce.
  • Asynchronní operace: Neblokující operace se zdrojem dat a řádky.

Začínáme

Article Description
Kdy použít ovladač OLE DB Kdy zvolit OLE DB Driver for SQL Server před ostatními ovladači SQL Server.
Stáhnout Instalační soubory ke stažení pro všechny podporované verze ovladačů.
Systémové požadavky Podporované operační systémy, verze SQL Server a předpoklady pro instalaci nejdříve.
Stavební aplikace Hlavičkový a knihovní soubor, rozložení instalace a co se změní při upgradu z MDAC.
Vytvoření aplikace Sekvence volání, kterou aplikace následuje, od připojení přes provedení příkazu až po čtení výsledků.
Životní cyklus podpory Které verze ovladačů jsou podporovány a kdy která z nich ukončí podporu.

Konfigurace a připojení

Article Description
Klíčová slova připojovacího řetězce Každé klíčové slovo připojovací řetězec, které ovladač přijímá, spolu s jeho přijatými hodnotami.
Objekty datového zdroje Vytvořte a inicializujte datový zdroj a objekty relace, ze kterých je spojení postaveno.
Použití ADO s ovladačem Z ADO můžete přistupovat k funkcím ovladače, jako jsou MARS, oznámení dotazů a typ XML.
Vysoká dostupnost a zotavení po havárii Spojte se přes skupinový posluchač dostupnosti a klíčová slova, která řídí chování při failoveru.
Odolnost nečinného spojení Automaticky obnovte připojení, které se během nečinnosti přerušilo.
Podpora LocalDB Připojte se k instanci LocalDB pro lokální vývoj a testování.

Autentizace a zabezpečení

Article Description
Použití Entra ID Microsoft Autentizační režimy Microsoft Entra, které ovladač podporuje, včetně spravované identity a interaktivity.
Šifrování a ověřování certifikátů Nastavte Encrypt a TrustServerCertificate, a kontrolujte, jak je serverový certifikát validován.
Programová změna hesel Vyřiďte vypršené heslo a nastavte si nové, aniž byste opustili svou žádost.
Podpora názvů hlavních služeb (SPN) v klientských připojeních Nastavte název principal služby na spojení, aby vzájemná autentizace Kerberos byla úspěšná.
Použití klasifikace dat Přečtěte si štítky citlivosti, které SQL Server vrací pro klasifikované sloupce.

Spustit příkazy a zpracovat výsledky

Article Description
Příkazy Rozhraní ICommand a objektový model příkazů, na nichž je založeno spouštění příkazů.
Syntaxe příkazů Kombinace ODBC SQL, ISO a Transact-SQL syntaxe, kterou ovladač přijímá v textu příkazu.
Parametry příkazů Označte parametry v textu příkazu a svázajte typy, které ovladač podporuje pro každý z nich.
Použití více aktivních sad výsledků (MARS) Mějte otevřených více než jednu čekající sadu výsledků na jednom připojení.
Provádění asynchronních operací Spusť operaci bez blokování volajícího vlákna a polluj nebo čekej, až skončí.
Práce s dotazovými oznámeními Zaregistrujte se pro upozornění, když se výsledek dotazu na serveru změní.
Články s návody na zpracování výsledků Pracoval jsem na příkladech, které vykonávají uloženou proceduru nebo funkci a čtou zpětné kódy, výstupní parametry a řádky.

Práce s řádkovými sadami a kurzory

Article Description
Množiny řádků Rozhraní pro řádky a vlastnosti, které určují, jaký typ sady řádků získáte.
Načítání řádků Použijte IRowset k postupnému načítání řádků, čtení hodnot sloupců a uvolnění řádků.
Aktualizace dat v řádkových sadách Vyžádejte si IRowsetUpdate nebo IRowsetChange, abyste získali upravitelnou sadu řádků a mohli řídit její zamykání.
Bookmarks Uložte pozici řádku a vraťte se k ní později, místo sekvenčního opětovného načítání.
Řádkové sady a kurzory SQL Server Když ovladač používá výchozí sadu výsledků a když místo toho otevře kurzor serveru.

Hromadné kopírování

Article Description
Provádění hromadných kopírovacích operací Přesouvat velké objemy řádků do nebo z tabulky přes datové soubory nebo programové proměnné.
Hromadné kopírování dat pomocí IRowsetFastLoad Hromadně kopírujte data do tabulky SQL Server pomocí rozhraní IRowsetFastLoad.
Odesílat data z BLOB pomocí IRowsetFastLoad a ISequentialStream Používejte IRowsetFastLoad pro streamování BLOB dat různé délky na řádek do SQL Server.

Parametry s tabulkovými hodnotami

Article Description
Přehled parametrů s tabulkovými hodnotami Jak tabulkové parametry předávají serveru více řádků dat v jednom parametru.
Referenční parametr s tabulkovými hodnotami Vytváření řádků parametrů a objevování typů parametrů.
Vkládání dat do parametrů s tabulkovými hodnotami Push model a pull model pro dodávání řádků parametrů s tabulkovými hodnotami.
Použijte tabulkové parametry Vytvořte parametr s tabulkovou hodnotou a předejte jeho řádky uložené procedurě.

Práce s velkými a binárními daty

Article Description
BLOBy a objekty OLE Čtěte a zapisujte sloupce BLOB ve formě datových proudů pomocí ISequentialStream.
Získání velkých dat Získejte velkou hodnotu sloupce v částech místo jednoho omezeného bufferu.
Nastavení velkého objemu dat Pošlete serveru velkou hodnotu sloupce z uživatelského úložného objektu.
Podpora FILESTREAM Ukládejte velké binární hodnoty, které můžete číst přes SQL Server nebo souborový systém.
Články s návody na FILESTREAM Ukázkové příklady, které čtou a zapisují sloupce typu FILESTREAM pomocí rozhraní pro streamování.

Spravovat tabulky, indexy a uložené procedury

Article Description
Tabulky a rejstříky Vytvářet, upravovat a odstraňovat tabulky a indexy pomocí ITableDefinition a IIndexDefinition.
Vytváření tabulek SQL Server Definujte sloupce a volejte ITableDefinition::CreateTable pro vytvoření tabulky.
Vytváření indexů SQL Server Definujte nový index na existující tabulce s .IIndexDefinition::CreateIndex
Uložené procedury Zavolejte uloženou proceduru se syntaxí ODBC CALL nebo RPC a přečtěte její návratový kód a výstupní parametry.

Datové typy

Article Description
Přehled datových typů Jak se typy v SQL Server mapují na typy OLE DB při vázání parametrů a sloupců.
Mapování datových typů v sadách řádků a parametrech Kompletní tabulka mapování typů pro sloupce řádků a parametry příkazů.
Použití typů velkých hodnot Svázejte typy varchar(max), nvarchar(max) a varbinary (max).
Použití XML datových typů Ukládejte a načítajte XML dokumenty a fragmenty ve sloupci xml.
Použití uživatelsky definovaných typů Svázejte CLR uživatelsky definované typy, které ovladač zpřístupní jako binární hodnoty s metadaty typu.
Podpora řídkých sloupců Podpora ovladačů pro řídké sloupce, které jsou optimalizovány pro ukládání nulových hodnot.
Podpora UTF-8 Pracujte se serverovými kolacemi UTF-8 a klientským kódováním UTF-8.
Podpora UTF-16 Jak ovladač zpracovává náhradní páry, když vyplňuje klientský buffer.
Vylepšení dat a času Svažte typy date, time, datetime2 a datetimeoffset a převody, které umožňují.

Transakce

Article Description
Přehled transakcí Podpora lokálních transakcí a služba MS DTC (Microsoft Distributed Transaction Coordinator) pro distribuované transakce.
Úrovně izolace Nastavte úroveň izolace pro relaci a určete, jakou míru souběžnosti jednotlivé úrovně umožňují.
Práce s izolací snímků Použijte verzování řádků ke zvýšení souběžnosti čtení bez blokování zápisů.
Podpora distribuovaných transakcí Přidruží relaci k distribuované transakci pomocí ITransactionJoin::JoinTransaction.

Diagnostika a řešení potíží

Article Description
Chyby Jak ovladač hlásí selhání a která rozhraní nesou podrobnosti.
Získávání chybových informací Projděte rozhraními pro chyby a načtěte text zprávy, SQLSTATE a nativní číslo chyby.
Přístup k diagnostickým informacím v protokolu rozšířených událostí Zapněte sledování ovladačů a přečtěte si výsledný rozšířený záznam událostí.
Známé problémy Otevřené problémy v aktuálním ovladači, včetně alternativních postupů, pokud existují.
Poznámky k vydání Co se změnilo v každém vydání ovladačů, nejdřív nejnovější.

Migrace na aktuální ovladač

Existují tři generace poskytovatelů Microsoft OLE DB pro SQL Server. Použijte MSOLEDBSQL19 pro nové i stávající aplikace a převádějte na ně stávající spojovací řetězce. Poskytovatel OLE DB přestal být označován jako zastaralý a v roce 2018 byl znovu vydán.

Generace Řetězec poskytovatele Status
Microsoft OLE DB Driver for SQL Server (tento článek) MSOLEDBSQL19, MSOLEDBSQL Podporováno. MSOLEDBSQL19 je aktuální ovladač a ten, který by se měl používat pro nový vývoj.
SQL Server Native Client (SNAC) SQLNCLI11, SQLNCLI Odstraněno ze SQL Server 2022 a SQL Server Management Studio 19. Nedoporučuje se pro nový vývoj.
Microsoft OLE DB Provider for SQL Server SQLOLEDB Dodává se ve Windows Data Access Components. Už není udržován. Nedoporučuje se pro nový vývoj.
Article Description
Hlavní rozdíly ve verzi MSOLEDBSQL Zlomení změn mezi OLE DB Driver 19 a verzí 18, včetně výchozích nastavení šifrování, změn typů vlastností a migračních kroků.
Aktualizace aplikace z MDAC Co se změnilo mezi starým OLE DB Provider pro SQL Server a současným ovladačem a co zkontrolovat před aktualizací?
Aktualizace aplikace z nativního klienta SQL Server 2005 Zásadní změny v OLE DB Driver for SQL Server od verze SQL Server Native Client v SQL Serveru 2005 (9.x).

Reference

Article Description
Ovladač OLE DB pro funkce SQL Serveru Index specifických funkcí pro dané řidiče a kde je každá z nich zdokumentována.
Programování v OLE DB Model API COM, který ovladač zpřístupňuje, a jak komunikuje se SQL Server přes TDS.
Články s návody na OLE DB Index návodů na OLE DB, seskupený podle úkolu.
Rozhraní OLE DB Rozhraní a metody OLE DB, které vykazují chování specifické pro poskytovatele v tomto ovladači.
Podpora řádků schématu Chování řádků schématu specifické pro poskytovatele, včetně metadat vrácených ze propojených serverů.
Hledání dalších informací Specifikace, ukázky a komunitní zdroje mimo tuto dokumentační sadu.