閱讀737 返回首頁    go 阿裏雲 go 技術社區[雲棲]


VC++/MFC自己封裝好的一個訪問數據庫的類

這個類是我在做一個小實驗時寫的,由於很少使用VC++,所以做出來的類可能不太好,如何有什麼意義或者建議,請留言!謝謝!

#pragma once

//
// 頭文件聲明--Ado.h
// 提供數據庫訪問操作的類的聲明部分
// 開發者:  黃儀標
// 開發日期:2013年4月13日 
//

//
// 必須添加這個,才能引入這些庫函數
#import "E:\Program Files\common files\system\ado\msado15.dll" \
	     no_namespace rename("EOF","AdoEOF") rename("BOF","AdoBOF")

//			 
// 類的聲明
class CAdo
{
	// 私有成員變量

private:
	// 執行T-SQL語句的命令對象指針
	_CommandPtr m_pCmd;

	// 連接數據庫的連接對象指針
	_ConnectionPtr m_pConn;

	// 數據結果集對象指針
	_RecordsetPtr m_pRecordset;

	// 數據庫連接字符串
	CString m_szConnectionString;

	// 記錄出錯信息
	CString m_szErrorMsg;


	// 公有成員函數
public:
	//
	// 默認構造函數
	// 初始化數據庫連接字符串
	CAdo(void);

	//
	// 虛構造函數
	// 釋放內存
	virtual ~CAdo(void);

	/******************************************************************************
	*函數名:   CreateConnection
	*功能描述: 創建數據庫連接對象
	*前置條件: 數據庫連接對象不存在
	*後置條件: 創建完成一個數據庫連接對象
	*返回值:   TRUE--創建數據庫連接對象成功
	*           FALSE--創建數據庫連接對象失敗
	*******************************************************************************/
	bool CreateConnection();

	/******************************************************************************
	*函數名:   CreateCommand
	*功能描述: 創建數據庫命令對象
	*前置條件: 數據庫命令對象不存在
	*後置條件: 創建完成一個數據庫命令對象
	*返回值:   TRUE--創建數據庫命令對象成功
	*           FALSE--創建數據庫命令對象失敗
	*******************************************************************************/
	bool CreateCommand();

	/******************************************************************************
	*函數名:   CreateRecordset
	*功能描述: 創建結果集對象
	*前置條件: 結果集對象不存在
	*後置條件: 創建完成一個結果集對象
	*返回值:   TRUE--創建結果集對象成功
	*           FALSE--創建結果集對象失敗
	*******************************************************************************/
	bool CreateRecordset();

	/******************************************************************************
	*函數名:   OpenConnection
	*功能描述: 打開數據庫
	*前置條件: 數據庫連接對象不為空
	*後置條件: 打開數據庫以提供後續操作
	*返回值:   TRUE--打開數據庫成功
	*           FALSE--打開數據庫失敗
	*******************************************************************************/
	bool OpenConnection();

	/******************************************************************************
	*函數名:   CloseConnection
	*功能描述: 關閉數據庫
	*前置條件: 數據庫連接對象不為空
	*後置條件: 關閉數據庫以提供後續操作
	*返回值:   TRUE--關閉數據庫成功
	*           FALSE--關閉數據庫失敗
	*******************************************************************************/
	bool CloseConnection();

	/******************************************************************************
	*函數名:   OpenRecordset
	*功能描述: 打開結果集對象
	*前置條件: 數據庫結果集對象不為空
	*後置條件: 打開結果集對象以提供後續操作
	*參數:     T-SQL語句
	*返回值:   TRUE--打開結果集對象成功
	*           FALSE--打開結果集對象失敗
	*******************************************************************************/
	bool OpenRecordset(CString szSQL);

	/******************************************************************************
	*函數名:   CloseRecordset
	*功能描述: 關閉結果集對象
	*前置條件: 結果集對象不為空
	*後置條件: 關閉結果集對象以提供後續操作
	*返回值:   TRUE--關閉結果集對象成功
	*           FALSE--關閉結果集對象失敗
	*******************************************************************************/
	bool CloseRecordset();

	/******************************************************************************
	*函數名:   IsConnected
	*功能描述: 判斷數據庫連接是否已經連接
	*前置條件: 數據庫連接對象已經存在
	*後置條件: 返回連接對象的連接狀態真假值
	*返回值:   TRUE--數據庫連接對象已經處於連接狀態
	*           FALSE--數據庫連接對象已經不處於連接狀態
	*******************************************************************************/
	bool IsConnected();

