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

📄 ado_access.cpp

📁 一个可以读取Access数据库表的简单实例.可应用于办公室系统中.
💻 CPP
字号:
//=======================================================================================================================
//
//  文件: ADO.CPP
//
//  版本: V3.0
//
//  描述:
//
//  作者: 徐力
//
//  创建日期:2003-2-17
//
//  修改历史:	日期		修改内容
//				2004-8-27	read all table name
//
//
//=======================================================================================================================

#include "stdafx.h"
#include "Ado_Access.h"
     
#include "Xdebug.h"


#define  RUN( s ) { if ( ! s ) return FALSE ;  }	
#define	 Return_False_AS_NotOpen  { if ( ! Is_NotOpen () ) return FALSE ; } 	
#define	 Return_Int_AS_NotOpen  { if ( ! Is_NotOpen () ) return -1 ; } 	


BOOL CAdo :: Is_NotOpen ( void )
{
	if ( m_pRS == NULL )
		return FALSE ;

	try 
	{
		if ( m_pRS->State == adStateClosed ) 
			return FALSE ;
	}
	catch ( ... )
	{
		return FALSE ;
	}
	return TRUE ;
}

void CAdo :: Var_Safe ( _variant_t & va ) 
{
	if ( va.vt == VT_NULL )
		va.SetString ( "0" ) ;
}


BOOL CAdo :: Show_Err ( void ) 
{
	if ( ! m_bShowErr )
		return FALSE ;

	long errorcount = m_pConn->GetErrors ()->GetCount () ;
	
	_bstr_t add ;
	CString ErrorMessage , temp ;
	
	if ( errorcount == 0 )
	{
		ErrorMessage.Format ( "发生sql的未知错误!" ) ;
	}
	else
	{
		for ( short i = 0 ; i < errorcount ; i++ )
		{
			add = m_pConn->GetErrors()->GetItem (_variant_t( ( short) i ) )->GetDescription () ;
			temp = ( char * ) add ;
			ErrorMessage += temp ;
		}
	}
	
	AfxMessageBox ( ErrorMessage ) ;
	return FALSE ;
}



//=========================================================================================================================
//功能:
//
//参数:
//返回:	
//
//=========================================================================================================================
CAdo :: CAdo () 
{
	m_pConn = NULL ;
	m_pRS = NULL ;
	
	m_OpenMode = adOpenStatic ;
	m_TableName.Empty () ;
	
	m_bShowErr = FALSE ;
}

CAdo :: ~ CAdo () 
{
	Close_Table () ;
	Close_Connect () ;
}

void CAdo :: Init ( void )
{
	m_vaBookMark.vt = VT_EMPTY ;
}


//=========================================================================================================================
//功能:
//
//参数:
//		1. m_pConn		(in)
//		2. DSN		(in)
//		3. UID		(in)
//		4. PWS		(in)
//		5. m_pRS		(in)
//		6. Table_Name		(in)
//返回:	
//
//=========================================================================================================================
BOOL CAdo :: Open_Connect ( CString strDB ) 
{
	HRESULT hr ;
	try
	{
		hr = m_pConn.CreateInstance("ADODB.Connection");///创建m_pConnection对象
		if(SUCCEEDED(hr))
		{
			m_pConn->ConnectionTimeout = 30 ; //可以延时N秒. 
			
			CString str ;
			//str.Format ( "driver={SQL Server};Server=%s;DATABASE=%s;UID=%s;PWD=%s" , IP , DB , UID , PWD ) ;
			str.Format ( "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s" , strDB ) ;
			_bstr_t var_str ( str ) ;
			hr =m_pConn->Open ( var_str ,"","",adModeUnknown); //dsn		
			
		}
		else
		{
			AfxMessageBox ( "m_pConn create ERR ! " ) ;
		}
	}
	catch ( ... )
	{
		return Show_Err () ;
	} 
	
	//get all table name .
	Get_All_Table_Name () ;

	return TRUE ;
}

BOOL CAdo :: Close_Connect ( void ) 
{
	if ( m_pConn )
	{
		try
		{
			m_pConn->Close() ;
			m_pConn = NULL ;
		}
		catch ( ... )
		{
			return Show_Err () ; 
		}
	}
	return TRUE ;
}	


