操作ACCESS的類CADOConn

// ADOConn.h: interface for the CADOConn class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_ADOCONN_H__6FC87078_9BAB_4B1F_B205_E932FD387E09__INCLUDED_)
#define AFX_ADOCONN_H__6FC87078_9BAB_4B1F_B205_E932FD387E09__INCLUDED_

#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename ("EOF", "adoEOF")

#define ado_Field_Str 202
#define ado_Field_Text 203
#define ado_Field_Int 2
#define ado_Field_Long 3
#define ado_Field_Float 4
#define ado_Field_Double 5
#define ado_Field_Date 7
#define ado_Field_Byte 17


#ifdef _DEBUG
	#define ASSERT_VALID_STRING( str ) ASSERT( !IsBadStringPtr( str, 0xfffff ) )
#else	//	_DEBUG
	#define ASSERT_VALID_STRING( str ) ( (void)0 )
#endif	//	_DEBUG

class CADOConn  
{
public:
	_ConnectionPtr m_pConnection;
	_RecordsetPtr m_pRecordset;
	_bstr_t m_strDatabaseName;
	int m_iDatabaseType;
	
	CADOConn();
	CADOConn(CString m_strDatabaseName);
	virtual ~CADOConn();
	CString GetAppPath();
	void InitCADOConn();
	void ExitConnect();
	_RecordsetPtr& GetRecordSet(CString strSQL);
	BOOL Open(CString strSQL);
	BOOL ExecuteSQL(CString strSQL);
	BOOL MoveFirst();
	BOOL MoveNext();
	CString GetItemString(int index);
	int GetItemInt(int index);
	long GetItemLong(int index);
	BOOL adoEOF();
	CString GetFieldName(int index);
	int GetFieldsCount();
	long GetRecordCount();
	BOOL InitList(CListCtrl *listMain);
	BOOL FillList(CListCtrl *listMain);
};

#endif // !defined(AFX_ADOCONN_H__6FC87078_9BAB_4B1F_B205_E932FD387E09__INCLUDED_)



// ADOConn.cpp: implementation of the CADOConn class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "ADOConn.h"


#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////


CADOConn::CADOConn()
{
	//數據庫類型:Access
	m_iDatabaseType = 1;
	m_strDatabaseName = _bstr_t("ShopSale.mdb");
}

CADOConn::~CADOConn()
{
	
}

/************************************************************************
函數名:  CADOConn
作  者:	 譚友亮(Charles Tan)
日  期:	 2013-3-5
作  用:  將數據庫名稱傳遞給m_strDatabaseName,並判斷數據庫類型
形參數:  strDatabaseName 數據庫名稱
返回值:  
修改記錄:                                             
************************************************************************/
CADOConn::CADOConn(CString strDatabaseName)
{
	CString strFormat;
	strDatabaseName.TrimLeft();
	strDatabaseName.TrimRight();
	m_strDatabaseName = _bstr_t(strDatabaseName);
	strFormat = strDatabaseName.Right(strDatabaseName.GetLength() - strDatabaseName.ReverseFind('.') - 1);

	if(strFormat == "mdb")
	{
		m_iDatabaseType = 1;
	}
	if(strFormat == "xls" || strFormat == "xlsx")
	{
		m_iDatabaseType = 2;
	}
}

/************************************************************************
函數名:  GetAppPath
作  者:	 譚友亮(Charles Tan)
日  期:	 2013-3-18
作  用:  獲取當前程序的可執行文件所在的目錄
形參數:  
返回值:  
修改記錄:                                             
************************************************************************/
CString CADOConn::GetAppPath()
{
	char lpFilePath[MAX_PATH];
	CString strPath;

	GetModuleFileName(AfxGetInstanceHandle(), lpFilePath, MAX_PATH);
	strPath = lpFilePath;
	strPath = strPath.Left(strPath.ReverseFind('\\'));

	return strPath;
}

