📄 xoledatabase.h
字号:
// OleDatabase.h: interface for the COleDatabase class
#if !defined(XIN_OLEDATABASE_H__INCLUDED_)
#define XIN_OLEDATABASE_H__INCLUDED_
// Include head file
#include <OleDB.h>
#include <MSDASC.h>
#include "XOleStrVariant.h"
//////////////////////////////////////////////////////////
// XComPtr class //
//////////////////////////////////////////////////////////
template <class T_CLASS>
class XComPtr
{
public:
T_CLASS* m_lpPtr;
public:
XComPtr()
{
m_lpPtr = NULL;
}
XComPtr(T_CLASS* lpPtr)
{
if(lpPtr != NULL) lpPtr->AddRef();
m_lpPtr = lpPtr;
}
XComPtr(const XComPtr<T_CLASS>& rfp)
{
m_lpPtr = rfp.m_lpPtr;
if(m_lpPtr != NULL) m_lpPtr->AddRef();
}
~XComPtr()
{
if(m_lpPtr != NULL)
m_lpPtr->Release();
}
operator T_CLASS*() const
{
return (T_CLASS *)m_lpPtr;
}
T_CLASS** operator&()
{
return &m_lpPtr;
}
T_CLASS* operator=(T_CLASS* lpPtr)
{
if(lpPtr != NULL) lpPtr->AddRef();
if(m_lpPtr != NULL) m_lpPtr->Release();
m_lpPtr = lpPtr;
return lpPtr;
}
T_CLASS* operator=(const XComPtr<T_CLASS>& rfp)
{
if(m_lpPtr != NULL)
m_lpPtr->Release();
m_lpPtr = rfp.m_lpPtr;
if(m_lpPtr != NULL) m_lpPtr->AddRef();
return m_lpPtr;
}
T_CLASS* operator->()
{
return m_lpPtr;
}
void AddRef()
{
IUnknown *lpTemp = m_lpPtr;
if(lpTemp != NULL) lpTemp->AddRef();
}
void Release()
{
IUnknown *lpTemp = m_lpPtr;
if(lpTemp != NULL)
{
m_lpPtr = NULL;
lpTemp->Release();
}
}
void Attach(T_CLASS *lpPtr)
{
if(m_lpPtr != NULL)
m_lpPtr->Release();
m_lpPtr = lpPtr;
}
T_CLASS* Detach()
{
T_CLASS* lpPtr = m_lpPtr;
m_lpPtr = NULL;
return lpPtr;
}
template <class Q_CLASS>
HRESULT QueryInterface(REFIID rfd, Q_CLASS** pp) const
{
return m_lpPtr->QueryInterface(rfd, (void **)pp);
}
template <class Q_CLASS>
HRESULT QueryInterface(Q_CLASS** pp) const
{
return m_lpPtr->QueryInterface(__uuidof(Q_CLASS), (void **)pp);
}
};
// All of class type
class XOleRowset;
class XOleDatabase;
//////////////////////////////////////////////////////////
// XOleDatabase class //
//////////////////////////////////////////////////////////
class XOleDatabase
{
// Attributes
protected:
XComPtr<IDBInitialize> m_dbInit;
XComPtr<IDBCreateSession> m_dbSession;
public:
// Close database
void CloseDatabase();
// Open database
HRESULT OpenDatabase(LPCTSTR lpConnect);
HRESULT OpenDatabase(LPCTSTR, LPCTSTR, LPCTSTR, LPCTSTR);
HRESULT OpenDatabase(REFCLSID, LPCTSTR, LPCTSTR, LPCTSTR);
// 判断满足某一条件的记录是否存在
HRESULT IsQueryExist(LPCTSTR strQuery);
// 执行一条命令
HRESULT ExecuteCommand(LPCTSTR strQuery, long *lpAffect = NULL);
// 获得数据库中的表、视
// 注意:strType可能为:"TABLE", "SYSTEM TABLE", "TABLE,SYSTEM TABLE"
// 返回的字段有:TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME,
// TABLE_TYPE, TABLE_GUID, TABLE_DESCRIB, TABLE_PROPID,
// DATE_CREATED, DATE_MODIDIED
// TABLE_TYPE的值可能有:"TABLE", "SYSTEM TABLE", "VIEW"
HRESULT GetSchemaRowset(LPCTSTR strType, XOleRowset *lpRowset);
// 单独打开一个表
HRESULT OpenRowset( LPCTSTR strTable,
IRowset **ppRowset,
BOOL bCanModify = FALSE
);
// 查询数据库记录
HRESULT QueryRowset( LPCTSTR strQuery,
IRowset **lpRowset,
BOOL bCanModify = FALSE
);
// 查询数据库记录
HRESULT QueryRowset( LPCTSTR strQuery,
XOleRowset *lpRowset,
BOOL bCanModify = FALSE
);
};
//////////////////////////////////////////////////////////
// XOleRowset class //
//////////////////////////////////////////////////////////
// 定义字段的描述信息
typedef struct
{
DWORD dwType;
DWORD dwSize;
DWORD dwOffset;
TCHAR lpName[20];
} XFieldInfo, FAR *LPFIELDINFO;
// 定义行集
class XOleRowset
{
public:
XOleRowset();
public:
long m_nColumn; //字段个数(列的个数)
LPBYTE m_lpMalloc;
LPBYTE m_lpBuffer;
XFieldInfo m_lpDesc[20]; //最多20个字段?
HROW m_hRow;
HACCESSOR m_hAccessor;
XComPtr<IRowset> m_dbRowset;
XComPtr<IAccessor> m_dbAccessor;
XComPtr<IRowsetChange> m_dbChange;
public:
// Create or release rowset
void ReleaseRowset();
HRESULT Create(IRowset *lpRowset);
HRESULT Create(IRowset *lpRowset, void *lpBuffer,
long nColumn, const WORD *lpType,
const long *lpSize);
// Basic function
HRESULT ReloadRow();
HRESULT ReleaseRow();
BOOL IsRowExist();
// Move row positon
HRESULT MoveNext();
HRESULT MovePrev();
HRESULT MoveLast();
HRESULT MoveFirst();
HRESULT MoveOffset(long);
// Modify the rowset
HRESULT InsertRow();
HRESULT DeleteRow();
HRESULT ModifyRow();
HRESULT InitializeChange();
// Get or Set current row value
long GetFieldIndex(LPCTSTR strName);
void GetFieldValue(long nIdx, void *lpBuffer);
void SetFieldValue(long nIdx, void *lpBuffer);
void GetFieldString(long nIdx, LPTSTR lpBuffer);
DWORD GetRecordCount();
void FillStruct(void *lpStruct, const long *lpSize);
void LoadStruct(void *lpStruct, const long *lpSize);
};
// 选择系统数据源
BOOL XSelectDataSource(HWND hWnd, LPTSTR lpConnect);
#endif // !defined(XIN_OLEDATABASE_H__INCLUDED_)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -