SQL Server용 Microsoft OLE DB 드라이버

OLE DB 드라이버 다운로드

Microsoft OLE DB Driver for SQL Server는 OLE DB의 일부인 독립형 데이터 접근 응용 프로그래밍 인터페이스(API)입니다. 이 시스템은 C 및 C++ 애플리케이션을 Azure SQL Database의 Microsoft SQL 데이터베이스 엔진, Microsoft Fabric, Azure SQL Managed Instance 및 지원되는 SQL Server 버전에 연결합니다. Microsoft는 2018년에 버전 18로 처음 출시했으며, SQL Server 2019(15.x)에 포함시켰습니다.

MSOLEDBSQL19 현재 운전자입니다. 일반적으로 SQL Server Native Client(SNAC)와 하위 호환되며, Windows Data Access Components(Windows DAC, 이전 명칭: Microsoft Data Access Components(MDAC))가 제공하는 SQL Server OLE DB 공급자와 SNAC를 모두 뛰어넘는 기능을 제공합니다.

시작점 선택

Azure SQL 대한 프로덕션 기준

이 코드 조각을 프로덕션 지향 Azure SQL 연결의 시작점으로 사용합니다. 애플리케이션 구성에서 서버 이름과 데이터베이스 이름을 불러오고, 관리 신원으로 인증하여 연결 문자열에 비밀이 나타나지 않게 하며, 완전한 인증서 검증과 함께 Tabular Data Stream(TDS) 8.0 암호화를 지원합니다. 각 시도마다 연결 타임아웃을 설정하고, 일시적인 실패가 발생하면 지수 백오프와 지터를 적용해 재시도합니다.

이 글의 C++ 스니펫에는 간결함을 위해 include, COM 초기화, 그리고 로깅 헬퍼가 생략되어 있습니다.

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 그리고 Connect Retry Interval유휴 연결 복원력을 활성화하여 유휴 중에 끊긴 연결을 투명하게 복원합니다. 초기 연결을 재시도하지 않기 때문에 이 스니펫은 애플리케이션 레벨 재시도도 구현합니다. 둘 다 보관하세요.

이 스니펫은 여기에 표시된 띄어쓰기가 포함된 키워드 이름(예: Use Encryption for DataConnect Retry Count)을 사용하는 IDataInitialize::GetDataSource에 대한 연결 문자열을 작성합니다. IDBInitialize::Initialize와 ADO는 EncryptConnectRetryCount와 같은 동일한 설정에 대해 서로 다른 이름을 사용합니다.

GetDataSource 잘못된 집합에서 이름을 받아도 오류를 발생시키지 않으며, 설정은 절대 작동하지 않습니다. 그 후 연결은 드라이버 기본값을 사용해 약화시킬 수 있습니다. Encrypt=Strict 이 경로에서는 MSOLEDBSQL19에서 암호화가 Mandatory인 상태로 유지되므로, 연결은 TDS 8.0을 사용하지 않게 되고 평문 prelogin 단계에서 암호화를 협상하며, MSOLEDBSQL에서는 암호화가 완전히 꺼진 상태로 유지됩니다. 모든 케이스가 열리지 않는 것은 아닙니다: 잘못된 세트 TrustServerCertificate 도 같은 방식으로 삭제되어 속성이 기본값 false 상태로 유지되고 인증서 검증이 유지됩니다.

오류가 실수를 잡아내줄 거라고 기대하지 마세요. 어떤 집합에도 속하지 않는 이름(예: ZzzNotAKeyword)은 Invalid 연결 문자열 attribute 레코드를 생성하지만, 잘못된 집합에 속한 이름은 아무것도 생성하지 않습니다. 설정이 발동되었는지 확인하려면 연결 전에 속성 내용을 다시 IDBProperties::GetProperties 읽어보세요. 각 API에 포함된 키워드 집합에 대해서는 'OLE DB Driver for SQL Server에서 연결 문자열 키워드 사용하기'를 참조하세요.

OLE DB는 오류 객체만이 아닌 HRESULT 오류 객체를 통해 진단을 보고하므로, 재시도 전에 실패를 분류합니다. 인증이나 설정 오류가 발생하면 재시도 예산 전체를 소모하지 않고 즉시 실패합니다.

이 구성의 각 부분에 대한 자세한 내용은 다음을 참조하세요.

Azure SQL 일시적 오류 목록은 일시적 결함 오류 코드(transient fault error codes)를 참조하세요.

