SQL Server和OLE DB使用者:指向行集对象的IUnknown接口的指针

时间:2013-11-26 15:51:24

标签: c++ sql sql-server oledb

如何使用select命令迭代指向行集对象的IUnknown接口的指针,如下面的代码? 我需要做的是获取命令返回的所有行(使用while循环):

FAIL_IF(ExecuteSQL(spUnkCommand," select * from 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;
}

0 个答案:

没有答案