一个数据库操作的类

前段时间的一个项目中使用了ADO来操作数据库,总觉得每次使用起来都比较麻烦,计划抽点时间写个可以很方便使用的ADO封装类,现在终于写出了一个雏形,有什么不足之处还请各位多多指正。

这段代码中有两个类,CADODataConn中封装了一些使用ADO对数据库的操作,CRecordDBImpl中封装了一使用CADORecordBinding做数据库字段绑定操作时所需要的类。

现在这个类刚刚完成,还不成熟,希望大家多提意见,我会尽力完善它的。

编写这些代码的目的是使用Visual C++ Extensions for ADO 的数据库操作更加方便。

 

#pragma  once

#import 
" C:Program FilesCommon FilesSystemADOmsado15.dll "  rename( " EOF " " EndOfFile " ) rename( " BOF " , " FirstOfFile " )
#import 
" C:Program FilesCommon Filessystemadomsadox.dll "
#include 
< objbase.h >
#include 
< initguid.h >
#include 
< adoid.h >              //  类和接口标识 
#include  < adoint.h >              //  ADO 接口
#include  < icrsint.h >          //  ADO2.0 数据绑定扩展
#include  < string >

class  CADODataConn
{
public:
    
enum DB_ERROR_TYPE
    
{
        DB_SUCCESS    
= 0,    // 成功
        DB_BOF    = -1,    // 记录为第一条
        DB_EOF    = -2,    // 记录为最后一条
        DB_EMPTY    = -3,    // 记录集为空
        DB_ERROR    = -4    // 未知错误?
    }
;
protected:
    CADODataConn(
void);
public:
    CADODataConn(
const char v_szDBName[], const char v_szUserName[], const char v_szPassword[],const char v_szTableName[]);
    
virtual ~CADODataConn(void);
private:
    std::
string    m_strTableName;
    std::
string    m_strPassword;
    std::
string    m_strUserName;
    std::
string    m_strDBName;
private:
    ADODB::_ConnectionPtr    m_pConn;
    ADODB::_RecordsetPtr    m_pRecordset;
    IADORecordBinding
*    m_pRecordBinding;
public:
    
int ConnectDB(CADORecordBinding* const v_pRecordRs);
    
int MoveFirst(void);
    BOOL IsEOF(
void);
    BOOL IsBOF(
void);
    
int MoveLast(void);
    
int MoveNext(void);
    
int MovePrev(void);
    
int ExecuteSql(const char v_szSql[]);
    
int AddNew(CADORecordBinding* const v_pRecordRs);
    
int Update(CADORecordBinding* const v_pRecordRs);
    
void ReportComErr(_com_error& e, char v_szErrorInfo[]);
    
void PrintProviderError(char v_szErrorInfo[]);
    
int SelectRecordSet(const char v_szSqlCon[], CADORecordBinding* const v_pRecordRs);
    
void DisconnectDB(void);
}
;

 

#include  " StdAfx.h "
#include 
" .adodataconn.h "

#include 
< strstream >
#include 
< string >

inline 
void  TESTHR(HRESULT x)  {if FAILED(x) _com_issue_error(x);} ;

CADODataConn::CADODataConn(
void )
: m_pConn(NULL)
, m_pRecordset(NULL)
, m_pRecordBinding(NULL)
{
    ::CoInitialize( NULL );
}


CADODataConn::
~ CADODataConn( void )
{
    
this->DisconnectDB();
}


CADODataConn::CADODataConn(
const   char  v_szDBName[], 
                           
const   char  v_szUserName[], 
                           
const   char  v_szPassword[],
                           
const   char  v_szTableName[])
                           : m_pConn(NULL)
                           , m_pRecordset(NULL)
                           , m_pRecordBinding(NULL)
{
    ::CoInitialize( NULL );
    m_strDBName    
= v_szDBName;
    m_strUserName    
= v_szUserName;
    m_strPassword    
= v_szPassword;
    m_strTableName    
= v_szTableName;
}