주요 기능

  • Microsoft Entra ID 인증: 관리되는 신원, 서비스 주체, 인터랙티브 및 통합 플로우가 포함된 비밀번호 없는 연결.
  • 엄격한 암호화: TDS 8.0 연결과 완전한 인증서 검증, 그리고 버전 19.2.0 이후 버전의 TLS 1.3.
  • 유휴 연결 복원력: 유휴 상태에서 끊긴 연결을 투명하게 복원하는 기능입니다.
  • 다중 활성 결과 집합(MARS): 연결당 여러 개의 대기 중인 요청.
  • 벌크 복사: 벌크 복사 인터페이스를 사용한 대용량 데이터 삽입.
  • 테이블 값 매개변수: 서버에 단일 매개변수로 전달되는 전체 결과 집합.
  • Always On 가용성 그룹: 빠른 장애 조치를 위한 MultiSubnetFailover 리스너 지원.
  • UTF-8 및 UTF-16 지원: 두 인코딩 모두에서 문자 데이터를 지원합니다.
  • 데이터 분류: 분류된 열의 민감도 메타데이터.
  • 비동기 연산: 비차단 데이터 소스 및 행 집합 연산.

시작하기

Article Description
OLE DB 드라이버 사용 시기 다른 SQL Server 드라이버보다 OLE DB Driver for SQL Server를 언제 선택해야 할까요?
Download 지원되는 모든 드라이버 버전에 대한 설치 프로그램 다운로드가 있습니다.
시스템 요구 사항 지원되는 운영체제, SQL Server 버전, 그리고 먼저 설치해야 할 전제 조건.
건축 응용 헤더와 라이브러리 파일, 설치 레이아웃, 그리고 MDAC에서 업그레이드할 때 변경되는 사항들.
애플리케이션 생성 애플리케이션이 따라가는 호출 순서는 연결부터 명령 실행, 결과 읽기까지입니다.
지원 수명 주기 어떤 드라이버 버전이 지원되는지, 그리고 언제 지원을 종료하는지도 알려주세요.

구성 및 연결

Article Description
연결 문자열 키워드 드라이버가 받아들이는 모든 연결 문자열 키워드와 그 수락값들.
데이터 소스 객체 연결을 구축하는 데이터 소스와 세션 객체를 생성하고 초기화하세요.
드라이버와 함께 ADO 사용 MARS와 같은 Reach 드라이버 기능, 쿼리 알림, 그리고 ADO의 XML 타입 등이 포함됩니다.
고가용성 및 재해 복구 가용성 그룹 리스너와 장애 전환 동작을 제어하는 키워드를 통해 연결하세요.
유휴 연결 복원력 유휴 상태에서 끊긴 연결을 자동으로 복원합니다.
LocalDB 지원 로컬 개발 및 테스트를 위해 LocalDB 인스턴스에 연결하세요.

인증 및 보안

Article Description
Microsoft Entra ID 사용 드라이버가 지원하는 Microsoft Entra 인증 모드는 관리 신원 및 인터랙티브 기능을 포함합니다.
암호화 및 인증서 유효성 검사 Encrypt와 TrustServerCertificate를 설정하고, 서버 인증서의 검증 방식을 제어하세요.
프로그래밍 기반 비밀번호 변경 만료된 비밀번호를 처리하고 새 비밀번호를 설정하면 앱을 떠나지 마세요.
클라이언트 연결에서의 서비스 주체명(SPN) 지원 Kerberos 상호 인증이 성공하도록 연결에서 서비스 주체 이름을 설정하세요.
데이터 분류 사용 SQL Server가 분류된 열에 대해 반환하는 민감도 라벨을 읽어보세요.

명령 실행 및 프로세스 결과

Article Description
명령 ICommand 명령 실행이 구축되는 인터페이스와 명령 객체 모델입니다.
명령어 문법 ODBC SQL, ISO, 그리고 드라이버가 명령어 텍스트에서 허용하는 Transact-SQL 문법의 혼합입니다.
명령 매개변수 명령어 텍스트에 매개변수를 표시하고, 각 드라이버가 지원하는 타입을 바인딩하세요.
다중 활성 결과 집합(MARS) 사용 한 연결에 여러 개의 대기 중인 결과 세트를 열어두세요.
비동기 연산 수행 호출 스레드를 차단하지 않고 작업을 시작하고, 스레드가 끝날 때까지 폴링하거나 기다리세요.
쿼리 알림 작업 서버에서 쿼리 결과가 변경될 때 알림을 받도록 등록하세요.
처리 결과 사용법 기사 저장 프로시저나 함수를 실행하고 반환 코드, 출력 매개변수, 행을 읽는 동작 예제.

