📄 txtprovidersess.h
字号:
// TxtProviderSess.h : CTxtProviderSession 的声明
#pragma once
#include "resource.h" // 主符号
#include "TxtProviderRS.h"
class CTxtProviderSessionTRSchemaRowset;
class CTxtProviderSessionColSchemaRowset;
class CTxtProviderSessionPTSchemaRowset;
// CTxtProviderSession
class ATL_NO_VTABLE CTxtProviderSession :
public CComObjectRootEx<CComSingleThreadModel>,
public IGetDataSourceImpl<CTxtProviderSession>,
public IOpenRowsetImpl<CTxtProviderSession>,
public ISessionPropertiesImpl<CTxtProviderSession>,
public IObjectWithSiteSessionImpl<CTxtProviderSession>,
public IDBSchemaRowsetImpl<CTxtProviderSession>,
public IDBCreateCommandImpl<CTxtProviderSession, CTxtProviderCommand>
{
public:
CTxtProviderSession()
{
}
DECLARE_PROTECT_FINAL_CONSTRUCT()
HRESULT FinalConstruct()
{
return FInit();
}
void FinalRelease()
{
}
STDMETHOD(OpenRowset)(IUnknown *pUnk, DBID *pTID, DBID *pInID, REFIID riid,
ULONG cSets, DBPROPSET rgSets[], IUnknown **ppRowset)
{
CTxtProviderRowset* pRowset;
return CreateRowset(pUnk, pTID, pInID, riid, cSets, rgSets, ppRowset, pRowset);
}
void SetRestrictions(ULONG cRestrictions, GUID* rguidSchema, ULONG* rgRestrictions)
{
for (ULONG l=0; l<cRestrictions; l++)
{
// 我们支持对表名称(但仅限于表名称)的限制
if (InlineIsEqualGUID(rguidSchema[l], DBSCHEMA_TABLES))
rgRestrictions[l] = 0x04;
else if (InlineIsEqualGUID(rguidSchema[l], DBSCHEMA_COLUMNS))
rgRestrictions[l] = 0x04;
else if (InlineIsEqualGUID(rguidSchema[l], DBSCHEMA_PROVIDER_TYPES))
rgRestrictions[l] = 0x00;
}
}
BEGIN_PROPSET_MAP(CTxtProviderSession)
BEGIN_PROPERTY_SET(DBPROPSET_SESSION)
PROPERTY_INFO_ENTRY(SESS_AUTOCOMMITISOLEVELS)
END_PROPERTY_SET(DBPROPSET_SESSION)
END_PROPSET_MAP()
BEGIN_COM_MAP(CTxtProviderSession)
COM_INTERFACE_ENTRY(IGetDataSource)
COM_INTERFACE_ENTRY(IOpenRowset)
COM_INTERFACE_ENTRY(ISessionProperties)
COM_INTERFACE_ENTRY(IObjectWithSite)
COM_INTERFACE_ENTRY(IDBCreateCommand)
COM_INTERFACE_ENTRY(IDBSchemaRowset)
END_COM_MAP()
BEGIN_SCHEMA_MAP(CTxtProviderSession)
SCHEMA_ENTRY(DBSCHEMA_TABLES, CTxtProviderSessionTRSchemaRowset)
SCHEMA_ENTRY(DBSCHEMA_COLUMNS, CTxtProviderSessionColSchemaRowset)
SCHEMA_ENTRY(DBSCHEMA_PROVIDER_TYPES, CTxtProviderSessionPTSchemaRowset)
END_SCHEMA_MAP()
};
class CTxtProviderSessionTRSchemaRowset :
public CSchemaRowsetImpl< CTxtProviderSessionTRSchemaRowset, CTABLESRow, CTxtProviderSession>
{
public:
BEGIN_PROPSET_MAP(CTxtProviderSessionTRSchemaRowset)
BEGIN_PROPERTY_SET(DBPROPSET_ROWSET)
PROPERTY_INFO_ENTRY(IAccessor)
PROPERTY_INFO_ENTRY(IColumnsInfo)
PROPERTY_INFO_ENTRY(IConvertType)
PROPERTY_INFO_ENTRY(IRowset)
PROPERTY_INFO_ENTRY(IRowsetIdentity)
PROPERTY_INFO_ENTRY(IRowsetInfo)
PROPERTY_INFO_ENTRY(CANFETCHBACKWARDS)
PROPERTY_INFO_ENTRY(CANHOLDROWS)
PROPERTY_INFO_ENTRY(CANSCROLLBACKWARDS)
PROPERTY_INFO_ENTRY_VALUE(MAXOPENROWS, 0)
PROPERTY_INFO_ENTRY_VALUE(MAXROWS, 0)
END_PROPERTY_SET(DBPROPSET_ROWSET)
END_PROPSET_MAP()
HRESULT Execute(LONG* pcRowsAffected, ULONG, const VARIANT*)
{
USES_CONVERSION;
CTxtProviderWindowsFile wf;
CTABLESRow trData;
lstrcpyW(trData.m_szType, OLESTR("TABLE"));
lstrcpyW(trData.m_szDesc, OLESTR("目录表"));
HANDLE hFile = INVALID_HANDLE_VALUE;
TCHAR szDir[MAX_PATH + 1];
DWORD cbCurDir = GetCurrentDirectory(MAX_PATH, szDir);
lstrcat(szDir, _T("\\*.*"));
hFile = FindFirstFile(szDir, &wf);
if (hFile == INVALID_HANDLE_VALUE)
return E_FAIL; // 用户没有 c:\ 驱动器
FindClose(hFile);
lstrcpynW(trData.m_szTable, T2OLE(szDir), SIZEOF_MEMBER(CTABLESRow, m_szTable));
if (!m_rgRowData.Add(trData))
return E_OUTOFMEMORY;
*pcRowsAffected = 1;
return S_OK;
}
DBSTATUS GetDBStatus(CSimpleRow*, ATLCOLUMNINFO* pInfo)
{
if (pInfo->iOrdinal == 1 || pInfo->iOrdinal == 2)
return DBSTATUS_S_ISNULL;
return DBSTATUS_S_OK;
}
};
class CTxtProviderSessionColSchemaRowset :
public CSchemaRowsetImpl< CTxtProviderSessionColSchemaRowset, CCOLUMNSRow, CTxtProviderSession>
{
public:
BEGIN_PROPSET_MAP(CTxtProviderSessionColSchemaRowset)
BEGIN_PROPERTY_SET(DBPROPSET_ROWSET)
PROPERTY_INFO_ENTRY(IAccessor)
PROPERTY_INFO_ENTRY(IColumnsInfo)
PROPERTY_INFO_ENTRY(IConvertType)
PROPERTY_INFO_ENTRY(IRowset)
PROPERTY_INFO_ENTRY(IRowsetIdentity)
PROPERTY_INFO_ENTRY(IRowsetInfo)
PROPERTY_INFO_ENTRY(CANFETCHBACKWARDS)
PROPERTY_INFO_ENTRY(CANHOLDROWS)
PROPERTY_INFO_ENTRY(CANSCROLLBACKWARDS)
PROPERTY_INFO_ENTRY_VALUE(MAXOPENROWS, 0)
PROPERTY_INFO_ENTRY_VALUE(MAXROWS, 0)
END_PROPERTY_SET(DBPROPSET_ROWSET)
END_PROPSET_MAP()
HRESULT Execute(LONG* pcRowsAffected, ULONG, const VARIANT*)
{
USES_CONVERSION;
CTxtProviderWindowsFile wf;
HANDLE hFile = INVALID_HANDLE_VALUE;
TCHAR szDir[MAX_PATH + 1];
DWORD cbCurDir = GetCurrentDirectory(MAX_PATH, szDir);
lstrcat(szDir, _T("\\*.*"));
hFile = FindFirstFile(szDir, &wf);
if (hFile == INVALID_HANDLE_VALUE)
return E_FAIL; // 用户没有 c:\ 驱动器
FindClose(hFile);// szDir 已获得表名称
DBID dbid;
memset(&dbid, 0, sizeof(DBID));
dbid.uName.pwszName = T2OLE(szDir);
dbid.eKind = DBKIND_NAME;
return InitFromRowset < _RowsetArrayType > (m_rgRowData, &dbid, NULL, m_spUnkSite, pcRowsAffected);
}
DBSTATUS GetDBStatus(CSimpleRow*, ATLCOLUMNINFO* pInfo)
{
switch(pInfo->iOrdinal)
{
case 1:
case 2:
case 19:
case 20:
case 22:
case 23:
case 25:
case 26:
return DBSTATUS_S_ISNULL;
default:
return DBSTATUS_S_OK;
}
}
};
class CTxtProviderSessionPTSchemaRowset :
public CSchemaRowsetImpl< CTxtProviderSessionPTSchemaRowset, CPROVIDER_TYPERow, CTxtProviderSession>
{
public:
BEGIN_PROPSET_MAP(CTxtProviderSessionPTSchemaRowset)
BEGIN_PROPERTY_SET(DBPROPSET_ROWSET)
PROPERTY_INFO_ENTRY(IAccessor)
PROPERTY_INFO_ENTRY(IColumnsInfo)
PROPERTY_INFO_ENTRY(IConvertType)
PROPERTY_INFO_ENTRY(IRowset)
PROPERTY_INFO_ENTRY(IRowsetIdentity)
PROPERTY_INFO_ENTRY(IRowsetInfo)
PROPERTY_INFO_ENTRY(CANFETCHBACKWARDS)
PROPERTY_INFO_ENTRY(CANHOLDROWS)
PROPERTY_INFO_ENTRY(CANSCROLLBACKWARDS)
PROPERTY_INFO_ENTRY_VALUE(MAXOPENROWS, 0)
PROPERTY_INFO_ENTRY_VALUE(MAXROWS, 0)
END_PROPERTY_SET(DBPROPSET_ROWSET)
END_PROPSET_MAP()
HRESULT Execute(LONG* pcRowsAffected, ULONG, const VARIANT*)
{
return S_OK;
}
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -