#include "StdAfx.h" #include "ODBCImpl.h" CODBCImpl::CODBCImpl(void) { m_bOpen = FALSE; m_pdbInstance = NULL; m_hReConnectEvent = NULL; m_hReConnectThread = NULL; } CODBCImpl::~CODBCImpl(void) { DisConnectDataBase(); } BOOL CODBCImpl::SolveDBError(CONST DWORD &dwError,LPCTSTR lpErrorString) { AutoThreadSection aSection(&s_critSection); if(m_bSolve) return TRUE; switch(dwError) { case ERROR_PIPE_NOT_CONNECTED: case WSAECONNRESET: case WSAECONNABORTED: { m_bSolve = TRUE; // 启用重连线程; DisConnectDataBase(); //StartThread(); //LOG4C_NO_FILENUM((LOG_NOTICE,"数据库连接失败,请检查配置信息或数据库服务是否启动!")); } break; default: // 其他错误,输出日志; //LOG4C_NO_FILENUM((LOG_NOTICE,"数据库错误信息:%s",CW2A(lpErrorString))); break; } return FALSE; } int CODBCImpl::StartThread() { if(m_hReConnectEvent == NULL) m_hReConnectEvent = CreateEvent(NULL, TRUE, FALSE, NULL); // 无信号事件; if (m_hReConnectEvent == NULL) { m_bSolve = FALSE; return -1; } if(m_hReConnectThread == NULL) m_hReConnectThread = CreateThread(NULL, 0, ReConnectDatabaseThread, this, 0, NULL); if (m_hReConnectThread == NULL) { m_bSolve = FALSE; return -1; } else { CloseHandle(m_hReConnectThread); m_hReConnectThread = NULL; } return 0; } int CODBCImpl::EndofThread() { if (m_hReConnectEvent) SetEvent(m_hReConnectEvent); if (m_hReConnectThread) { if (WaitForSingleObject(m_hReConnectThread, INFINITE) != WAIT_TIMEOUT) CloseHandle(m_hReConnectThread); m_hReConnectThread = NULL; } if (m_hReConnectEvent) CloseHandle(m_hReConnectEvent); m_hReConnectEvent = NULL; return 0L; } DWORD CODBCImpl::ReConnectDatabaseThread(LPVOID lpPara) { CODBCImpl *pInstance = (CODBCImpl*)lpPara; do { if( pInstance->ConnectToDataBase()) { pInstance->m_bSolve = FALSE; break; } } while (WaitForSingleObject(pInstance->m_hReConnectEvent,5000L) == WAIT_TIMEOUT); if (pInstance->m_hReConnectEvent) CloseHandle(pInstance->m_hReConnectEvent); pInstance->m_hReConnectEvent = NULL; return 0L; } BOOL CODBCImpl::ConnectToDataBase( IN LPCTSTR lpConnString ) { AutoThreadSection aSection(&s_critSection); if (m_pdbInstance == NULL) { m_pdbInstance = new CDatabase; TCHAR szConnString[MAX_PATH] = {0}; if (lpConnString == NULL) { _stprintf_s(szConnString, _T("%s"), m_szConnectString); } else { _stprintf_s(m_szConnectString, _T("%s"), lpConnString); _stprintf_s(szConnString, _T("%s"), lpConnString); } try { m_pdbInstance->OpenEx(szConnString, CDatabase::noOdbcDialog); } catch (CDBException* e) { delete m_pdbInstance; m_pdbInstance = NULL; e->Delete(); return FALSE; } m_bOpen = TRUE; } return m_bOpen; } void CODBCImpl::DisConnectDataBase() { m_bOpen = FALSE; if (m_pdbInstance) delete m_pdbInstance; m_pdbInstance = NULL; } BOOL CODBCImpl::ExecuteSQL( IN LPCTSTR lpSQL ) { try { AutoThreadSection aSection(&s_critSection); if (!m_bOpen) return FALSE; //m_pdbInstance->BeginTrans(); m_pdbInstance->ExecuteSQL(lpSQL); //m_pdbInstance->CommitTrans(); } catch (CDBException* e) { //m_pdbInstance->Rollback(); SolveDBError(GetLastError(),e->m_strError); e->Delete(); return FALSE; } return TRUE; } INT CODBCImpl::GetTblRecordCount(IN LPCTSTR lpTblName, IN LPCTSTR lpFilters) { try { AutoThreadSection aSection(&s_critSection); if (!m_bOpen) return -1; CString strSQL; if (lpFilters && _tcsicmp(lpFilters, _T("")) != 0) strSQL.Format(_T("select count(*) as cot from %s where %s"), lpTblName, lpFilters); else strSQL.Format(_T("select count(*) as cot from %s"), lpTblName); CRecordset tagRecordset(m_pdbInstance); tagRecordset.Open(CRecordset::forwardOnly, strSQL); tagRecordset.GetFieldValue(_T("cot"), strSQL); tagRecordset.Close(); return _ttoi(strSQL); } catch (CDBException* e) { SolveDBError(GetLastError(),e->m_strError); e->Delete(); } return -1; } BOOL CODBCImpl::GetVersionInfo( OUT LPVOID lpVerInfo ) { try{ AutoThreadSection aSection(&s_critSection); if (!m_bOpen) return FALSE; TblVersion *pVerInfo = (TblVersion *)(lpVerInfo); CTblversion rsSt; rsSt.m_pDatabase = m_pdbInstance; rsSt.Open(); INT_PTR nIndex = 0; while (!rsSt.IsEOF()) { _stprintf_s(pVerInfo->szVersion, _T("%s"), rsSt.m_version); _stprintf_s(pVerInfo->szbakServer1, _T("%s"), rsSt.m_bakserver1); _stprintf_s(pVerInfo->szbakServer2, _T("%s"), rsSt.m_bakserver2); _stprintf_s(pVerInfo->szbakServer3, _T("%s"), rsSt.m_bakserver3); _stprintf_s(pVerInfo->szbakServer4, _T("%s"), rsSt.m_bakserver4); _stprintf_s(pVerInfo->szbakServer5, _T("%s"), rsSt.m_bakserver5); pVerInfo->bCheck1 = _ttoi(rsSt.m_check1); pVerInfo->bCheck2 = _ttoi(rsSt.m_check2); pVerInfo->bCheck3 = _ttoi(rsSt.m_check3); pVerInfo->bCheck4 = _ttoi(rsSt.m_check4); pVerInfo->bCheckbak1 = _ttoi(rsSt.m_bak1); pVerInfo->bCheckbak2 = _ttoi(rsSt.m_bak2); pVerInfo->bCheckbak3 = _ttoi(rsSt.m_bak3); pVerInfo->bCheckbak4 = _ttoi(rsSt.m_bak4); pVerInfo->bCheckbak5 = _ttoi(rsSt.m_bak5); pVerInfo->bCheckbak6 = _ttoi(rsSt.m_bak6); pVerInfo->bCheckbakdel1 = _ttoi(rsSt.m_delcheck1); pVerInfo->bCheckbakdel2 = _ttoi(rsSt.m_delcheck2); pVerInfo->bCheckbakdel3 = _ttoi(rsSt.m_delcheck3); pVerInfo->bCheckbakdel4 = _ttoi(rsSt.m_delcheck4); pVerInfo->bSubCheck1 = _ttoi(rsSt.m_bak11); pVerInfo->bSubCheck2 = _ttoi(rsSt.m_bak22); pVerInfo->bSubCheck3 = _ttoi(rsSt.m_bak33); pVerInfo->bSubCheck4 = _ttoi(rsSt.m_bak44); pVerInfo->nbakTime = _ttoi(rsSt.m_baktime); pVerInfo->nCheckMonth1 = _ttoi(rsSt.m_edit1); pVerInfo->nCheckMonth2 = _ttoi(rsSt.m_edit2); pVerInfo->nCheckMonth3 = _ttoi(rsSt.m_edit3); pVerInfo->nCheckMonth4 = _ttoi(rsSt.m_edit4); pVerInfo->nCheckbdMonth1 = _ttoi(rsSt.m_deledit1); pVerInfo->nCheckbdMonth2 = _ttoi(rsSt.m_deledit2); pVerInfo->nCheckbdMonth3 = _ttoi(rsSt.m_deledit3); pVerInfo->nCheckbdMonth4 = _ttoi(rsSt.m_deledit4); pVerInfo->bUpLoadCheck1 = _ttoi(rsSt.m_UploadCheck1); pVerInfo->bUpLoadCheck2 = _ttoi(rsSt.m_UploadCheck2); pVerInfo->bUpLoadCheck3 = _ttoi(rsSt.m_UploadCheck3); pVerInfo->bUpLoadCheck4 = _ttoi(rsSt.m_UploadCheck4); pVerInfo->strZiptype1 = rsSt.m_zipType1; pVerInfo->strZiptype1 = rsSt.m_zipType2; pVerInfo->strZiptype1 = rsSt.m_zipType3; pVerInfo->strZiptype1 = rsSt.m_zipType4; pVerInfo->strUploadRule = rsSt.m_strUpLoadRule; nIndex++; rsSt.MoveNext(); } rsSt.Close(); } catch (CDBException *e) { SolveDBError(GetLastError(),e->m_strError); e->Delete(); return FALSE; } return TRUE; } BOOL CODBCImpl::GetNetShareInfo( OUT LPVOID lpNetShareInfo ) { try{ AutoThreadSection aSection(&s_critSection); if (!m_bOpen) return FALSE; vector *pNetShareInfo = (vector *)(lpNetShareInfo); CTblNetShareInfo rsSt; rsSt.m_pDatabase = m_pdbInstance; rsSt.Open(); INT_PTR nIndex = 0; while (!rsSt.IsEOF()) { TblNetShareInfo tagNetInfo; tagNetInfo.bEnable = rsSt.m_enable; _stprintf_s(tagNetInfo.szBranchId, _T("%s"), rsSt.m_branchid ); _stprintf_s(tagNetInfo.szShareDirectory, _T("%s"), rsSt.m_sharepath ); tagNetInfo.byMinCapacity = rsSt.m_mincapacity; tagNetInfo.byMaxCapacity = rsSt.m_maxcapacity; tagNetInfo.byImgType = rsSt.m_phototype; tagNetInfo.byPriority = rsSt.m_priority; pNetShareInfo->push_back(tagNetInfo); nIndex++; rsSt.MoveNext(); } rsSt.Close(); } catch (CDBException *e) { SolveDBError(GetLastError(),e->m_strError); e->Delete(); return FALSE; } return TRUE; }