로우셋 및 커서 사용하기

Article Description
행 집합체 로셋 인터페이스와 어떤 종류의 로셋을 선택할지 결정하는 속성들입니다.
행 가져오는 중 행을 순차적으로 가져오고, 열 값을 읽고, 행을 해제하는 데 사용 IRowset 하세요.
행셋에서 데이터 업데이트 수정 가능한 rowset을 얻고 해당 잠금을 제어하려면 IRowsetChange 또는 IRowsetUpdate을 요청하세요.
북마크 순차적으로 다시 가져오는 대신 행 위치를 저장해 두었다가 나중에 그 위치로 돌아가세요.
행셋과 SQL Server 커서 드라이버가 기본 결과 집합을 사용하는 경우와 대신 서버 커서를 여는 경우.

대량 복사

Article Description
대량 복사 작업 수행 데이터 파일이나 프로그램 변수를 통해 대량의 행을 테이블로 이동시키거나 빼내는 작업입니다.
IRowsetFastLoad를 이용한 대량 복사 데이터 인터페이스를 이용해 IRowsetFastLoad SQL Server 테이블에 데이터를 대량 복사하세요.
IRowsetFastLoad와 ISequentialStream을 사용하여 BLOB 데이터를 전송하세요 행당 길이가 다양한 BLOB 데이터를 SQL Server로 스트리밍하는 데 사용 IRowsetFastLoad 하세요.

테이블 값 매개 변수

Article Description
테이블 값 매개변수 개요 테이블 값 매개변수가 단일 매개변수로 여러 행의 데이터를 서버에 전달하는 방법입니다.
테이블 값 매개변수 참조 매개변수 행셋 생성 및 매개변수 유형 발견.
테이블 값 매개변수에 데이터 삽입 테이블 값의 매개변수 행을 제공하는 푸시 모델과 풀 모델.
테이블 값 매개변수 사용 테이블 값의 매개변수를 생성하고 그 행을 저장 프로시저에 전달합니다.

대형 및 이진 데이터 작업

Article Description
BLOB와 OLE 객체 ISequentialStream을 통해 BLOB 열을 스트림으로 읽고 씁니다.
대용량 데이터 확보 하나의 바인딩된 버퍼 대신 큰 열 값을 청크 단위로 검색하세요.
대규모 데이터 설정 컨슈머 스토리지 객체에서 서버로 큰 컬럼 값을 전송합니다.
파일스트림 지원 SQL Server나 파일 시스템을 통해 읽을 수 있는 큰 이진 값을 저장하세요.
FILESTREAM 사용법 기사 스트리밍 인터페이스로 FILESTREAM 컬럼을 읽고 쓰는 동작 예제.

테이블, 인덱스, 저장 프로시저를 관리하세요

Article Description
표 및 색인 IIndexDefinitionITableDefinition를 통해 테이블과 인덱스를 생성, 변경 및 삭제합니다.
SQL Server 테이블 생성 열을 정의하고 테이블을 생성하는 호출 ITableDefinition::CreateTable 을 하세요.
SQL Server 인덱스 생성 기존 테이블 IIndexDefinition::CreateIndex에 새로운 인덱스를 정의합니다.
저장 프로시저 ODBC CALL 구문 또는 RPC로 저장된 프로시저를 호출하여 반환 코드와 출력 매개변수를 읽습니다.

데이터 형식

Article Description
데이터 타입 개요 매개변수와 열을 바인딩할 때 SQL Server 타입이 OLE DB 타입에 어떻게 매핑되는지에 대해 알려드립니다.
행셋과 매개변수에서의 데이터 타입 매핑 행셋 열과 명령 매개변수에 대한 전체 타입 매핑 테이블입니다.
큰 값 타입 사용 varchar(max), nvarchar(max), varbinary(max) 타입을 결합하세요.
XML 데이터 타입 사용 XML 문서와 조각을 XML 열에 저장하고 검색할 수 있습니다.
사용자 정의 타입 사용 CLR 사용자 정의 타입을 결합하는데, 드라이버는 타입 메타데이터가 포함된 이진 값으로 노출합니다.
희소 열 지원 NULL 값 저장에 최적화된 희소 열에 대한 드라이버 지원.
UTF-8 지원 UTF-8 서버 콜레이션과 UTF-8 클라이언트 인코딩을 다루세요.
UTF-16 지원 드라이버가 클라이언트 버퍼를 채울 때 서로게이트 쌍을 어떻게 처리하는지.
날짜와 시간 개선 date, time, datetime2, datetimeoffset 타입과 이들이 허용하는 변환 유형을 묶으세요.