	/******************************************************************************
	*函數名:   IsRecordsetOpened
	*功能描述: 判斷數據庫結果集對象是否已經打開
	*前置條件: 數據庫結果集對象已經存在
	*後置條件: 返回結果集對象的連接狀態真假值
	*返回值:   TRUE--數據庫結果集對象已經處於連接狀態
	*           FALSE--數據庫結果集對象已經不處於連接狀態
	*******************************************************************************/
	bool IsRecordsetOpened();

	/******************************************************************************
	*函數名:   IsEndRecordset
	*功能描述: 判斷數據庫結果集對象是否已經到達末尾
	*前置條件: 數據庫結果集對象已經存在
	*後置條件: 返回結果集對象是否到達末尾真假值
	*返回值:   TRUE--數據庫結果集對象已經到達末尾
	*           FALSE--數據庫結果集對象還沒有到達末尾
	*******************************************************************************/
	bool IsEndRecordset();

	/******************************************************************************
	*函數名:   MoveToNext
	*功能描述: 移到到下一行
	*前置條件: 數據庫結果集有數據
	*後置條件: 遊標移到下一行
	*******************************************************************************/
	void MoveToNext();

	/******************************************************************************
	*函數名:   MoveToPrevious
	*功能描述: 移到到上一行
	*前置條件: 數據庫結果集有數據
	*後置條件: 遊標移到上一行
	*******************************************************************************/
	void MoveToPrevious();

	/******************************************************************************
	*函數名:   MoveToFirst
	*功能描述: 遊標移到首行
	*前置條件: 數據庫結果集有數據
	*後置條件: 將遊標移到首行
	*******************************************************************************/
	void MoveToFirst();

	/******************************************************************************
	*函數名:   MoveToLast
	*功能描述: 遊標移到最後一行
	*前置條件: 數據庫結果集有數據
	*後置條件: 將遊標移到結果集最後一行
	*******************************************************************************/
	void MoveToLast();

	/******************************************************************************
	*函數名:   GetRecordCount
	*功能描述: 判斷數據庫結果集中記錄的條數
	*前置條件: 數據庫結果集對象已經存在
	*後置條件: 返回結果集記錄的條數
	*返回值:   long類型--記錄的條數
	*******************************************************************************/
	long GetRecordCount();

	/******************************************************************************
	*函數名:   ExecuteByConnection
	*功能描述: 執行增、刪、改操作
	*前置條件: 數據庫已經連接上
	*後置條件: 返回受影響的行數
	*返回值:   TRUE--操作成功
	*           FALSE-操作失敗
	*參數:     T-SQL語句:szSQL:CString類型
	*******************************************************************************/
	bool ExecuteByConnection(CString szSQL);

	/******************************************************************************
	*函數名:   GetErrorMsg
	*功能描述: 獲取出錯的信息
	*後置條件: 返回出錯信息
	*返回值:   出錯的信息--類型:CString
	*******************************************************************************/
	CString GetErrorMsg();

	/******************************************************************************
	*函數名:   GetFieldValue
	*功能描述: 獲取字段值
	*前置條件: 結果集有數據
	*後置條件: 返回指定的字段的值
	*返回值:   TRUE--獲取到字段的值
	*           FALSE-獲取不到字段的值
	*參數:     pFieldName : cahr *類型--標識字段名
	*           strValue: CString類型--標識指定的字段的值
	*******************************************************************************/
	bool GetFieldValue(char * pFieldName, CString& strValue);

	/******************************************************************************
	*函數名:   IsFieldValueHasExisted
	*功能描述: 判斷指定的字段值是否已在存在
	*返回值:   TRUE--指定的字段的值已經存在
	*           FALSE-指定的字段的值不存在
	*參數:     pFieldName : cahr *類型--標識字段名
	*           strValue: CString類型--標識指定的字段的值
	*******************************************************************************/
	bool IsFieldValueHasExisted(char * pFieldName, CString& strValue);
};

#include <stdio.h>
#include <stdio.h>
#include <malloc.h>

#include "StdAfx.h"
#include "Ado.h"

//
// Ado.h頭文件的實現部分
//

//
// 默認構造函數
// 初始化數據庫連接字符串
// 初始化OLE庫
CAdo::CAdo(void)
{
	m_szErrorMsg = "";

	// 默認數據庫連接字符串
	m_szConnectionString = "Provider=SQLOLEDB.1;Password=tianshi520;Persist Security Info=True;User ID=sa; \
						    Initial Catalog=DbSencondExperiment;Data Source=標哥-PC\\SQL2005"; 

	// 初始化OLE庫
	CoInitialize(NULL);

	// 創建命令對象
	CreateCommand();

	// 創建連接對象
	CreateConnection();
	
	// 創建結果集對象
	CreateRecordset();
}