//=========================================================================================================================
//功能:
//
//参数:
//		1. Table		(in)
//返回:	
//
//=========================================================================================================================
BOOL CAdo :: Open_Table ( CString Table ) 
{
	Init () ;
	Close_Table () ;

	HRESULT hr ;
	try
	{
		hr = m_pRS.CreateInstance("ADODB.Recordset");
		
		m_TableName = Table ;
		CString str ;
		str.Format ( "SELECT * FROM %s" , Table ) ;
		_variant_t var_str ( str ) ;
	//	m_pRS->Open ( var_str , _variant_t ( ( IDispatch * ) m_pConn , true ) , adOpenStatic , adLockOptimistic , adCmdText ) ;
		m_pRS->Open ( var_str , _variant_t ( ( IDispatch * ) m_pConn , true ) , m_OpenMode , adLockOptimistic , adCmdText ) ;
/*
enum CursorTypeEnum
{
adOpenUnspecified = -1,///不作特别指定
adOpenForwardOnly = 0,///前滚静态光标。这种光标只能向前浏览记录集,比如用MoveNext向前滚动,这种方式可以提高浏览速度。但诸如BookMark,RecordCount,AbsolutePosition,AbsolutePage都不能使用
adOpenKeyset = 1,///采用这种光标的记录集看不到其它用户的新增、删除操作,但对于更新原有记录的操作对你是可见的。
adOpenDynamic = 2,///动态光标。所有数据库的操作都会立即在各用户记录集上反应出来。
adOpenStatic = 3///静态光标。它为你的记录集产生一个静态备份,但其它用户的新增、删除、更新操作对你的记录集来说是不可见的。
};

enum LockTypeEnum
{
adLockUnspecified = -1,///未指定
adLockReadOnly = 1,///只读记录集
adLockPessimistic = 2,悲观锁定方式。数据在更新时锁定其它所有动作,这是最安全的锁定机制
adLockOptimistic = 3,乐观锁定方式。只有在你调用Update方法时才锁定记录。在此之前仍然可以做数据的更新、插入、删除等动作
adLockBatchOptimistic = 4,乐观分批更新。编辑时记录不会锁定,更改、插入及删除是在批处理模式下完成。
}; 
*/
	}
	catch ( ... ) 
	{
		return Show_Err () ;
	}	

	return TRUE ;
}

BOOL CAdo :: Open_Table ( CString Table , CString Condition ) 
{
	Init () ;
	Close_Table () ;
	
	HRESULT hr ;
	try
	{
		hr = m_pRS.CreateInstance("ADODB.Recordset");
		
		m_TableName = Table ;
		
		CString str ;
		if ( Condition.IsEmpty() )
			str.Format ( "SELECT * FROM %s" , Table ) ;
		else
			str.Format ( "SELECT * FROM %s WHERE %s " , Table , Condition ) ;

		_variant_t var_str ( str ) ;
		m_pRS->Open ( var_str , _variant_t((IDispatch*)m_pConn,true) , m_OpenMode , adLockOptimistic , adCmdText ) ;
	}
	catch(_com_error e)///捕捉异常
	{
		return Show_Err () ;
	}	
	
	return TRUE ;
}

BOOL CAdo :: Open_Table_EX ( CString strSelect ) 
{
	Init () ;
	Close_Table () ;
	
	HRESULT hr ;
	try
	{
		hr = m_pRS.CreateInstance("ADODB.Recordset");
		_variant_t var_str ( strSelect ) ;
		m_pRS->Open ( var_str , _variant_t((IDispatch*)m_pConn,true) , m_OpenMode , adLockOptimistic,adCmdText);
	}
	catch(_com_error e)///捕捉异常
	{
		return Show_Err () ;
	}	
	
	return TRUE ;	
}


BOOL CAdo :: Close_Table ( void ) 
{
	Return_False_AS_NotOpen

	try 
	{
		m_pRS->Close () ;
		m_pRS = NULL ;
	}
	catch ( ... )
	{
		return Show_Err () ;
	}

	return TRUE ; 
}

BOOL CAdo :: Is_Opened ( void ) 
{
	if ( m_pRS->State == adStateClosed )
		return FALSE ;
	else
		return TRUE ;
}

//=========================================================================================================================
//功能:
//
//参数:
//		1. void		(in)
//返回:	
//
//=========================================================================================================================
BOOL CAdo :: To_First ( void ) 
{
	Return_False_AS_NotOpen
	
	BOOL bRet = TRUE ;

	if ( m_pRS->BOF )
	{
		bRet =  FALSE ;
		return bRet ;
	}

	HRESULT hr  ;
	try 
	{
		hr = m_pRS->MoveFirst () ;
	}
	catch ( ... )
	{
		return Show_Err () ;
	}
	
	return bRet ;
}

