⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xoledatabase.h

📁 数据库访问原代码
💻 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 + -