//
// 析構函數
//
CAdo::~CAdo(void)
{	
	// 執行清理內存工作
	CloseConnection();
	CloseRecordset();

	if (m_pCmd)  
	{
		m_pCmd.Release();
	}

	if (m_pRecordset)
	{
		m_pRecordset.Release();
	}

	if (m_pConn)
	{
		m_pConn.Release();
	}	
}

/******************************************************************************
*函數名:   CreateConnection
*功能描述: 創建數據庫連接對象
*前置條件: 數據庫連接對象不存在
*後置條件: 創建完成一個數據庫連接對象
*返回值:   TRUE--創建數據庫連接對象成功
*           FALSE--創建數據庫連接對象失敗
*******************************************************************************/
bool CAdo::CreateConnection()
{
	// 如果創建失敗,則返回FALSE
	if (FAILED(m_pConn.CreateInstance(__uuidof(Connection))))
	{
		return FALSE;
	}

	return TRUE;
}

/******************************************************************************
*函數名:   CreateCommand
*功能描述: 創建數據庫命令對象
*前置條件: 數據庫命令對象不存在
*後置條件: 創建完成一個數據庫命令對象
*返回值:   TRUE--創建數據庫命令對象成功
*           FALSE--創建數據庫命令對象失敗
*******************************************************************************/
bool CAdo::CreateCommand()
{
	if (FAILED(m_pCmd.CreateInstance(__uuidof(Command))))
	{
		return FALSE;
	}

	return TRUE;
}

/******************************************************************************
*函數名:   CreateRecordset
*功能描述: 創建結果集對象
*前置條件: 結果集對象不存在
*後置條件: 創建完成一個結果集對象
*返回值:   TRUE--創建結果集對象成功
*           FALSE--創建結果集對象失敗
*******************************************************************************/
bool CAdo::CreateRecordset()
{
	if (FAILED(m_pRecordset.CreateInstance(__uuidof(Recordset))))
	{
		return FALSE;
	}

	return TRUE;
}

/******************************************************************************
*函數名:   OpenConnection
*功能描述: 打開數據庫
*前置條件: 數據庫連接對象不為空
*後置條件: 打開數據庫以提供後續操作
*返回值:   TRUE--打開數據庫成功
*           FALSE--打開數據庫失敗
*******************************************************************************/
bool CAdo::OpenConnection()
{
	try
	{
		// 關閉當前連接對象
		CloseConnection();

		// 用FAILED來測試,不能用!來測試
		if (FAILED(m_pConn->Open(_bstr_t(m_szConnectionString), "", "", adModeUnknown)))
		{
			return FALSE;
		}
        
		if (FAILED(CreateCommand()))
		{
			return FALSE;
		}

		m_pConn->CursorLocation = adUseClient;
		m_pCmd->ActiveConnection = m_pConn;

		return TRUE;
	}
	catch (_com_error &e)
	{
		m_szErrorMsg = e.ErrorMessage();
		return FALSE;
	}
}


/******************************************************************************
*函數名:   CloseConnection
*功能描述: 關閉數據庫
*前置條件: 數據庫連接對象不為空
*後置條件: 關閉數據庫以提供後續操作
*返回值:   TRUE--關閉數據庫成功
*           FALSE--關閉數據庫失敗
*******************************************************************************/
bool CAdo::CloseConnection()
{
	try	
	{
		// 關閉結果集
		CloseRecordset();

		// 關閉連接對象
		if (m_pConn != NULL && m_pConn->GetState() != adStateClosed)
		{
			m_pConn->Close();
		}

		return true;	
	}
	catch(_com_error& e)	
	{
		m_szErrorMsg = e.ErrorMessage();
		return false;
	}	
}

/******************************************************************************
*函數名:   CloseRecordset
*功能描述: 關閉結果集對象
*前置條件: 結果集對象不為空
*後置條件: 關閉結果集對象以提供後續操作
*返回值:   TRUE--關閉結果集對象成功
*           FALSE--關閉結果集對象失敗
*******************************************************************************/
bool CAdo::CloseRecordset()
{
	try
	{		
		if(IsRecordsetOpened())
			m_pRecordset->Close();	
		return true;		
	}
	catch(_com_error& e)
	{		
		m_szErrorMsg = e.ErrorMessage();	
		return false;
	}		
}

