ATLVisual Studio 6Visual C++ 7.0DBAWindows 2000Visual C++ 6.0Windows XP中级开发Visual StudioSQL ServerSQLWindowsC++
从 CSession 对象获取 DataSource 信息





4.00/5 (2投票s)
2003年2月6日
1分钟阅读

42807

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 { CComPtrspGetDataSource; 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 网站 找到数据源信息属性列表。
结论
最后,我想说 - 这些代码是在我做晚饭的时候编写的 :-)。它可能不完美,但我希望它能帮助说明我的观点。