65.9K
CodeProject 正在变化。 阅读更多。
Home

从 CSession 对象获取 DataSource 信息

starIconstarIconstarIconstarIconemptyStarIcon

4.00/5 (2投票s)

2003年2月6日

1分钟阅读

viewsIcon

42807

downloadIcon

356

关于从 CSession 对象获取 DataSource 信息的 HowTo。

引言

这很简单。这篇文章只是为了帮你省去阅读 MSDN 指南时的一些点击和滚动操作。

我遇到一个需要获取已打开的 MS Access 文件名的需求。我的类已经有一个会话对象作为成员。我原本可以添加一个 setFilename() 函数。但是不行!作为一名懒惰的程序员,我不想对已经整洁的类进行修改;而且这样做需要更改所有其他类,以便在链中传递文件名。解决方案:从会话对象获取文件名。

本文展示了如何操作。

方法

  • 会话对象中有一个行集成员对象。从该行集获取 DataSource 接口。
    CComPtr spGetDataSource;
    HRESULT hr = r_session.m_spOpenRowset->QueryInterface(
        IID_IGetDataSource, (void**)&spGetDataSource);
  • DataSource 对象获取 DBProperties 接口

    CComPtr spProperties;
    hr = spGetDataSource->GetDataSource(IID_IDBProperties, 
        (IUnknown **)&spProperties);
  • 最后,获取你想要的数据源属性。例如,获取文件名 (DBPROP_DATASOURCENAME)
    CDBPropIDSet set(DBPROPSET_DATASOURCEINFO);
    set.AddPropertyID(DBPROP_DATASOURCENAME);
    DBPROPSET* pPropSet = NULL;
    ULONG ulPropSet = 0;
    hr = spProperties->GetProperties(1, &set, &ulPropSet, &pPropSet);
    if (FAILED(hr))
        return hr;
    
    printf(_T("filename = %s\n"), (_bstr_t)(_variant_t)
        pPropSet->rgProperties[0].vValue);
    

使用代码

文件 DataSourceInfo.cpp 包含以下函数,你可以使用它来检索任何数据源信息。

HRESULT hr_GetDataSourceInfo(CSession & r_session, DWORD dw_infoCode,  
    _variant_t & r_info)
{
    HRESULT hr = S_OK;
    try
    {
        CComPtr spGetDataSource;
        HRESULT hr = r_session.m_spOpenRowset->QueryInterface(
            IID_IGetDataSource, (void**)&spGetDataSource);

        CComPtr spProperties;
        hr = spGetDataSource->GetDataSource(IID_IDBProperties, 
           (IUnknown **)&spProperties);


        CDBPropIDSet set(DBPROPSET_DATASOURCEINFO);
        set.AddPropertyID(dw_infoCode);
        DBPROPSET* pPropSet = NULL;
        ULONG ulPropSet = 0;
        hr = spProperties->GetProperties(1, &set, &ulPropSet, &pPropSet);
        if (FAILED(hr))
        {
            return hr;
        }

        ATLASSERT(ulPropSet == 1);
        VariantCopy(&r_info, &pPropSet->rgProperties[0].vValue);

        CoTaskMemFree(pPropSet->rgProperties);
        CoTaskMemFree(pPropSet);
    }
    catch (...)
    {
        // quite lonely here... put something
    }

    return hr;
}

你需要传递会话、数据源信息属性代码和一个将接收信息的变体。

可以在 MSDN 网站 找到数据源信息属性列表。

结论

最后,我想说 - 这些代码是在我做晚饭的时候编写的 :-)。它可能不完美,但我希望它能帮助说明我的观点。

© . All rights reserved.