/******************************************************************************
*函數名:   IsConnected
*功能描述: 判斷數據庫連接是否已經連接
*前置條件: 數據庫連接對象已經存在
*後置條件: 返回連接對象的連接狀態真假值
*返回值:   TRUE--數據庫連接對象已經處於連接狀態
*           FALSE--數據庫連接對象已經不處於連接狀態
*******************************************************************************/
bool CAdo::IsConnected()
{
	if (m_pConn == NULL)
	{
		return FALSE;
	}

	if (m_pConn->GetState() == adStateClosed)
	{
		return FALSE;
	}

	return TRUE;
}

/******************************************************************************
*函數名:   IsRecordsetOpened
*功能描述: 判斷數據庫結果集對象是否已經打開
*前置條件: 數據庫結果集對象已經存在
*後置條件: 返回結果集對象的連接狀態真假值
*返回值:   TRUE--數據庫結果集對象已經處於連接狀態
*           FALSE--數據庫結果集對象已經不處於連接狀態
*******************************************************************************/
bool CAdo::IsRecordsetOpened()
{
	if (m_pRecordset == NULL)
	{
		return FALSE;
	}

	if (m_pRecordset->GetState() == adStateClosed)
	{
		return FALSE;
	}

	return TRUE;
}

/******************************************************************************
*函數名:   IsEndRecordset
*功能描述: 判斷數據庫結果集對象是否已經到達末尾
*前置條件: 數據庫結果集對象已經存在
*後置條件: 返回結果集對象是否到達末尾真假值
*返回值:   TRUE--數據庫結果集對象已經到達末尾
*           FALSE--數據庫結果集對象還沒有到達末尾
*******************************************************************************/
bool CAdo::IsEndRecordset()
{
	try
	{
		if (m_pRecordset->AdoEOF == VARIANT_TRUE)
		{
			return TRUE;
		}
	}
	catch (_com_error &e)
	{
		m_szErrorMsg = e.ErrorMessage();
		return FALSE;
	}

	return FALSE;
}

/******************************************************************************
*函數名:   MoveToNext
*功能描述: 移到到下一行
*前置條件: 數據庫結果集有數據
*後置條件: 遊標移到下一行
*******************************************************************************/
void CAdo::MoveToNext()
{
	try
	{
		if (!IsEndRecordset())
		{
			m_pRecordset->MoveNext();
		}
	}
	catch (_com_error &e)
	{
		m_szErrorMsg = e.ErrorMessage();
	}
}

/******************************************************************************
*函數名:   MoveToPrevious
*功能描述: 移到到上一行
*前置條件: 數據庫結果集有數據
*後置條件: 遊標移到上一行
*******************************************************************************/
void CAdo::MoveToPrevious()
{
	try
	{
		// 隻有結果集處於打開狀態,且記錄行數至少要有2行
		if (IsRecordsetOpened() && GetRecordCount() >= 2)
		{
			m_pRecordset->MovePrevious();
		}
	}
	catch (_com_error &e)
	{
		m_szErrorMsg = e.ErrorMessage();
	}
}

/******************************************************************************
*函數名:   MoveToFirst
*功能描述: 遊標移到首行
*前置條件: 數據庫結果集有數據
*後置條件: 將遊標移到首行
*******************************************************************************/
void CAdo::MoveToFirst()
{
	try
	{
		// 隻有結果集處於打開狀態,且記錄行數至少要有一行
		if (IsRecordsetOpened() && GetRecordCount() >= 1)
		{
			m_pRecordset->MoveFirst();
		}
	}
	catch (_com_error &e)
	{
		m_szErrorMsg = e.ErrorMessage();
	}
}

/******************************************************************************
*函數名:   MoveToLast
*功能描述: 遊標移到最後一行
*前置條件: 數據庫結果集有數據
*後置條件: 將遊標移到結果集最後一行
*******************************************************************************/
void CAdo::MoveToLast()
{
	try
	{
		// 隻有結果集處於打開狀態,且記錄行數至少要有一行
		if (IsRecordsetOpened() && GetRecordCount() >= 1)
		{
			m_pRecordset->MoveLast();
		}
	}
	catch (_com_error &e)
	{
		m_szErrorMsg = e.ErrorMessage();
	}
}


/******************************************************************************
*函數名:   GetRecordCount()
*功能描述: 判斷數據庫結果集中記錄的條數
*前置條件: 數據庫結果集對象已經存在
*後置條件: 返回結果集記錄的條數
*返回值:   long類型--記錄的條數
*******************************************************************************/
long CAdo::GetRecordCount()
{
	try
	{
		if (m_pRecordset == NULL)
			return 0;

		// 返回記錄行數
		return m_pRecordset->GetRecordCount();
	}
	catch (_com_error &e)
	{
		m_szErrorMsg = e.ErrorMessage();            // 記錄出錯信息
	}

	return FALSE;
}