int  CADODataConn::ConnectDB(CADORecordBinding *   const  v_pRecordRs)
{
    HRESULT hr 
= S_OK;

    
//try
    
//{
        TESTHR( hr = m_pConn.CreateInstance( __uuidof( ADODB::Connection ) ) );
        TESTHR( hr 
= m_pRecordset.CreateInstance( __uuidof( ADODB::Recordset) ) );

        TESTHR( m_pConn
->Open( m_strDBName.c_str(), 
                                m_strUserName.c_str(), 
                                m_strPassword.c_str(), 
                                ADODB::adConnectUnspecified));
        TESTHR( m_pRecordset
->Open( m_strTableName.c_str(),
                                    m_pConn.GetInterfacePtr(), 
                                    ADODB::adOpenDynamic, 
                                    ADODB::adLockOptimistic, 
                                    ADODB::adCmdText 
                                    ));
        TESTHR( m_pRecordset
->QueryInterface(
                                    __uuidof(IADORecordBinding),
                                    (LPVOID
*)&m_pRecordBinding
                                    ));
        TESTHR( m_pRecordBinding
->BindToRecordset( v_pRecordRs ) );
    
//}
    
//catch(_com_error &e)
    
//{
    
//    e.Description();
    
//    return    DB_ERROR;
    
//}

    
return DB_SUCCESS;
}


int  CADODataConn::MoveFirst( void )
{
    assert( NULL 
!= m_pRecordset );
    TESTHR( m_pRecordset
->MoveFirst() );
    
if( IsEOF() && IsBOF() )
    
{
        
return    DB_EMPTY;
    }

    
return DB_SUCCESS;
}


inline BOOL CADODataConn::IsEOF(
void )
{// VARIANT_BOOL类型与BOOL类型定义上有区别
    return FALSE != m_pRecordset->EndOfFile;
}

inline BOOL CADODataConn::IsBOF(
void )
{// VARIANT_BOOL类型与BOOL类型定义上有区别
    return FALSE != m_pRecordset->FirstOfFile;
}


int  CADODataConn::MoveLast( void )
{
    assert( NULL 
!= m_pRecordset );

    TESTHR( m_pRecordset
->MoveLast() );
    
if( IsEOF() && IsBOF() )
    
{
        
return    DB_EMPTY;
    }

    
return DB_SUCCESS;
}


int  CADODataConn::MoveNext( void )
{
    assert( NULL 
!= m_pRecordset );

    TESTHR( m_pRecordset
->MoveNext() );
    
if( IsEOF() )
    
{
        
if( IsBOF())
            
return    DB_EMPTY;
        
return    DB_EOF;
    }

    
return DB_SUCCESS;
}


int  CADODataConn::MovePrev( void )
{
    assert( NULL 
!= m_pRecordset );

    TESTHR( m_pRecordset
->MovePrevious() );
    
if( IsBOF() )
    
{
        
if( IsEOF() )
            
return    DB_EMPTY;
        
return    DB_BOF;
    }

    
return DB_SUCCESS;
}

int  CADODataConn::ExecuteSql( const   char  v_szSql[])
{
    assert( NULL 
!= m_pConn );

    _variant_t RecordsAffected;

    m_pConn
->Execute( v_szSql, &RecordsAffected, adCmdText );

    
return DB_SUCCESS;
}


int  CADODataConn::AddNew(CADORecordBinding *   const  v_pRecordRs)
{
    assert( NULL 
!= v_pRecordRs );
    assert( NULL 
!= m_pRecordBinding );

    TESTHR( m_pRecordBinding
->AddNew( v_pRecordRs ) );

    
return DB_SUCCESS;
}


int  CADODataConn::Update(CADORecordBinding *   const  v_pRecordRs)
{
    assert( NULL 
!= v_pRecordRs );
    assert( NULL 
!= m_pRecordBinding );

    TESTHR( m_pRecordBinding
->Update( v_pRecordRs ) );

    
return DB_SUCCESS;
}