/************************************************************************
函數名:  InitCADOConn
作  者:	 譚友亮(Charles Tan)
日  期:	 2013-3-5
作  用:  初始化數據庫連接
形參數:  
返回值:  
修改記錄:                                             
************************************************************************/
void CADOConn::InitCADOConn()
{
	CString toolPath = GetAppPath();

	//初始化OLE/COM庫環境
	::CoInitialize(NULL);
	try
	{
		m_pConnection = NULL;
		m_pRecordset = NULL;
		//創建Connection對象
		m_pConnection.CreateInstance("ADODB.Connection");
		//設置連接字符串,必須是BSTR型或者_bstr_t類型
		_bstr_t strConnect;

		switch(m_iDatabaseType)
		{
		case 1://ACCESS
			strConnect = _bstr_t("Provider = Microsoft.Jet.OLEDB.4.0;Data Source = ");
			strConnect = strConnect + _bstr_t(toolPath) + _bstr_t("\\data\\") + m_strDatabaseName;
			break;
		case 2://EXCEL
			strConnect = _bstr_t("Provider = Microsoft.Jet.OLEDB.4.0;Data Source = ");
			strConnect = strConnect + _bstr_t(toolPath) + _bstr_t("\\") + m_strDatabaseName;
			strConnect = strConnect + ";Extended Properties=Excel 8.0";		
			break;	
		case 3://SQL SERVER
			strConnect = _bstr_t("Provider = Microsoft.Jet.OLEDB.4.0;Data Source = ");
			strConnect = strConnect + _bstr_t(toolPath) + _bstr_t("\\") + m_strDatabaseName;
			strConnect = strConnect + ";Extended Properties=Excel 8.0";		
			break;
		}

		m_pConnection->Open(strConnect, _bstr_t(""), _bstr_t(""), adModeUnknown);
		//ShellExecute(NULL, _T("open"), toolPath + "\\" + m_strDatabaseName, NULL, NULL, SW_SHOWMAXIMIZED);
	}
	catch(_com_error e)
	{
		AfxMessageBox(e.Description());
	}
}

/************************************************************************
函數名:  GetRecordSet
作  者:	 譚友亮(Charles Tan)
日  期:	 2013-3-5
作  用:  執行查詢
形參數:  strSQL SQL語句
返回值:  m_pRecordset 字段集的指針
修改記錄:                                             
************************************************************************/
_RecordsetPtr& CADOConn::GetRecordSet(CString strSQL)
{
	try
	{
		//連接數據庫,如果Connection對象爲空,則重新連接數據庫
		if(m_pConnection == NULL)
		{
			InitCADOConn();
		}

		strSQL.TrimLeft();
		strSQL.TrimRight();
		//創建記錄集對象
		m_pRecordset.CreateInstance(__uuidof(Recordset));
		//取得表中的記錄
		m_pRecordset->Open(_bstr_t(strSQL), m_pConnection.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText);
		return m_pRecordset;
	}
	catch(_com_error e)
	{
		AfxMessageBox(e.Description());
	}
	
	return m_pRecordset;
}

/************************************************************************
函數名:  Open
作  者:	 譚友亮(Charles Tan)
日  期:	 2013-3-5
作  用:  打開字符集
形參數:  strSQL SQL語句
返回值:  TRUE:成功 FALSE:失敗
修改記錄:                                             
************************************************************************/
BOOL CADOConn::Open(CString strSQL)
{
	try
	{
		//連接數據庫,如果Connection對象爲空,則重新連接數據庫
		if(m_pConnection == NULL)
		{
			InitCADOConn();
		}

		strSQL.TrimLeft();
		strSQL.TrimRight();
		//創建記錄集對象
		m_pRecordset.CreateInstance(__uuidof(Recordset));
		//取得表中的記錄
		m_pRecordset->Open(_bstr_t(strSQL), m_pConnection.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText);
	}
	catch(_com_error e)
	{
		AfxMessageBox(e.Description());
		return FALSE;
	}

	return TRUE;
}

/************************************************************************
函數名:  ExecuteSQL
作  者:	 譚友亮(Charles Tan)
日  期:	 2013-3-5
作  用:  執行SQL語句(Insert Update delete)
形參數:  strSQL SQL語句
返回值:  TRUE:成功 FALSE:失敗
修改記錄:                                             
************************************************************************/
BOOL CADOConn::ExecuteSQL(CString strSQL)
{
	try
	{
		//連接數據庫,如果Connection對象爲空,則重新連接數據庫
		if(m_pConnection == NULL)
		{
			InitCADOConn();
		}
		
		strSQL.TrimLeft();
		strSQL.TrimRight();
		m_pConnection->Execute(_bstr_t(strSQL), NULL, adCmdText);
		return TRUE;
	}
	catch(_com_error e)
	{
		AfxMessageBox(e.Description());
		return FALSE;
	}
	return TRUE;
}

/************************************************************************
函數名:  MoveFirst
作  者:	 譚友亮(Charles Tan)
日  期:	 2013-3-6
作  用:  記錄集移向開頭
形參數:  
返回值:  TRUE:成功 FALSE:失敗
修改記錄:                                             
************************************************************************/
BOOL CADOConn::MoveFirst()
{
	if(m_pRecordset == NULL)
	{
		return FALSE;
	}
	else
	{
		m_pRecordset->MoveFirst();
		return TRUE;
	}
}