/******************************************************************************
*函數名:   OpenRecordset
*功能描述: 打開結果集對象
*前置條件: 數據庫結果集對象不為空
*後置條件: 打開結果集對象以提供後續操作
*參數:     T-SQL語句
*返回值:   TRUE--打開結果集對象成功
*           FALSE--打開結果集對象失敗
*******************************************************************************/
bool CAdo::OpenRecordset(CString szSQL)
{
	try
	{
		// 如果關閉時不出現異常
		if (OpenConnection() && CloseRecordset())
		{
			m_pRecordset->Open((_variant_t)szSQL,          // T-SQL語句
				                m_pConn.GetInterfacePtr(), // 連接對象接口
				                adOpenDynamic,             // 動態打開 
				                adLockOptimistic,          // 鎖定
				                adCmdText);                // 操作類型為命令文本
		}
		return TRUE;
	}
	catch (_com_error &e)
	{
		m_szErrorMsg = e.ErrorMessage();                  // 記錄出錯信息
		return FALSE;
	}
}

/******************************************************************************
*函數名:   ExecuteByConnection
*功能描述: 執行增、刪、改操作
*前置條件: 數據庫已經連接上
*後置條件: 返回受影響的行數
*返回值:   TRUE--操作成功
*           FALSE-操作失敗
*參數:     T-SQL語句:szSQL:CString類型
*******************************************************************************/
bool CAdo::ExecuteByConnection(CString szSQL)
{
	try
	{
		// 如果打開失敗,則退出
		if (!OpenConnection())
		{
			return FALSE;
		}

		// 受影響的行數
		_variant_t recordAffected;
	    m_pConn->Execute(_bstr_t(szSQL), &recordAffected, adCmdText);
	}
	catch (_com_error &e)
	{
		m_szErrorMsg = e.ErrorMessage();
		return FALSE;
	}

	return TRUE;
}


/******************************************************************************
*函數名:   GetErrorMsg
*功能描述: 獲取出錯的信息
*後置條件: 返回出錯信息
*返回值:   出錯的信息--類型:CString
*******************************************************************************/
CString CAdo::GetErrorMsg()
{
	return m_szErrorMsg;
}

/******************************************************************************
*函數名:   GetFieldValue
*功能描述: 獲取字段值
*前置條件: 結果集有數據
*後置條件: 返回指定的字段的值
*返回值:   TRUE--獲取到字段的值
*           FALSE-獲取不到字段的值
*參數:     pFieldName : cahr *類型--標識字段名
*           strValue: CString類型--標識指定的字段的值
*******************************************************************************/
bool CAdo::GetFieldValue(char * pFieldName, CString& strValue)
{
     try
	 {
		 if (!IsRecordsetOpened())
			 return FALSE;

		 // 獲取字段值
		 _variant_t vtFieldValue = m_pRecordset->Fields->GetItem(pFieldName)->Value;
		 
		 if (vtFieldValue.vt == VT_BSTR)  // 如果是字符串類型
		 {
			 strValue = (char *)(_bstr_t)vtFieldValue;
			 strValue.Trim();
			 return true;
		 }
	 }
	 catch (_com_error &e)
	 {
		 m_szErrorMsg = e.ErrorMessage();
	 }

	 return FALSE;
}

/******************************************************************************
*函數名:   IsFieldValueHasExisted
*功能描述: 判斷指定的字段值是否已在存在
*返回值:   TRUE--指定的字段的值已經存在
*           FALSE-指定的字段的值不存在
*參數:     pFieldName : cahr *類型--標識字段名
*           strValue: CString類型--標識指定的字段的值
*******************************************************************************/
bool CAdo::IsFieldValueHasExisted(char * pFieldName, CString& strValue)
{
	try
	{
		CString strTempValue;

		// 獲取字段值
		if (GetFieldValue(pFieldName, strTempValue))
		{
			if (strTempValue.Trim() == strValue)
			{
				return TRUE;
			}
		}
	}
	catch (_com_error &e)
	{
		m_szErrorMsg = e.ErrorMessage();
	}

	return FALSE;
}


最後更新:2017-04-03 20:51:32

  上一篇:go 國內首套免費的《Nutch相關框架視頻教程》(1-16)
  下一篇:go 使用Eclipse調試Java程序的10個技巧