📄 ado_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 + -