/************************************************************************
函數名:  MoveNext
作  者:	 譚友亮(Charles Tan)
日  期:	 2013-3-6
作  用:  記錄集向下移動
形參數:  
返回值:  TRUE:成功 FALSE:失敗
修改記錄:                                             
************************************************************************/
BOOL CADOConn::MoveNext()
{
	if(m_pRecordset == NULL)
	{
		return FALSE;
	}
	else
	{
		if(!m_pRecordset->adoEOF)
		{
			m_pRecordset->MoveNext();
			return TRUE;
		}
		else
		{
			return FALSE;
		}
	}
}

/************************************************************************
函數名:  GetItemString
作  者:	 譚友亮(Charles Tan)
日  期:	 2013-3-6
作  用:  取得字段中的字符串
形參數:  index:字段集中的索引
返回值:  
修改記錄:                                             
************************************************************************/
CString CADOConn::GetItemString(int index)
{
	_variant_t vValue;
	_variant_t vIndex;
	CString strValue, str;

	if (m_pRecordset == NULL || m_pRecordset->adoEOF)
	{
		return "";
	}

	vIndex.vt = VT_I2;
	vIndex.iVal = index;
	vValue = m_pRecordset->GetCollect(vIndex);
//	vValue = m_pRecordset->Fields->GetItem(vIndex)->Value;

	switch(vValue.vt)
	{
	case VT_NULL:
		str = "";
		break;
	case VT_ERROR:
		str = "";
		break;
	case VT_EMPTY:
		str = "";
		break;
	default:
		str = (LPCTSTR)_bstr_t(vValue);
	}
	
	strValue.Format(_T("%s"), str);
	strValue.TrimRight();
	strValue.TrimLeft();
	
	return strValue;
}

/************************************************************************
函數名:  GetItemInt
作  者:	 譚友亮(Charles Tan)
日  期:	 2013-3-18
作  用:  取得字段中的整數
形參數:  index:字段集中的索引
返回值:  
修改記錄:                                             
************************************************************************/
int CADOConn::GetItemInt(int index)
{
	_variant_t vValue;
	_variant_t vIndex;
	int iValue;

	if (m_pRecordset == NULL || m_pRecordset->adoEOF)
	{
		exit(1);
	}

	vIndex.vt = VT_I2;
	vIndex.iVal = index;
	vValue = m_pRecordset->GetCollect(vIndex);
//	vValue = m_pRecordset->Fields->GetItem(vIndex)->Value;

	switch(vValue.vt)
	{
	case VT_NULL:
		iValue = 0;
		break;
	case VT_ERROR:
		iValue = 0;
		break;
	case VT_EMPTY:
		iValue = 0;
		break;
	default:
		iValue = vValue.iVal;
	}
	
	return iValue;
}

/************************************************************************
函數名:  GetItemLong
作  者:	 譚友亮(Charles Tan)
日  期:	 2013-3-18
作  用:  取得字段中的整數
形參數:  index:字段集中的索引
返回值:  
修改記錄:                                             
************************************************************************/
long CADOConn::GetItemLong(int index)
{
	long lValue;
	_variant_t vIndex;
	_variant_t vValue;

	vIndex.vt = VT_I2;
	vIndex.iVal = index;
	vValue = m_pRecordset->Fields->GetItem(vIndex)->Value;

	switch(vValue.vt)
	{
	case VT_NULL:
		lValue = 0;
		break;
	case VT_ERROR:
		lValue = 0;
		break;
	case VT_EMPTY:
		lValue = 0;
		break;
	default:
		lValue = vValue.lVal;
	}
	
	return lValue;
}

/************************************************************************
函數名:  GetFieldName
作  者:	 譚友亮(Charles Tan)
日  期:	 2013-3-6
作  用:  取得列標題
形參數:  index:字段集中的索引,最小值爲0
返回值:  
修改記錄:                                             
************************************************************************/
CString CADOConn::GetFieldName(int index)
{
	_variant_t vIndex;
	CString strFieldName;
	
	if (index < m_pRecordset->Fields->Count)
	{
		vIndex.vt = VT_I2;
		vIndex.iVal = index;
		strFieldName = (LPCTSTR)m_pRecordset->Fields->GetItem(vIndex)->GetName();
	}
	else
	{
		AfxMessageBox("Invalid index!");
	}
	
	return strFieldName;
}

/************************************************************************
函數名:  GetFieldsCount
作  者:	 譚友亮(Charles Tan)
日  期:	 2013-3-6
作  用:  取得列數
形參數:  
返回值:  
修改記錄:                                             
************************************************************************/
int CADOConn::GetFieldsCount()
{
	int colNum = m_pRecordset->Fields->Count;
	return colNum;
}