Transactions

Article Description
거래 개요 로컬 트랜잭션 지원과 분산 트랜잭션을 위한 Microsoft Distributed Transaction Coordinator.
격리 수준 세션의 격리 수준과 각 레벨이 허용하는 동시성을 설정하세요.
스냅샷 격리 작업 행 버전 관리(row versioning)를 사용해 읽기 동시성을 높이면서도 작가를 차단하지 마세요.
분산 트랜잭션 지원 ITransactionJoin::JoinTransaction를 사용하여 세션을 분산 트랜잭션에 등록하세요.

진단 및 문제 해결

Article Description
오류 드라이버가 고장을 어떻게 보고하는지, 그리고 어떤 인터페이스가 세부 정보를 담고 있는지 확인하세요.
오류 정보 검색 오류 인터페이스를 순회하여 메시지 텍스트, SQLSTATE 및 네이티브 오류 번호를 읽으세요.
확장 이벤트 로그의 진단 정보 액세스 운전자 추적을 켜고 결과적으로 확장된 이벤트 로그를 읽으세요.
알려진 문제 현재 드라이버의 미해결 문제와, 해당하는 경우 우회 방법입니다.
릴리스 노트 각 드라이버 출시에서 바뀐 점, 최신 드라이버부터 시작하세요.

현재 드라이버로 마이그레이션하세요

Microsoft OLE DB 제공자는 SQL Server에 세 세대가 있습니다. 새 애플리케이션과 기존 애플리케이션에는 MSOLEDBSQL19를 사용하고, 기존 연결 문자열도 이에 맞게 전환하세요. OLE DB 공급자는 사용 중단이 해제되어 2018년에 다시 릴리스되었습니다.

Generation 제공자 문자열 상태
Microsoft OLE DB Driver for SQL Server (이 문서) MSOLEDBSQL19, MSOLEDBSQL 지원됨 MSOLEDBSQL19 현재 드라이버이자 신규 개발에 사용할 드라이버입니다.
SQL Server 네이티브 클라이언트 (SNAC) SQLNCLI11, SQLNCLI SQL Server 2022 및 SQL Server Management Studio 19에서 삭제됨. 신규 개발에는 권장되지 않습니다.
Microsoft OLE DB Provider for SQL Server SQLOLEDB Windows Data Access Components에 포함됩니다. 더 이상 유지보수가 안 됩니다. 신규 개발에는 권장되지 않습니다.
Article Description
MSOLEDBSQL 주 버전 차이점 OLE DB 드라이버 19와 버전 18 간의 변경 사항을 설명하며, 암호화 기본값, 속성 유형 변경, 마이그레이션 단계를 포함합니다.
MDAC에서 애플리케이션을 업데이트하기 옛날 SQL Server용 OLE DB Provider와 현재 드라이버 사이에 무엇이 달라졌고, 업데이트 전에 무엇을 확인해야 하는지 궁금합니다.
SQL Server 2005 Native Client에서 애플리케이션 업데이트 SQL Server 2005 (9.x)의 SQL Server 네이티브 클라이언트 이후 OLE DB Driver for SQL Server의 주요 변경 사항입니다.

Reference

Article Description
SQL Server용 OLE DB 드라이버 기능 드라이버별 특성 색인과 각 기능이 문서화된 위치.
OLE DB 프로그래밍 드라이버가 노출하는 COM API 모델과 TDS를 통해 SQL Server와 통신하는 방식입니다.
OLE DB 사용법 기사 작업별로 그룹화된 OLE DB 사용법 기사 색인.
OLE DB 인터페이스 OLE DB 인터페이스와 이 드라이버에서 제공자별 동작을 나타내는 메서드들.
스키마 로셋 지원 제공자별 스키마 행셋 동작, 연결된 서버에서 반환되는 메타데이터 포함.
더 많은 정보 찾기 이 문서 세트 외부의 사양, 샘플, 커뮤니티 자원.