Как я могу перебрать указатель на интерфейс IUnknown объекта Rowset, используя команду select, как показано ниже:
Что мне нужно сделать, это получить все строки (используя цикл while), возвращаемые командой:
FAIL_IF (ExecuteSQL (spUnkCommand, «выбрать * из sasuser.newtable», spUnkRowset));
Пожалуйста, смотрите ниже полный код от http://support.sas.com/documentation/tools/oledb/rr_sqliomshare.htm
#include "stdafx.h"#include "atlbase.h"#include "comdef.h"#include "comutil.h"#include "oledb.h"#include "atldbcli.h"
#include <iostream>
#include <iomanip>
using std::cout;
using std::hex;
using std::setw;
using std::setfill;
using std::right;
using std::endl;
#define FAIL_IF( hr ) issue_if_failed( __FILE__, __LINE__, hr )
inline void issue_if_failed( char* file, ULONG line, HRESULT hr )
{
/* This method throws an error if hr is a failure. */
if( FAILED( hr ) )
{
ATLTRACE( "%s(%d): Failure 0x%X\n", (char*)file, line, hr );
_com_issue_error( hr );
}
}
HRESULT InstantiateProvider( CComPtr<IUnknown>& spUnkDataSrc )
{
/* spUnkDataSrc contains a NULL IUnknown pointer. */
/* This method instantiates the IOM Provider Data Source object and */
/* stores a pointer to it's IUnknown interface in spUnkDataSrc. */
CLSID clsid;
FAIL_IF( CLSIDFromProgID( L"SQLOLEDB.1", &clsid ) );
FAIL_IF( CoCreateInstance( clsid, NULL, CLSCTX_INPROC_SERVER, IID_IUnknown, (void**)&spUnkDataSrc ) );
return S_OK;
}
HRESULT InitializeProvider( CComPtr<IUnknown>& spUnkDataSrc )
{
/* spUnkDataSrc contains a IUnknown pointer to an uninitialized IOM Data Source Object. */
/* This method initializes the IOM Provider specifically. Initializing the SAS/SHARE */
/* Provider requires different properties as described in Opening an ADO Connection Object. */
CComQIPtr<IDBInitialize> spInit = spUnkDataSrc;
CComQIPtr<IDBProperties> spProp = spUnkDataSrc;
if( spInit == NULL || spProp == NULL )
return E_FAIL;
CDBPropSet Props( DBPROPSET_DBINIT );
Props.AddProperty( DBPROP_INIT_DATASOURCE, (WCHAR*)L"XXXXXXXXXXXX" ); // Host
Props.AddProperty( DBPROP_INIT_CATALOG, L"DBDBDBDBDB" ); // Database
Props.AddProperty( DBPROP_AUTH_USERID, L"sa" ); // user
Props.AddProperty( DBPROP_AUTH_PASSWORD, L"PWDPWDPWDPWD"); // password
FAIL_IF( spProp->SetProperties( 1, &Props ) );
FAIL_IF( spInit->Initialize() );
return S_OK;
}
HRESULT CreateSession( CComPtr<IUnknown>& spUnkDataSrc, CComPtr<IUnknown>& spUnkSession )
{
/* spUnkDataSrc contains a pointer to the IUnknown interface of an initialized Data Source Object */
/* spUnkSession is where a pointer to the IUnknown interface of the newly created Session Object will be stored */
HRESULT hr = E_FAIL;
CComQIPtr<IDBCreateSession> spCreateSession = spUnkDataSrc;
if( spCreateSession == NULL )
cout << "ERROR: IDBCreateSession not found" << endl;
else
{
hr = spCreateSession->CreateSession( NULL, IID_IUnknown, &spUnkSession.p );
FAIL_IF( hr );
}
return hr;
}
HRESULT CreateCommand( CComPtr<IUnknown>& spUnkSession, CComPtr<IUnknown>& spUnkCommand )
{
/* spUnkSession contains a pointer to the IUnknown interface of an open Session Object */
/* spUnkCommand is where a pointer to the IUnknown interface of the newly created Command Object will be stored */
HRESULT hr = E_FAIL;
CComQIPtr<IDBCreateCommand> spCreateCommand = spUnkSession;
if( spCreateCommand == NULL )
cout << "ERROR: IDBCreateCommand not found" << endl;
{
hr = spCreateCommand->CreateCommand( NULL, IID_IUnknown, &spUnkCommand.p );
FAIL_IF( hr );
}
return hr;
}
HRESULT ExecuteSQL( CComPtr<IUnknown>& spUnkCommand, bstr_t bstrSQL, CComPtr<IUnknown>& spUnkRowset )
{
/* spUnkCommand contains a pointer to the IUnknown interface of an open command */
/* spUnkRowset is where the IUknown pointer to the created rowset (if any) will be stored */
HRESULT hr = E_FAIL;
CComQIPtr<ICommandText> spCommandText = spUnkCommand;
if( spCommandText == NULL )
cout << "ERROR: ICommandText not found" << endl;
else
{
FAIL_IF( spCommandText->SetCommandText( DBGUID_DBSQL, bstrSQL ) );
hr = spCommandText->Execute( NULL, IID_IUnknown, NULL, NULL, &spUnkRowset.p );
FAIL_IF( hr );
}
return hr;
}
int main(int argc, char* argv[])
{
CoInitialize(NULL);
try
{
HRESULT hr = E_FAIL;
CComPtr<IUnknown> spUnkDataSrc = NULL; /* pointer to IUnknown interface of a Data Source Object */
CComPtr<IUnknown> spUnkSession = NULL; /* pointer to IUnknown interface of a Session Object */
CComPtr<IUnknown> spUnkCommand = NULL; /* pointer to IUnknown interface of a Command Object */
CComPtr<IUnknown> spUnkRowset = NULL; /* pointer to IUnknown interface of a Rowset Object */
FAIL_IF( InstantiateProvider( spUnkDataSrc ) ); /* creates an instance of the IOM Provider Data Source */
FAIL_IF( InitializeProvider( spUnkDataSrc ) ); /* initializes the Data Source object to connect to the local COM IOM server */
FAIL_IF( CreateSession( spUnkDataSrc, spUnkSession ) ); /* creates an instance of a Session Object */
FAIL_IF( CreateCommand( spUnkSession, spUnkCommand ) ); /* creates an instance of a Command Object */
FAIL_IF( ExecuteSQL( spUnkCommand, "select * from table_name", spUnkRowset ) );
/* do something with spUnkRowset */
/* ??????? */}
catch( _com_error& e )
{
cout << "ERROR: 0x" << hex << setw(8) << setfill('0') << right << e.Error() << endl;
}
CoUninitialize();
return 0;
}
Задача ещё не решена.
Других решений пока нет …