/************************************************************************
函數名:  adoEOF
作  者:	 譚友亮(Charles Tan)
日  期:	 2013-3-6
作  用:  判斷字段集是否結束
形參數:  
返回值:  TRUE:結束 FALSE:未結束
修改記錄:                                             
************************************************************************/
BOOL CADOConn::adoEOF()
{
	if(m_pRecordset->adoEOF)
	{
		return TRUE;
	}
	else
	{
		return FALSE;
	}
}

/************************************************************************
函數名:  ExitConnect
作  者:	 譚友亮(Charles Tan)
日  期:	 2013-3-6
作  用:  退出連接
形參數:  
返回值:  
修改記錄:                                             
************************************************************************/
void CADOConn::ExitConnect()
{
	try
	{
		if (m_pRecordset != NULL)
		{
			m_pRecordset->Close();
		}
		if (m_pConnection != NULL)
		{
			m_pConnection->Close();
		}

		m_pRecordset = NULL;
		m_pConnection = NULL;
		
		//釋放OLE/COM庫環境
		::CoUninitialize();
	}
	catch (_com_error e) 
	{
		AfxMessageBox(e.Description());
	}
}

/************************************************************************
函數名:  InitList
作  者:	 譚友亮(Charles Tan)
日  期:	 2013-3-19
作  用:  初始化列表
形參數:  
返回值:  
修改記錄:                                             
************************************************************************/
BOOL CADOConn::InitList(CListCtrl *listMain)
{
	int iMaxCol = 0, i;
	_variant_t vIndex;
	
	vIndex.vt = VT_I2;
	iMaxCol = m_pRecordset->Fields->Count;
	listMain->SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);

	for(i = 0; i < iMaxCol; i++)
	{
		CString strTitle;
		vIndex.iVal = i;
		strTitle = (LPCTSTR)m_pRecordset->Fields->GetItem(vIndex)->GetName();
		listMain->InsertColumn(i, strTitle, LVCFMT_CENTER, 100, 0);
	}

	int iWidth = 0;
	for(i = 0; i < iMaxCol; i++)
	{
		listMain->SetColumnWidth(i, LVSCW_AUTOSIZE_USEHEADER);
		iWidth = iWidth + listMain->GetColumnWidth(i);
	}

	RECT rectList;
	listMain->GetWindowRect(&rectList);
	if (iWidth < (rectList.right - rectList.left))
	{
		iWidth = (rectList.right - rectList.left - iWidth) / iMaxCol;
	}
	else
	{
		return TRUE;
	}

	for(i = 0; i < iMaxCol; i++)
	{
		listMain->SetColumnWidth(i, listMain->GetColumnWidth(i) + iWidth);
	}

	return TRUE;
}

/************************************************************************
函數名:  FillList
作  者:	 譚友亮(Charles Tan)
日  期:	 2013-3-19
作  用:  填充列表
形參數:  
返回值:  
修改記錄:                                             
************************************************************************/
BOOL CADOConn::FillList(CListCtrl *listMain)
{

	int i, iType, iRow = 0, listWidth = 0;//iType:字段集的數據類型 listWidth:列表中列的寬度
	_variant_t vIndex;
	long lMax = 0;
	lMax = m_pRecordset->Fields->Count;
	vIndex.vt = VT_I2;
	if(!m_pRecordset->adoEOF)
	{	
		MoveFirst();
		while (!m_pRecordset->adoEOF)
		{
			for (i=0; i<lMax; i++)
			{
				CString strValue="";
				vIndex.iVal = i;
				iType = m_pRecordset->Fields->GetItem(vIndex)->GetType();
				switch(iType)
				{
				case ado_Field_Str:
				case ado_Field_Text:
					strValue = GetItemString(i);
					break;
				case ado_Field_Long:
					strValue.Format(_T("%d"), GetItemLong(i));
					break;
				case ado_Field_Int:
					strValue.Format(_T("%d"), GetItemInt(i));
					break;
//				case ado_Field_Float:
//					strValue=GetValueFloatStr(i,0,2);
//					break;
//				case ado_Field_Double:
//					strValue=GetValueDoubleStr(i,0,2);
//					break;
//				case ado_Field_Byte:
//					strValue=GetValueByteStr(i,0);
//					break;
				case ado_Field_Date:
					strValue = GetItemString(i);
					break;
				default:
					strValue = "";
					break;
				}

				if(i == 0)
					listMain->InsertItem(iRow, strValue, 0);
				else
					listMain->SetItemText(iRow, i, strValue);
			}
			m_pRecordset->MoveNext();
		}
		//移向開頭
		MoveFirst();
	}

	return TRUE;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章