dataset.h

来自「1)动态加载中间(2)规范化中间层接口 (3)解释本地文件系统(4)基于数据库的」· C头文件 代码 · 共 128 行

H
128
字号
// DataSet.h : interface of the CDataSet class
//
/////////////////////////////////////////////////////////////////////////////

#pragma once

void SetStatus(const CString Msg);

///////////////////////////////////////////////////////////////////////// CMyException
class CMyException: public CException {
	CString m_ErrorMsg;
public:
	CMyException(int ResourceID);
	CMyException(CString ErrorMsg);
	BOOL GetErrorMessage(LPTSTR lpszError, UINT nMaxError, PUINT pnHelpContext = NULL);
};

///////////////////////////////////////////////////////////////////////
// CDataSet
template<class T, int M> class CDataSet : public CRecordset
{
public:
	CDataSet(LPCSTR Table, CDatabase* pdb);
	T				m_Data;				// Attached object
	CString			m_DefaultSQL;		// Default SQL SELECT statement
	CString			m_DefaultSort;		// Default SQL ORDER BY clause
	CString			m_DefaultFilter;	// Default SQL WHERE clause

// Operations
public:
	virtual BOOL Search(LPCSTR Filter, LPCSTR Sort = NULL, BOOL bFail = FALSE);
	virtual BOOL DirectSearch(LPCSTR Filter, LPCSTR Sort = NULL, BOOL bFail = FALSE);
	virtual void LoadAll(CArray<T, T>& A, int N = 0);
	virtual void SaveAll(CArray<T, T>& A);
	virtual void Load(T& Data) { Data = m_Data; }
	virtual void Store(T& Data);
	virtual void Close();

// Implementation
protected:
	virtual CString GetDefaultSQL() { return m_DefaultSQL; }
	virtual void DoFieldExchange(CFieldExchange* pFX);
};

///////////////////////////////////////////////////////////////////////
// CDataSet
template<class T, int M> CDataSet<T, M>::CDataSet(LPCSTR Table, CDatabase* pdb) :
	CRecordset(pdb)
{
	m_nFields = M;
	m_DefaultSQL = Table;
	m_DefaultFilter = "%s";
}

template<class T, int M> BOOL CDataSet<T, M>::Search(LPCSTR Filter, LPCSTR Sort, BOOL bFail)
{
	if ( IsOpen() ) Close();

	SetStatus("Opening " + m_DefaultSQL + " ...");

	if ( Filter )
		m_strFilter.Format(m_DefaultFilter, Filter);
	else
		m_strFilter = "";
	m_strSort = Sort;

	Open();

	// Throw exception if record not found
	if ( bFail && IsEOF() )
		THROW(new CMyException(m_DefaultSQL + " record not found!"));
	return !IsEOF();
}

template<class T, int M> BOOL CDataSet<T, M>::DirectSearch(LPCSTR Filter, LPCSTR Sort, BOOL bFail)
{
	if ( IsOpen() ) Close();

	SetStatus("Opening " + m_DefaultSQL + " ...");

	m_strFilter = Filter;
	m_strSort = Sort;
	Open();
	
	// Throw exception if record not found
	if ( bFail && IsEOF() )
		THROW(new CMyException(m_DefaultSQL + " record not found!"));
	return !IsEOF();
}

template<class T, int M> void CDataSet<T, M>::LoadAll(CArray<T, T>& A, int N)
{
	SetStatus("Loading " + m_DefaultSQL + " ...");
	A.RemoveAll();
		
	while ( !IsEOF() && (N == 0 || A.GetSize() < N) )
	{
		A.Add(m_Data);
		MoveNext();
	}  
}

template<class T, int M> void CDataSet<T, M>::SaveAll(CArray<T, T>& A)
{
	SetStatus("Writing " + m_DefaultSQL + " ...");
		
	for ( int i = 0; i < A.GetSize(); i++ )
	{
		AddNew();
		Store(A[i]);
	}  
}

template<class T, int M> void CDataSet<T, M>::Store(T& Data)
{
	SetStatus("Updating " + m_DefaultSQL + " ...");
	Edit();
	m_Data = Data;
	Update();
}

template<class T, int M> void CDataSet<T, M>::Close()
{
	CRecordset::Close();
	SetStatus("Ready");
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?