void  CADODataConn::ReportComErr(_com_error &  e,  char  v_szErrorInfo[])
{
    _variant_t    vtConnect;
    std::ostrstream    strErrorInfo;
    
if( m_pRecordset != NULL )
    
{
        m_pRecordset
->get_ActiveConnection( &vtConnect );
    }

    
else
    
{
        strErrorInfo 
<< "Error:" << std::endl;
        strErrorInfo 
<< "Code = " << std::hex << e.Error() << std::endl;
        strErrorInfo 
<< "Message = " << e.ErrorMessage() << std::endl;
        ::strcpy( v_szErrorInfo, strErrorInfo.str() );
        
return;
    }



    
switch( vtConnect.vt )
    
{
    
case VT_BSTR:

        strErrorInfo 
<< "Error:" << std::endl;
        strErrorInfo 
<< "Code = " << std::hex << e.Error() << std::endl;
        strErrorInfo 
<< "Message = " << e.ErrorMessage() << std::endl;
        strErrorInfo 
<< "Source = " << (LPCSTR)e.Source() << std::endl;
        strErrorInfo 
<< "Description = " << (LPCSTR)e.Description() << std::endl;
        ::strcpy( v_szErrorInfo, strErrorInfo.str() );
        
break;

    
case VT_DISPATCH:

        PrintProviderError( v_szErrorInfo );
        
break;

    
default:

        ::strcpy( v_szErrorInfo, 
"访问数据库时发生未知错误!" );
        
break;
    }

}


void  CADODataConn::PrintProviderError( char  v_szErrorInfo[])
{
    ADODB::ErrorPtr  pErr 
= NULL;
    
long      nCount = 0;    
    
long      i = 0;
    std::ostrstream    strErrorInfo;

    
if( (m_pConn->Errors->Count) > 0)
    
{
        nCount 
= m_pConn->Errors->Count;
        
// Collection ranges from 0 to nCount -1.
        for(i = 0; i < nCount; i++)
        
{
            pErr 
= m_pConn->Errors->GetItem(i);
            strErrorInfo 
<< "Error Number:" << std::ios::hex << pErr->Number << std::endl;
            strErrorInfo 
<< " " << pErr->Description << std::endl;
            
        }

    }

    ::strcpy( v_szErrorInfo, strErrorInfo.str() );
}


int  CADODataConn::SelectRecordSet( const   char  v_szSqlCon[], 
                                  CADORecordBinding
*   const  v_pRecordRs)
{
    assert( NULL 
!= v_pRecordRs );
    m_pRecordset.Release();
    
if(NULL != m_pRecordBinding)
        delete m_pRecordBinding;
    m_pRecordBinding    
= NULL;

    
if( m_pConn == NULL )
    
{// 没用数据库接连时,创建一个新的数据库接连
        TESTHR( m_pConn.CreateInstance( __uuidof( ADODB::Connection ) ) );
        TESTHR( m_pConn
->Open( m_strDBName.c_str(), 
                                m_strUserName.c_str(), 
                                m_strPassword.c_str(), 
                                ADODB::adConnectUnspecified));
    }


    
// >>> 连接数据集  邱长丰增加. 2007-1-30 10:55 
    TESTHR( m_pRecordset.CreateInstance( __uuidof( ADODB::Recordset ) ) );
    TESTHR( m_pRecordset
->Open( v_szSqlCon,
                                m_pConn.GetInterfacePtr(), 
                                ADODB::adOpenDynamic, 
                                ADODB::adLockOptimistic, 
                                ADODB::adCmdText 
                                ));
    
// >>> 绑定记录集  邱长丰增加. 2007-1-30 10:55 
    TESTHR( m_pRecordset->QueryInterface(
                                    __uuidof(IADORecordBinding),
                                    (LPVOID
*)&m_pRecordBinding
                                    ));
    TESTHR( m_pRecordBinding
->BindToRecordset( v_pRecordRs ) );
    
return 0;
}


void  CADODataConn::DisconnectDB( void )
{
    
if( NULL != m_pRecordBinding )
    
{
        m_pRecordBinding
->Release();
        m_pRecordBinding    
= NULL;
    }

    
if( NULL != m_pRecordset )
    
{
        
if( ADODB::adStateOpen == m_pRecordset->GetState() )
        
{
            m_pRecordset
->Close();
        }

        m_pRecordset 
= NULL;
    }

    
if( NULL != m_pConn )
    
{
        
if( ADODB::adStateOpen == m_pConn->GetState() )
        
{
            m_pConn
->Close();
        }

        m_pConn    
= NULL;
    }

}

 