BOOL CAdo :: To_Previous ( void ) 
{
	BOOL bRet = TRUE ;
	Return_False_AS_NotOpen

	if ( m_pRS->BOF )
	{
		To_First () ;
		return FALSE ;
	}
	
	try
	{
		m_pRS->MovePrevious () ;
	}
	catch ( ... )
	{
		Show_Err () ;
		bRet = FALSE ;

	}

	return bRet ;
}

BOOL CAdo :: To_Next ( void ) 
{
	BOOL bRet = TRUE ;
	Return_False_AS_NotOpen

	try 
	{
		m_pRS->MoveNext	() ;
	}
	catch ( ... )
	{

		Show_Err () ;
		bRet = FALSE ;
	}

	return bRet ;
}

BOOL CAdo :: To_Last ( void ) 
{
	Return_False_AS_NotOpen

	BOOL bRet = TRUE ;

	if ( m_pRS->adoEOF )
	{
		bRet = FALSE ;
		return bRet ;
	}		
	
	try 
	{
		m_pRS->MoveLast () ;
	}
	catch ( ... )
	{
		return Show_Err () ;
	}

	return bRet ;
}

//No从0开始起算.
BOOL CAdo :: Goto ( int No ) 
{
	Return_False_AS_NotOpen	

	if ( No < 0 )
		return FALSE ;
	
	LONG Count = m_pRS->RecordCount ;
	if ( No >= Count )
		return FALSE ;

	m_pRS->AbsolutePosition = ( PositionEnum ) ( No + 1 ) ;
	
	return TRUE ;
}


BOOL CAdo :: Is_Begin ( void ) 
{
	Return_False_AS_NotOpen
	
	if ( m_pRS->BOF )
		return TRUE ;
	else	
		return FALSE ; 
}


BOOL CAdo :: Is_End ( void ) 
{
	Return_False_AS_NotOpen
		
	if ( m_pRS->adoEOF )
		return TRUE ;
	else
		return FALSE ; 
}


//=========================================================================================================================
//功能:
//
//参数:
//		1. Field		(in)
//		2. Content		(in)
//返回:	
//
//=========================================================================================================================
BOOL CAdo :: Find ( CString strCondtion ) 
{
	if ( m_pRS == NULL )
		return FALSE ;
	
	if ( m_pRS->State != adStateClosed )
		m_pRS->Close () ;
		
	CString str ;
	str.Format ( "select * from %s where %s" , m_TableName , strCondtion ) ;
	_bstr_t sql_string ( str ) ;
	
	try
	{
		m_pRS->Open ( sql_string , _variant_t ( ( IDispatch * ) m_pConn , true ) , adOpenStatic , adLockOptimistic , adCmdText ) ;
	}
	catch ( ... ) 
	{
		return Show_Err () ;
	}	
	
	if ( Is_End () )
		return FALSE ;
	
	return TRUE ;
}

//=========================================================================================================================
//功能:
//
//参数:
//		1. Field		(in)
//返回:	
//
//=========================================================================================================================
_variant_t CAdo :: Get_Item ( CString Field ) 
{
	_variant_t va ;

	if ( m_pRS->State == adStateClosed )
	{
		va.vt = VT_EMPTY ;
		return va ;
	}
	
	try 
	{
		va = m_pRS->Fields->GetItem ( _variant_t ( Field ) )->Value ;
	}
	catch ( ... )
	{
		Show_Err () ;
	}
	
	Var_Safe ( va ) ;
	
	return va ;
}

_variant_t CAdo :: Get_Item ( int Col_Index ) 
{
	_variant_t va ;

	if ( m_pRS->State == adStateClosed )
	{
		va.vt = VT_EMPTY ;
		return va ;
	}
	
	try
	{
		va = m_pRS->Fields->GetItem ( long ( Col_Index ) )->Value ;
	}
	catch ( ... ) 
	{
		Show_Err () ;
	}
	
	Var_Safe ( va ) ;
	
	return va ;
}


BOOL CAdo :: Set_Item ( CString Field , _variant_t New_Content ) 
{
	Return_False_AS_NotOpen

	try 
	{
		m_pRS->Fields->GetItem ( _variant_t ( Field ) )->Value = New_Content ;
	}
	catch ( ... )
	{
		return Show_Err () ;
	}

	return TRUE ;
}

BOOL CAdo :: Set_Item ( int Col_Index , _variant_t New_Content ) 
{
	Return_False_AS_NotOpen
		
	try
	{
		m_pRS->Fields->GetItem ( long ( Col_Index ) )->Value = New_Content ;
	}
	catch ( ... ) 
	{
		return Show_Err () ;
	}
	
	return TRUE ;
}


