www.gusucode.com > FreeEIM_VC++企业即时通讯软件源代码源码程序 > FreeEIM_VC++企业即时通讯软件源代码源码程序\code\XEIM_Database.cpp
#include "StdAfx.h" #include "XEIM_Database.h" // Download by http://www.NewXing.com static XEIM_Database dbOnlyOne; bool XEIM_Database::m_bStart = false; XEIM_Database::XEIM_Database() { m_pConn = NULL; m_pRs = NULL; m_strLastError = ""; OleInitialize(NULL); /* ConnectSQL(m_config.m_szServer.c_str(), m_config.m_szDatabase.c_str(), m_config.m_szUserName.c_str(), m_config.m_szPassword.c_str());*/ // ConnectAccess("xeimDatabase.mdb"); } XEIM_Database::~XEIM_Database() { OleUninitialize(); } // 连接 MS SQL 类型数据库; BOOL XEIM_Database::ConnectSQL(LPCTSTR server, LPCTSTR db, LPCTSTR user, LPCTSTR password) { /* MS SQL 的连接语句 */ CString strConn; strConn.Format("Provider=SQLOLEDB.1;Persist Security Info=False;User ID=%s;Password=%s;Initial Catalog=%s;Data Source=%s", user,password,db,server); HRESULT hr; try { // m_pConn 在构造函数里,必须初始化为 NULL hr = m_pConn.CreateInstance(__uuidof(Connection)); // 打开数据库 strConn m_pConn->CursorLocation=adUseClient; hr = m_pConn->Open((LPCTSTR)strConn, "", "", adModeUnknown); } catch(_com_error e) { m_strLastError = e.Description(); } if (! m_pConn->State) { m_strLastError = "数据库打开失败!"; return FALSE; } m_pRs.CreateInstance(__uuidof(Recordset)); return TRUE; } // 查询某条记录是否存在; BOOL XEIM_Database::RecordExists(LPCTSTR szSQL) { HRESULT hr; BOOL bRet = FALSE; try { hr = m_pRs->Open(szSQL, m_pConn.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText); // if (SUCCEEDED(hr)) // AddErrorInfo("rs failed."); // 如果数据库是空白的 if (! m_pRs->adoEOF) bRet = TRUE; } catch (_com_error e) { AfxMessageBox(e.ErrorMessage()); m_pRs.Release(); return FALSE; } m_pRs->Close(); // m_pRs.Release(); return bRet; } // 执行一条 SQL 语句; BOOL XEIM_Database::ExecuteCommand(LPCTSTR szSQL) { try { _variant_t vAffected; m_pConn->CursorLocation = adUseClient; m_pConn->Execute(szSQL, &vAffected, adExecuteNoRecords); } catch (_com_error e) { AfxMessageBox(e.Description()); return FALSE; } return TRUE; } _RecordsetPtr &XEIM_Database::GetChatText(const char *szIdone, const char *szIdtwo, const char *szLastTime) { CString strReturn; CString strSQL; CTime tmNow = CTime::GetCurrentTime(); ASSERT(NULL != szLastTime); if (0 == strcmp(szIdone, szIdtwo)) { char *sql = "select [%s], [%s], [%s], [%s], [%s] from [%s]" "where ([%s]='%s' and [%s]='%s') and ([%s] between #%s# and #%s#);"; strSQL.Format(sql, "sender", "receiver", "message", "senddate", "recvdate", "freeeim", "sender", szIdone, "receiver", szIdtwo, "senddate", szLastTime, tmNow.Format(_T("%Y-%m-%d %H:%M:%S"))); } else { char *sql = "select [%s], [%s], [%s], [%s], [%s] from [%s]" "where (([%s]='%s' and [%s]='%s') " "or ([%s]='%s' and [%s]='%s')) and ([%s] between #%s# and #%s#);"; strSQL.Format(sql, "sender", "receiver", "message", "senddate", "recvdate", "freeeim", "sender", szIdone, "receiver", szIdtwo, "sender", szIdtwo, "receiver", szIdone, "senddate", szLastTime, tmNow.Format(_T("%Y-%m-%d %H:%M:%S"))); } _variant_t var; try { HRESULT hr; hr = m_pRs->Open((LPCTSTR)strSQL, m_pConn.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText); return m_pRs; } catch (_com_error e) { AfxMessageBox(e.Description()); return m_pRs; } return m_pRs; } _RecordsetPtr &XEIM_Database::GetChatTextByDay(const char *szIdone, const char *szIdtwo, const char *szLastTime) { CString strReturn; CString strSQL; CTime tmNow = CTime::GetCurrentTime(); CString strNow = tmNow.Format(_T("%Y-%m-%d %H:%M:%S")); ASSERT(NULL != szLastTime); CString daytime_begin = CString(szLastTime) + " 00:01:01"; CString daytime_end = CString(szLastTime) + " 23:59:59"; if (0 == strcmp(szIdone, szIdtwo)) { char *sql = "select [%s], [%s], [%s], [%s], [%s] from [%s]" "where ([%s]='%s' and [%s]='%s') and ([%s] between #%s# and #%s#);"; strSQL.Format(sql, "sender", "receiver", "message", "senddate", "recvdate", "freeeim", "sender", szIdone, "receiver", szIdtwo, "senddate", daytime_begin, daytime_end); } else { char *sql = "select [%s], [%s], [%s], [%s], [%s] from [%s]" "where (([%s]='%s' and [%s]='%s') " "or ([%s]='%s' and [%s]='%s')) and ([%s] between #%s# and #%s#);"; strSQL.Format(sql, "sender", "receiver", "message", "senddate", "recvdate", "freeeim", "sender", szIdone, "receiver", szIdtwo, "sender", szIdtwo, "receiver", szIdone, "senddate", daytime_begin, daytime_end); } _variant_t var; try { HRESULT hr; hr = m_pRs->Open((LPCTSTR)strSQL, m_pConn.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText); return m_pRs; } catch (_com_error e) { AfxMessageBox(e.Description()); return m_pRs; } return m_pRs; } // 通过条件获取唯一 ID DWORD XEIM_Database::GetIdByCondition(LPCTSTR szCondition) { /* HRESULT hr; DWORD dwRet = 0; try { hr = m_pRs->Open(szSQL, m_pConn.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText); // if (SUCCEEDED(hr)) // AddErrorInfo("rs failed."); // 如果数据库是空白的 if (! m_pRs->adoEOF) { var[1] = pRs->GetCollect(_variant_t()); if (var[1].vt != VT_NULL) { pData->SetData((LPCTSTR)_bstr_t(var[1])); } } pRs->Close(); } catch (_com_error e) { AfxMessageBox(e.ErrorMessage()); } */ return -1; } // 功能:按条件读取某个字段的内容; // 更细日期:2009年11月17日 void XEIM_Database::GetField(const char* szTable, const char *szField, const char *szCondition, char *szData) { HRESULT hr; CString strSQL; strSQL.Format("SELECT %s FROM %s WHERE %s",szField, szTable, szCondition); _variant_t var; try { hr = m_pRs->Open((LPCTSTR)strSQL, m_pConn.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText); // if (SUCCEEDED(hr)) // AddErrorInfo("rs failed."); // 如果数据库不是空白的 if (! m_pRs->adoEOF) { // 获取数据 var = m_pRs->GetCollect(_variant_t(szField)); if (var.vt != VT_NULL) { strcpy(szData, (LPCTSTR)_bstr_t(var)); } } else { szData = NULL; } } catch (_com_error e) { AfxMessageBox(e.ErrorMessage()); m_pRs.Release(); } m_pRs->Close(); } // 连接 MS ACCESS 数据库; BOOL XEIM_Database::ConnectAccess(const char *szMDB) { CString strConn; /* MS ACCESS 的连接语句 */ strConn.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s", szMDB); HRESULT hr; try { hr = m_pConn.CreateInstance(__uuidof(Connection)); // 打开数据库 strConn m_pConn->CursorLocation=adUseClient; hr = m_pConn->Open((LPCTSTR)strConn, "", "", adModeUnknown); } catch(_com_error e) { m_strLastError = (LPCTSTR)e.Description(); } if (! m_pConn->State) { return FALSE; } m_pRs.CreateInstance(__uuidof(Recordset)); return TRUE; } BOOL XEIM_Database::IsConnected() { return m_pConn->State == adStateOpen; } BOOL XEIM_Database::SetField(LPCTSTR szTable, LPCTSTR szField, LPCTSTR szData, LPCTSTR szFieldCondition, LPCTSTR szDataCondition) { BOOL bRet = FALSE; if (m_pConn->State != adStateOpen) { m_strLastError = "XEIM_Database::UpdateUserStatus,数据无法打开!"; return bRet; } if (szTable == NULL || szField == NULL || szData == NULL) { m_strLastError = "szTable或szField,szData参数为NULL。"; return bRet; } CString strSQL; strSQL.Format("UPDATE [%s] SET [%s]='%s' WHERE [%s]=%s", szTable, szField, szData, szFieldCondition, szDataCondition); // AfxMessageBox(strSQL); try { _variant_t vAffected; m_pConn->CursorLocation = adUseClient; m_pConn->Execute((LPCTSTR)strSQL, &vAffected, adExecuteNoRecords); bRet = TRUE; } catch (_com_error e) { AfxMessageBox(e.Description()); return FALSE; } return bRet; } void XEIM_Database::StartDB(const char *szMDB) { if(false == m_bStart) { m_bStart = true; dbOnlyOne.ConnectAccess(szMDB); } } XEIM_Database &XEIM_Database::GetDB() { return dbOnlyOne; }