Aracılığıyla paylaş


Büyük Veri Alma

Şunlar için geçerlidir:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalitik Platform Sistemi (PDW)Microsoft Fabric'te SQL veritabanı

OLE DB sürücüsünü indirme

Genel olarak, tüketiciler, SQL Server depolama nesnesi için OLE DB Sürücüsü oluşturan kodu, ISequentialStream arayüz işaretçisi aracılığıyla referans verilmeyen verileri işleyen diğer kodlardan ayırmalıdır.

Bu makale, aşağıdaki fonksiyonlarla sunulan işlevselliğe değinmektedir:

  • IRowset:GetData

  • IRow::GetColumns

  • ICommand::Execute

Tüketici, GetNextRows yöntemine çağrıda yalnızca tek bir satır veri getirmelidir; sıralı küme özellik grubundaki DBPROP_ACCESSORDER özelliği ya DBPROPVAL_AO_SEQUENTIAL ya da DBPROPVAL_AO_SEQUENTIALSTORAGEOBJECTS olarak ayarlanmışsa. Bunun nedeni, BLOB verilerinin tamponlanmamasıdır. Eğer DBPROP_ACCESSORDER değeri DBPROPVAL_AO_RANDOM olarak ayarlanmışsa, tüketici GetNextRows'ta birden fazla satır veri getirebilir.

SQL Server için OLE DB Sürücüsü, tüketici tarafından talep edilene kadar SQL Server'dan büyük verileri almaz. Tüketici, tüm kısa verileri tek bir erişime bağlamalı ve gerektiğinde büyük veri değerlerini almak için bir veya daha fazla geçici erişimci kullanmalı.

Example

Bu örnek, tek bir sütundan büyük bir veri değeri alır:

HRESULT GetUnboundData  
    (  
    IRowset* pIRowset,  
    HROW hRow,  
    ULONG nCol,   
    BYTE* pUnboundData  
    )  
    {  
    UINT                cbRow = sizeof(IUnknown*) + sizeof(ULONG);  
    BYTE*               pRow = new BYTE[cbRow];  
  
    DBOBJECT            dbobject;  
  
    IAccessor*          pIAccessor = NULL;  
    HACCESSOR           haccessor;  
  
    DBBINDING           dbbinding;  
    ULONG               ulbindstatus;  
  
    ULONG               dwStatus;  
    ISequentialStream*  pISequentialStream;  
    ULONG               cbRead;  
  
    HRESULT             hr;  
  
    // Set up the DBOBJECT structure.  
    dbobject.dwFlags = STGM_READ;  
    dbobject.iid = IID_ISequentialStream;  
  
    // Create the DBBINDING, requesting a storage-object pointer from  
    // The OLE DB Driver for SQL Server.  
    dbbinding.iOrdinal = nCol;  
    dbbinding.obValue = 0;  
    dbbinding.obStatus = sizeof(IUnknown*);  
    dbbinding.obLength = 0;  
    dbbinding.pTypeInfo = NULL;  
    dbbinding.pObject = &dbobject;  
    dbbinding.pBindExt = NULL;  
    dbbinding.dwPart = DBPART_VALUE | DBPART_STATUS;  
    dbbinding.dwMemOwner = DBMEMOWNER_CLIENTOWNED;  
    dbbinding.eParamIO = DBPARAMIO_NOTPARAM;  
    dbbinding.cbMaxLen = 0;  
    dbbinding.dwFlags = 0;  
    dbbinding.wType = DBTYPE_IUNKNOWN;  
    dbbinding.bPrecision = 0;  
    dbbinding.bScale = 0;  
  
    if (FAILED(hr = pIRowset->  
        QueryInterface(IID_IAccessor, (void**) &pIAccessor)))  
        {  
        // Process QueryInterface failure.  
        return (hr);  
        }  
  
    // Create the accessor.  
    if (FAILED(hr = pIAccessor->CreateAccessor(DBACCESSOR_ROWDATA, 1,  
        &dbbinding, 0, &haccessor, &ulbindstatus)))  
        {  
        // Process error from CreateAccessor.  
        pIAccessor->Release();  
        return (hr);  
        }  
  
    // Read and process BLOCK_SIZE bytes at a time.  
    if (SUCCEEDED(hr = pIRowset->GetData(hRow, haccessor, pRow)))  
        {  
        dwStatus = *((ULONG*) (pRow + dbbinding.obStatus));  
  
        if (dwStatus == DBSTATUS_S_ISNULL)  
            {  
            // Process NULL data  
            }  
        else if (dwStatus == DBSTATUS_S_OK)  
            {  
            pISequentialStream = *((ISequentialStream**)   
                (pRow + dbbinding.obValue));  
  
            do  
                {  
                if (SUCCEEDED(hr =  
                    pISequentialStream->Read(pUnboundData,  
                    BLOCK_SIZE, &cbRead)))  
                    {  
                    pUnboundData += cbRead;  
                    }  
                }  
            while (SUCCEEDED(hr) && cbRead >= BLOCK_SIZE);  
  
            pISequentialStream->Release();  
            }  
        }  
    else  
        {  
        // Process error from GetData.  
        }  
  
    pIAccessor->ReleaseAccessor(haccessor, NULL);  
    pIAccessor->Release();  
    delete [] pRow;  
  
    return (hr);  
    }  

Ayrıca Bkz.

BLOB'lar ve OLE Nesneleri
Büyük Değer Türlerinin Kullanımı