BOOL CAdo :: AddNew ( void ) 
{
	Return_False_AS_NotOpen
		
	if ( m_pRS == NULL )
		return FALSE ;
	
	try
	{
		m_pRS->AddNew () ; 	
	}
	catch ( ... ) 
	{
		return Show_Err ()  ;
	}
	
	return TRUE ; 
}

BOOL CAdo :: Update ( void ) 
{
	Return_False_AS_NotOpen
		
	try
	{
		m_pRS->Update() ;
	}
	catch ( ... ) 
	{
		return Show_Err ()  ;
	}	

	return TRUE ;
}	

BOOL CAdo :: Delete ( void ) 
{
	Return_False_AS_NotOpen
		
	if ( m_pRS->adoEOF || m_pRS->BOF )
		return FALSE ;
	
	try 
	{
		m_pRS->Delete ( adAffectCurrent ) ; 
	}
	catch ( ... ) 
	{
		return Show_Err () ;
	}

	RUN ( Update () ) ;
	
	return TRUE ;
}


BOOL CAdo :: Delete_All ( void ) 
{
	Return_False_AS_NotOpen

	CString str ;
	str.Format ( "delete from %s" , m_TableName ) ;
	_bstr_t sql_string ( str ) ;
	m_pConn->Execute ( sql_string , NULL , adExecuteNoRecords ) ;
	
	return TRUE ;
}


BOOL CAdo :: Set_BookMark ( void )
{
	Return_False_AS_NotOpen
	m_vaBookMark = m_pRS->Bookmark ;
	return TRUE ;
}

BOOL CAdo :: Goto_BookMark ( void ) 
{
	Return_False_AS_NotOpen
		
	if ( m_vaBookMark.vt == VT_NULL )
		return  FALSE ;
	m_pRS->Bookmark = m_vaBookMark ;
	return TRUE ;
}


int CAdo :: Get_Recorder_Count ( void ) 
{
	Return_Int_AS_NotOpen

	int Num ;

	try 
	{
		Num = m_pRS->RecordCount ;
	}
	catch ( ... )
	{
		Num = 0 ;
	}

	return Num ;
}

int CAdo :: Get_Recorder_Cur ( void ) 
{
	Return_Int_AS_NotOpen
	
	int Num = 1 ;
	try 
	{	
		Num = m_pRS->AbsolutePosition ;
	}
	catch ( ... )
	{
		Num = Get_Recorder_Count () ;
	}

	return Num ;
}

int CAdo :: Get_Field_Count ( void ) 
{
	Return_Int_AS_NotOpen

	int Num ;

	try
	{
		Num = m_pRS->Fields->Count ;
	}
	catch ( ... )
	{
		Num = 0 ;
	}
	
	return Num ;
}

BOOL CAdo :: Get_Field_Name ( int No , CString & strName  ) 
{
	if ( ( No < 0 ) || ( No >= m_pRS->Fields->Count ) )
		return FALSE ;

    _variant_t Index;
    Index.vt = VT_I2;
	Index.iVal = No ;

	_variant_t va = m_pRS->Fields->GetItem( Index )->Name ;
	strName = ( LPCSTR )( _bstr_t ) va ;
	
	return TRUE ;
}


int CAdo :: Get_All_Table_Name ( void ) 
{
	_RecordsetPtr  pRstSchema  = NULL;
	
	//try
	pRstSchema = m_pConn->OpenSchema ( adSchemaTables ) ;

	m_ayTableName.RemoveAll () ;
	CString Table_Name , Table_Type ;

	while(!(pRstSchema->adoEOF))
	{
		Table_Name = ( LPCSTR )( _bstr_t ) pRstSchema->GetCollect("TABLE_NAME") ;
		Table_Type = ( LPCSTR )( _bstr_t ) pRstSchema->GetCollect("TABLE_TYPE") ;

		if ( Table_Type == "TABLE" )
			m_ayTableName.Add ( Table_Name ) ;
		
		pRstSchema->MoveNext();

	}	

	if ( pRstSchema->State == 1 )
			pRstSchema->Close() ;

	int Num = m_ayTableName.GetCount () ;
	return Num ;

}

int CAdo :: Get_Table_Count ( void ) 
{
	int Num = m_ayTableName.GetCount () ;
	return Num ;
}

void CAdo :: Get_Table_Name_Array ( CStringArray & ary ) 
{
	ary.RemoveAll () ;

	int n = m_ayTableName.GetCount () ;
	for ( int i = 0 ; i < n ; i ++ )
	{
		ary.Add ( m_ayTableName [ i ] ) ;	
	}
}

⌨️ 快捷键说明

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