#pragma  once

#include 
< memory >
#include 
< assert.h >
#include 
" ADODataConn.h "

template
<  typename RS, typename _tagRecordData  =  RS  >
class  CRecordDBImpl
{
public:
    CRecordDBImpl(
void)
        : m_pDataConn(NULL)
    
{
    }

    
virtual ~CRecordDBImpl(void)
    
{
    }

protected:
    std::auto_ptr
<CADODataConn>    m_pDataConn;
    RS    m_recordRS;
public:
    
int InitDB(const char v_szDBName[], const char v_szUserName[], const char v_szPassword[], const char v_szTableName[])
    
{
        
try
        
{
            m_pDataConn    
= 
                std::auto_ptr
< CADODataConn >
                            
new CADODataConn( v_szDBName, 
                                            v_szUserName, 
                                            v_szPassword, 
                                            v_szTableName ) 
                                            );
            m_pDataConn
->ConnectDB( &m_recordRS );
        }

        
catch ( _com_error e)
        
{
            
char    szError[1024];
            m_pDataConn
->ReportComErr( e, szError );
            
return    CADODataConn::DB_ERROR;
        }

        
return    CADODataConn::DB_SUCCESS;
    }


    
int MoveFirst(void)
    
{
        assert( m_pDataConn.
get() != NULL );
        
int    iRet;
        
try
        
{
            iRet    
= m_pDataConn->MoveFirst();
        }

        
catch( _com_error& e )
        
{
            
char    szError[1024];
            m_pDataConn
->ReportComErr( e, szError );
            iRet    
= CADODataConn::DB_ERROR;
        }

        
return    iRet;
    }

    
int MoveLast(void)
    
{
        assert( NULL 
!= m_pDataConn );
        
int    iRet    = CADODataConn::DB_SUCCESS;
        
try
        
{
            iRet    
= m_pDataConn->MoveLast();
        }

        
catch( _com_error& e )
        
{
            
char    szError[1024];
            m_pDataConn
->ReportComErr( e, szError );
            iRet    
= CADODataConn:DB_ERROR;
        }

        
return    iRet;
    }

    
int MoveNext(void)
    
{
        assert( NULL 
!= m_pDataConn );
        
int    iRet    = CADODataConn::DB_SUCCESS;
        
try
        
{
            iRet    
= m_pDataConn->MoveNext();
        }

        
catch( _com_error& e )
        
{
            
char    szError[1024];
            m_pDataConn
->ReportComErr( e, szError );
            iRet    
= CADODataConn:DB_ERROR;
        }

        
return    iRet;
    }

    
int MovePrev(void)
    
{
        assert( NULL 
!= m_pDataConn );
        
int    iRet    = CADODataConn::DB_SUCCESS;
        
try
        
{
            iRet    
= m_pDataConn->MovePrev();
        }

        
catch( _com_error& e )
        
{
            
char    szError[1024];
            m_pDataConn
->ReportComErr( e, szError );
            iRet    
= CADODataConn:DB_ERROR;
        }

        
return    iRet;
    }

    
int    AddRecord( const _tagRecordData& v_recordData )
    
{
        assert( m_pDataConn.
get() != NULL );
        
int    iRet    = CADODataConn::DB_SUCCESS;
        
try
        
{
            m_recordRS.SetData( v_recordData );
            m_pDataConn
->AddNew( &m_recordRS );
        }

        
catch( _com_error& e )
        
{
            
char    szError[1024];
            m_pDataConn
->ReportComErr( e, szError );
            iRet    
= CADODataConn::DB_ERROR;
        }

        
return    iRet;
    }

    
int    UpdateRecord( RS& v_recordBinding )
    
{
        assert( m_pDataConn.
get() != NULL );
        
int    iRet    = CADODataConn::DB_SUCCESS;
        
try
        
{
            iRet    
= m_pDataConn->Update( &v_recordBinding );
        }

        
catch( _com_error& e )
        
{
            
char    szError[1024];
            m_pDataConn
->ReportComErr( e, szError );
            iRet    
= CADODataConn::DB_ERROR;
        }

        
return    iRet;
    }

}
;

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值