| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512 |
- #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();
- }
|