#include "StdAfx.h" #include "DBInterface.h" CDBInterface::CDBInterface( void ) { this->m_PConnection = NULL; this->m_PCommand = NULL; this->m_pDBSemaphore = new CSemaphore( 1, 1 ); m_bIsStarted = FALSE; } CDBInterface::~CDBInterface(void) { if( m_pDBSemaphore!=NULL ) { delete( m_pDBSemaphore ); m_pDBSemaphore = NULL; } if( m_PConnection ) { if( m_PConnection->State ) m_PConnection->Close(); m_PConnection.Release(); m_PConnection = NULL; } if( m_PCommand ) m_PCommand.Release(); //::CoUninitialize(); } /***************************************************************** **【函数名称】 ConnectDataBase **【函数功能】 重连时调用 **【参数】 ErrMassege :返回的错误信息 **【返回值】 TRUE:连接创建成功 FALSE:连接创建失败 **【调用模块】 (根据实际情况) ****************************************************************/ bool CDBInterface::ConnectDataBase(const CString& connStr, CString &ErrMessage ) { _bstr_t varSRC(connStr); m_ConnectStr = connStr;//连接字符串的值保存 bool bRet = true; try { if (FAILED(m_PConnection->Open(varSRC,"","",adModeUnknown))) { ErrMessage = "执行Open操作失败, ConnectString = " + connStr; bRet = false; } else { m_PCommand->ActiveConnection=m_PConnection; } } catch (_com_error e) { bRet = false; ErrMessage = (LPCSTR)e.Description(); ErrMessage = ErrMessage + _T(", ConnectString = ") + connStr; } // end catch return bRet; } /***************************************************************** **【函数名称】 CloseConn **【函数功能】 执行不返回记录集的SQL语句 **【参数】 无 **【返回值】 true执行成功,false执行失败 **【调用模块】 (根据实际情况) **【修改】 (根据实际情况) ****************************************************************/ bool CDBInterface::CloseConn() { bool bRet = true; if( m_PConnection ) { if( m_PConnection->State ) m_PConnection->Close(); } else bRet = false; return bRet; } /***************************************************************** **【函数名称】 Init **【函数功能】 初始化数据库 **【参数】 ErrMessage错误返回值 **【返回值】 ture执行成功,反之-失败 **【调用模块】 (根据实际情况) **【修改】 (根据实际情况) ****************************************************************/ bool CDBInterface::Init( CString &ErrMessage ) { //CoInitialize(NULL); bool bRet = true; try { if ( bRet) { if(FAILED(m_PConnection.CreateInstance("ADODB.Connection"))) { ErrMessage = "ADO创建Connection失败!"; bRet = false; } } if ( bRet) { m_PConnection->ConnectionTimeout =2; if(FAILED(m_PCommand.CreateInstance(__uuidof(Command)))) { ErrMessage = "ADO创建Command失败"; bRet = false; } } } catch (_com_error) { bRet = false; ErrMessage = "连接数据库失败!"; } return bRet; } /***************************************************************** **【函数名称】 SqlCommand **【函数功能】 执行不返回记录集的SQL语句 **【参数】 SQL:要执行的SQL语句,ErrMassege :返回的错误信息 **【返回值】 TRUE:执行成功 FALSE:执行失败 **【调用模块】 (根据实际情况) **【修改】 (根据实际情况) ****************************************************************/ bool CDBInterface::SqlCommand(const CString& SQL, CString &ErrMessage ) { _bstr_t sql( SQL ); bool bRet = true; if (NULL == m_pDBSemaphore) { ErrMessage = "数据库初始化失败!"; bRet = false; } if ( bRet ) { if( WaitForSingleObject( m_pDBSemaphore->m_hObject, 1000 ) == WAIT_OBJECT_0 ) { try { m_PCommand->CommandText=sql; m_PCommand->Execute(NULL,NULL,adCmdUnknown); ReleaseSemaphore( m_pDBSemaphore->m_hObject, 1, NULL ); } catch(_com_error &e) { ErrMessage=(LPCSTR)e.Description(); if(ErrMessage.Find("链接失败") != -1 || ErrMessage.Find("被关闭或无效") != -1 || ErrMessage.Find("gone") != -1) { m_bIsStarted=FALSE; } ReleaseSemaphore( m_pDBSemaphore->m_hObject, 1, NULL );//先释放信号量 if(ErrMessage.Find("链接失败") != -1 || ErrMessage.Find("被关闭或无效") != -1 || ErrMessage.Find("gone") != -1) { ReConnectStart(ErrMessage); } ErrMessage+="SqlCommand:"; bRet = false; } } else { bRet = false; ErrMessage="sqlcommandWAIT"; } } return bRet; } /***************************************************************** **【函数名称】 SqlRecordset **【函数功能】 执行返回记录集的SQL语句 **【参数】 SQL:要执行的SQL语句,State:返回的执行状态 true:执行成功 FALSE:执行失败 ErrMassege :返回的错误信息 **【返回值】 返回的ADO记录集 **【调用模块】 (根据实际情况) ****************************************************************/ _RecordsetPtr CDBInterface::SqlRecordset(const CString& SQL, bool &State, CString &ErrMessage ) { _bstr_t sql( SQL ); _RecordsetPtr TmpRecordset; State = true; if( WaitForSingleObject( m_pDBSemaphore->m_hObject, 1000 )==WAIT_OBJECT_0 ) { try { m_PCommand->ActiveConnection=m_PConnection; m_PCommand->CommandText=sql; TmpRecordset = m_PCommand->Execute(NULL,NULL,adCmdUnknown); ReleaseSemaphore( m_pDBSemaphore->m_hObject, 1, NULL ); } catch(_com_error e) { ErrMessage=(LPCSTR)e.Description(); if(ErrMessage.Find("链接失败") != -1 || ErrMessage.Find("被关闭或无效") != -1 || ErrMessage.Find("gone") != -1) { m_bIsStarted=FALSE; } ReleaseSemaphore( m_pDBSemaphore->m_hObject, 1, NULL );//先释放信号量 if(ErrMessage.Find("链接失败") != -1 || ErrMessage.Find("被关闭或无效") != -1 || ErrMessage.Find("gone") != -1) { ReConnectStart(ErrMessage); } ErrMessage+="SqlRecordset:"; State = false; } } else { State = false; ErrMessage="wait Error"; if(NULL != TmpRecordset) { TmpRecordset.Release(); TmpRecordset = NULL; } } return TmpRecordset; } /***************************************************************** **【函数名称】 SqlRecordsetNocritical **【函数功能】 执行返回记录集的SQL语句,不带临界区 **【参数】 SQL:要执行的SQL语句,State:返回的执行状态 true:执行成功 FALSE:执行失败 ErrMassege :返回的错误信息 **【返回值】 返回的ADO记录集 **【调用模块】 (根据实际情况) ****************************************************************/ _RecordsetPtr CDBInterface::SqlRecordsetNocritical(const CString& SQL, bool &State, CString &ErrMessage ) { _bstr_t sql( SQL ); _RecordsetPtr TmpRecordset; State = true; try { m_PCommand->ActiveConnection=m_PConnection; m_PCommand->CommandText=sql; TmpRecordset = m_PCommand->Execute(NULL,NULL,adCmdUnknown); } catch(_com_error e) { ErrMessage=(LPCSTR)e.Description(); ErrMessage+="SqlRecordset:"; State = false; } return TmpRecordset; } /***************************************************************** **【函数名称】 GetSingleData **【函数功能】 执行返回记录集的SQL语句中一个字段值 **【参数】 SQL:要执行的SQL语句 nFieldIndx:指定取返回的字段 sValue:返回字段值 ErrMassege :返回的错误信息 **【返回值】 int -1:执行sql失败, 0-正常 1-未找到记录 **【调用模块】 (根据实际情况) ****************************************************************/ int CDBInterface::GetSingleData(const CString& SQL, const unsigned int nFieldIndx, CString &sValue, CString &ErrMessage) { _RecordsetPtr TmpRecordset = NULL; _variant_t VarValue; bool State; const int EXEC_ERROR = -1; // 执行失败 const int EXEC_OK = 0; // 正常 const int EXEC_NOVALUE = 1; // 未找到记录 int nRet = EXEC_OK; if( WaitForSingleObject( m_pDBSemaphore->m_hObject, 1000 ) == WAIT_OBJECT_0 ) { // 取指定值 try { TmpRecordset = SqlRecordsetNocritical( SQL, State, ErrMessage ); if ((TmpRecordset != NULL)&&(State)) { if ((!TmpRecordset->adoBOF && (!TmpRecordset->adoEOF)) ) { TmpRecordset->MoveFirst(); VarValue = TmpRecordset->GetCollect((_variant_t)(long)nFieldIndx); sValue.Format("%s", (char *)_bstr_t( VarValue )); nRet = EXEC_OK; } else { nRet = EXEC_NOVALUE; } } else { ErrMessage = "未找到记录"; nRet = EXEC_ERROR; } } catch(_com_error e) { ErrMessage =(LPCSTR) e.Description(); ErrMessage+= "GetDataIn"; nRet = EXEC_ERROR; } ReleaseSemaphore( m_pDBSemaphore->m_hObject, 1, NULL ); } if(NULL != TmpRecordset) { TmpRecordset.Release(); TmpRecordset = NULL; } return nRet; } /***************************************************************** **【函数名称】 GetSingleData **【函数功能】 执行返回记录集的SQL语句中一个字段值 **【参数】 SQL:要执行的SQL语句 strField:指定取返回的字段 sValue:返回字段值 ErrMassege :返回的错误信息 **【返回值】 int -1:执行sql失败, 0-正常 1-未找到记录 **【调用模块】 (根据实际情况) ****************************************************************/ int CDBInterface::GetSingleData(const CString& SQL, const CString strField, CString &sValue, CString &ErrMessage) { _RecordsetPtr TmpRecordset = NULL; _variant_t VarValue; bool State; const int EXEC_ERROR = -1; // 执行失败 const int EXEC_OK = 0; // 正常 const int EXEC_NOVALUE = 1; // 未找到记录 int nRet = EXEC_OK; _bstr_t sql( SQL ); State = true; if( WaitForSingleObject( m_pDBSemaphore->m_hObject, 1000 )==WAIT_OBJECT_0 ) { try { m_PCommand->CommandText=sql; TmpRecordset = m_PCommand->Execute(NULL,NULL,adCmdUnknown); } catch(_com_error e) { ErrMessage+= (LPCSTR)e.Description(); if((ErrMessage.Find("链接") != -1) || ( ErrMessage.Find("被关闭或无效") != -1) ||(ErrMessage.Find("gone") != -1)) { m_bIsStarted=FALSE; } ReleaseSemaphore( m_pDBSemaphore->m_hObject, 1, NULL ); if(NULL != TmpRecordset ) { TmpRecordset.Release(); TmpRecordset = NULL; } if((ErrMessage.Find("链接") != -1) || ( ErrMessage.Find("被关闭或无效") != -1) ||(ErrMessage.Find("gone") != -1)) { TRACE0("FAILE GetRecord*"); ReConnectStart(ErrMessage); } ErrMessage+= "GetRecordset"; State = false; return -1; } // 取指定值 try { if (TmpRecordset != NULL) { if ( (!TmpRecordset->adoBOF && (!TmpRecordset->adoEOF)) ) { TmpRecordset->MoveFirst(); VarValue = TmpRecordset->GetCollect((_variant_t)strField); sValue.Format("%s", (char *)_bstr_t( VarValue )); nRet = EXEC_OK; } else { nRet = EXEC_NOVALUE; ErrMessage ="GetCollectError*"; } } else { ErrMessage = "GetRecordNull*"; nRet = EXEC_ERROR; } ReleaseSemaphore( m_pDBSemaphore->m_hObject, 1, NULL ); } catch(_com_error e) { if(NULL != TmpRecordset) { TmpRecordset.Release(); TmpRecordset = NULL; } ErrMessage+= (LPCSTR)e.Description(); if((ErrMessage.Find("链接") != -1) || ( ErrMessage.Find("被关闭或无效") != -1) ||(ErrMessage.Find("gone") != -1)) { m_bIsStarted=FALSE; } ReleaseSemaphore( m_pDBSemaphore->m_hObject, 1, NULL ); if((ErrMessage.Find("链接失败") != -1 )|| (ErrMessage.Find("被关闭或无效") != -1) ||(ErrMessage.Find("gone") != -1)) { TRACE0("FAILE GetFiled*"); ReConnectStart(ErrMessage); } ErrMessage+="RecordsetGetfiled"; nRet = EXEC_ERROR; } } else { State = false; ErrMessage="wait Error"; if(NULL != TmpRecordset) { TmpRecordset.Release(); TmpRecordset = NULL; } } if(NULL != TmpRecordset) { TmpRecordset.Release(); TmpRecordset = NULL; } return nRet; } /***************************************************************** **【函数名称】 ReConnectStart **【函数功能】 构造函数 **【参数】 pParam传入使用主体对象,ErrMessage错误返回值 **【返回值】 ture执行成功,反之-失败 **【调用模块】 (根据实际情况) **【修改】 (根据实际情况) ****************************************************************/ bool CDBInterface::ReConnectStart(CString &ErrMessage ) { try { if( WaitForSingleObject( m_pDBSemaphore->m_hObject, 10 ) == WAIT_OBJECT_0 ) { if(!m_bIsStarted ) { if( m_PConnection->State ) m_PConnection->Close(); if(ConnectDataBase(m_ConnectStr,ErrMessage)) { m_bIsStarted = TRUE; } } ReleaseSemaphore( m_pDBSemaphore->m_hObject, 1, NULL ); } } catch(_com_error e) { ErrMessage = "数据库重新连接线程启动失败!"; m_bIsStarted = FALSE; ReleaseSemaphore( m_pDBSemaphore->m_hObject, 1, NULL ); } return true; } /***************************************************************** **【函数名称】 ReLease **【函数功能】 释放资源 **【参数】 无 **【返回值】 ****************************************************************/ void CDBInterface::ReLease() { if( m_pDBSemaphore!=NULL ) { delete( m_pDBSemaphore ); m_pDBSemaphore = NULL; } if( m_PConnection ) { if( m_PConnection->State ) m_PConnection->Close(); m_PConnection.Release(); m_PConnection = NULL; } if( m_PCommand ) m_PCommand.Release(); ::CoUninitialize(); }