Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Şunlar için geçerlidir:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analitik Platform Sistemi (PDW)
Microsoft Fabric'te SQL veritabanı
OLE DB sürücüsünü indirme
Bu örnek, mevcut veri kaynaklarını listelemek için enumerator nesnesinin nasıl kullanılacağını gösterir.
MSOLEDBSQL enumerator'a görünebilen veri kaynaklarını listelemek için tüketici ISourcesRowset::GetSourcesRowset metodunu çağırır. Bu yöntem, şu anda görünür veri kaynakları hakkında bir sıra bilgi seti döndürür.
Kullanılan ağ kütüphanesine bağlı olarak, veri kaynakları için uygun alan aranır. Adlandırılmış borular için, istemcinin giriş yaptığı alan sınırıdır. AppleTalk için varsayılan bölge olarak kullanılır. SPX/IPX için, bindery'de bulunan SQL Server kurulumlarının listesidir. Banyan VINES için, yerel ağda bulunan SQL Server kurulumlarıdır. Çok protokollü ve TCP/IP soketleri desteklenmez.
Sunucu kapalı veya açık olduğunda, bu alanlardaki bilgileri güncellemek birkaç dakika sürebilir.
Bu makaledeki kod örnekleri, AdventureWorks2025 giriş sayfasından indirebileceğiniz AdventureWorksDW2025 veya örnek veritabanını kullanır.
Önemli
Mümkün olduğunda Windows Kimlik Doğrulama'yı kullanın. Windows Kimlik Doğrulaması mevcut değilse, kullanıcılardan çalışma zamanında kimlik bilgilerini girmelerini söyle. Kimlik bilgilerini dosyada saklamaktan kaçının. Kimlik bilgilerini kalıcı olarak saklamak zorundaysanız, onları Win32 kripto API'si ile şifrelemelisiniz.
OLE DB veri kaynaklarını saymak için
ISourceRowset::GetSourcesRowset çağırarak kaynak satırını alın.
Enumerator satır kümesinin açıklamasını GetColumnInfo::IColumnInfo adresini çağırarak bulabilirsiniz.
Sütun bilgisinden bağlama yapılarını oluşturun.
IAccessor::CreateAccessor çağırarak satır kümesi erişimcisi oluşturun.
IRowset::GetNextRows'u çağırarak satır görüntülerini getirin.
IRowset::GetData çağırarak satır kümesinin kopyasından veri alın ve işleyin.
Example
ole32.lib ile derleyin ve aşağıdaki C++ kod listesini çalıştırın. Bu uygulama, bilgisayarınızın varsayılan SQL Server örneğine bağlanır. Bazı Windows işletim sistemlerinde, SQL Server örneğinizin adını (localhost) veya (local) olarak değiştirmeniz gerekir. Adlandırılmış bir örneke bağlanmak için, bağlantı dizisini L"(local)"'dan L"(local)\\name"'ye değiştirin; burada isim adlandırılmış örnektir. Varsayılan olarak, SQL Server Express adlandırılmış bir instance'a yüklenir. INCLUDE ortam değişkeninizin msoledbsql.h içeren dizini içerdiğinden emin olun.
// compile with: ole32.lib
#define UNICODE
#define _UNICODE
#define DBINITCONSTANTS
#define INITGUID
#define OLEDBVER 0x0250 // to include correct interfaces
#include <windows.h>
#include <stddef.h>
#include <oledb.h>
#include <oledberr.h>
#include <msoledbsql.h>
#include <stdio.h>
#define NUMROWS_CHUNK 5
// AdjustLen supports binding on four-byte boundaries.
_inline DBLENGTH AdjustLen(DBLENGTH cb) {
return ( (cb + 3) & ~3 );
}
// Get the characteristics of the rowset (the IColumnsInfo interface).
HRESULT GetColumnInfo ( IRowset* pIRowset,
DBORDINAL* pnCols,
DBCOLUMNINFO** ppColumnsInfo,
OLECHAR** ppColumnStrings ) {
IColumnsInfo* pIColumnsInfo;
HRESULT hr;
*pnCols = 0;
if (FAILED(pIRowset->QueryInterface(IID_IColumnsInfo, (void**) &pIColumnsInfo)))
return (E_FAIL);
hr = pIColumnsInfo->GetColumnInfo(pnCols, ppColumnsInfo, ppColumnStrings);
if (FAILED(hr)) {} /* Process error */
pIColumnsInfo->Release();
return (hr);
}
// Create binding structures from column information. Binding structures
// will be used to create an accessor that allows row value retrieval.
void CreateDBBindings ( DBORDINAL nCols,
DBCOLUMNINFO* pColumnsInfo,
DBBINDING** ppDBBindings,
BYTE** ppRowValues ) {
ULONG nCol;
DBLENGTH cbRow = 0;
DBLENGTH cbCol;
DBBINDING* pDBBindings;
BYTE* pRowValues;
pDBBindings = new DBBINDING[nCols];
if (!(pDBBindings /* = new DBBINDING[nCols] */ ))
return;
for ( nCol = 0 ; nCol < nCols ; nCol++ ) {
pDBBindings[nCol].iOrdinal = nCol + 1;
pDBBindings[nCol].pTypeInfo = NULL;
pDBBindings[nCol].pObject = NULL;
pDBBindings[nCol].pBindExt = NULL;
pDBBindings[nCol].dwPart = DBPART_VALUE;
pDBBindings[nCol].dwMemOwner = DBMEMOWNER_CLIENTOWNED;
pDBBindings[nCol].eParamIO = DBPARAMIO_NOTPARAM;
pDBBindings[nCol].dwFlags = 0;
pDBBindings[nCol].wType = pColumnsInfo[nCol].wType;
pDBBindings[nCol].bPrecision = pColumnsInfo[nCol].bPrecision;
pDBBindings[nCol].bScale = pColumnsInfo[nCol].bScale;
cbCol = pColumnsInfo[nCol].ulColumnSize;
switch (pColumnsInfo[nCol].wType) {
case DBTYPE_STR: {
cbCol += 1;
break;
}
case DBTYPE_WSTR: {
cbCol = (cbCol + 1) * sizeof(WCHAR);
break;
}
default:
break;
}
pDBBindings[nCol].obValue = cbRow;
pDBBindings[nCol].cbMaxLen = cbCol;
cbRow += AdjustLen(cbCol);
}
pRowValues = new BYTE[cbRow];
*ppDBBindings = pDBBindings;
*ppRowValues = pRowValues;
}
int main() {
ISourcesRowset* pISourceRowset = NULL;
IRowset* pIRowset = NULL;
IAccessor* pIAccessor = NULL;
DBBINDING* pDBBindings = NULL;
HROW* pRows = new HROW[500];
HACCESSOR hAccessorRetrieve = NULL;
ULONG DSSeqNumber = 0;
HRESULT hr;
DBORDINAL nCols;
DBCOLUMNINFO* pColumnsInfo = NULL;
OLECHAR* pColumnStrings = NULL;
DBBINDSTATUS* pDBBindStatus = NULL;
BYTE* pRowValues = NULL;
DBCOUNTITEM cRowsObtained;
ULONG iRow;
char* pMultiByte = NULL;
short* psSourceType = NULL;
BYTE* pDatasource = NULL;
if (!pRows)
return (0);
// Initialize COM library.
CoInitialize(NULL);
// Initialize the enumerator.
if (FAILED(CoCreateInstance(CLSID_MSOLEDBSQL_ENUMERATOR,
NULL,
CLSCTX_INPROC_SERVER,
IID_ISourcesRowset,
(void**)&pISourceRowset))) {
// Process error.
return TRUE;
}
// Retrieve the source rowset.
hr = pISourceRowset->GetSourcesRowset(NULL, IID_IRowset, 0, NULL, (IUnknown**)&pIRowset);
pISourceRowset->Release();
if (FAILED(hr)) {
// Process error.
return TRUE;
}
// Get the description of the enumerator's rowset.
if (FAILED(hr = GetColumnInfo(pIRowset, &nCols, &pColumnsInfo, &pColumnStrings))) {
// Process error.
goto SAFE_EXIT;
}
// Create the binding structures.
CreateDBBindings(nCols, pColumnsInfo, &pDBBindings, &pRowValues);
pDBBindStatus = new DBBINDSTATUS[nCols];
if (sizeof(TCHAR) != sizeof(WCHAR))
pMultiByte = new char[pDBBindings[0].cbMaxLen];
if (FAILED(pIRowset->QueryInterface(IID_IAccessor, (void**)&pIAccessor))) {
// Process error.
goto SAFE_EXIT;
}
// Create the rowset accessor.
if (FAILED(hr = pIAccessor->CreateAccessor(DBACCESSOR_ROWDATA,
nCols,
pDBBindings,
0,
&hAccessorRetrieve,
pDBBindStatus))) {
// Process error.
goto SAFE_EXIT;
}
// Process all the rows, NUMROWS_CHUNK rows at a time.
while (SUCCEEDED(hr)) {
hr = pIRowset->GetNextRows(NULL, 0, NUMROWS_CHUNK, &cRowsObtained, &pRows);
if( FAILED(hr)) {
// process error
}
if (cRowsObtained == 0 || FAILED(hr))
break;
for (iRow = 0 ; iRow < cRowsObtained ; iRow++) {
// Get the rowset data.
if (SUCCEEDED(hr = pIRowset->GetData(pRows[iRow], hAccessorRetrieve, pRowValues))) {
psSourceType = (short *)(pRowValues + pDBBindings[3].obValue);
if (*psSourceType == DBSOURCETYPE_DATASOURCE) {
DSSeqNumber = DSSeqNumber + 1; // Data source counter.
pDatasource = (pRowValues + pDBBindings[0].obValue);
if ( sizeof(TCHAR) != sizeof(WCHAR) ) {
WideCharToMultiByte(CP_ACP,
0,
(WCHAR*)pDatasource,
-1,
pMultiByte,
static_cast<int>(pDBBindings[0].cbMaxLen),
NULL,
NULL);
printf( "DataSource# %d\tName: %S\n",
DSSeqNumber,
(WCHAR *) pMultiByte );
}
else {
printf( "DataSource# %d\tName: %S\n",
DSSeqNumber,
(WCHAR *) pDatasource );
}
}
}
}
pIRowset->ReleaseRows(cRowsObtained, pRows, NULL, NULL, NULL);
}
// Release COM library.
CoUninitialize();
SAFE_EXIT:
// Do the clean-up.
return TRUE;
}