DataManager.cpp 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345
  1. #include "stdafx.h"
  2. #include "DataManager.h"
  3. #include "AdoInterface.h"
  4. #ifdef _DEBUG
  5. #define new DEBUG_NEW
  6. #endif
  7. CDataManager::CDataManager()
  8. {
  9. _hThread = NULL;
  10. m_bThreadRuning = FALSE;
  11. }
  12. CDataManager::~CDataManager()
  13. {
  14. EndofThread();
  15. CloseDataBase();
  16. }
  17. //************************************//
  18. // [函数]:CreateInstance
  19. // [描述]:创建实例对象
  20. // [参数]:
  21. // [返回]:
  22. //************************************//
  23. int CDataManager::CreateInstance()
  24. {
  25. if(S_FALSE == m_PhoneBookDB.CreateInstance())
  26. return -1;
  27. return 0;
  28. }
  29. //************************************//
  30. // [函数]:OpenDataBase
  31. // [描述]:查询数据的行数
  32. // [参数]:
  33. // pConnectStr 连接数据库串
  34. // pUserID 用户
  35. // pPWD 数据库密码
  36. // errMsg 返回错误信息
  37. // [返回]:数量 =-1失败
  38. //************************************//
  39. int CDataManager::OpenDataBase(const TCHAR* pConnectStr, const TCHAR* pUserID, const TCHAR* pPWD, CString& errMsg)
  40. {
  41. if(S_FALSE == m_PhoneBookDB.OpenDataBase(pConnectStr, pUserID, pPWD, errMsg))
  42. return -1;
  43. return 0;
  44. }
  45. void CDataManager::CloseDataBase()
  46. {
  47. m_PhoneBookDB.CloseDataBase();
  48. }
  49. //启动
  50. int CDataManager::StartThread()
  51. {
  52. AutoThreadSection aSection(&s_critSection);
  53. if (_hThread) return -1;
  54. _hThread = CreateThread(NULL, 0, ThreadFun, this, 0, NULL);
  55. if (_hThread == NULL)
  56. {
  57. WriteTextLog(_T("创建线程失败"));
  58. return -1;
  59. }
  60. CloseHandle(_hThread);
  61. _hThread = NULL;
  62. m_bThreadRuning = TRUE;
  63. return 1;
  64. }
  65. //结束
  66. int CDataManager::EndofThread()
  67. {
  68. if (_hThread)
  69. WaitForSingleObject(_hThread, INFINITE);
  70. m_bThreadRuning = FALSE;
  71. return 1;
  72. }
  73. int CDataManager::Work()
  74. {
  75. return 1;
  76. }
  77. DWORD CDataManager::ThreadFun(LPVOID lpParam)
  78. {
  79. CDataManager* p = (CDataManager*)lpParam;
  80. if(p)
  81. p->Work();
  82. return 0;
  83. }
  84. //************************************//
  85. // [函数]:SelectCount
  86. // [描述]:查询数据的行数
  87. // [参数]:
  88. // strTableName 要查询的表名
  89. // [返回]:数量 =-1失败
  90. //************************************//
  91. int CDataManager::SelectCount(CString& strTableName)
  92. {
  93. if(strTableName.IsEmpty())
  94. return -1;
  95. _ConnectionPtr pContPtr = m_PhoneBookDB.GetContPrt();
  96. CString sqlStr = _T("select count(*) as nCount from ") + strTableName;
  97. _RecordsetPtr pRest;
  98. pRest.CreateInstance(__uuidof(Recordset));
  99. try
  100. {
  101. pRest->Open(_variant_t(sqlStr), //物品查询
  102. pContPtr.GetInterfacePtr(), //获取库接库的IDispatch指针
  103. adOpenDynamic,
  104. adLockOptimistic,
  105. adCmdText);
  106. }
  107. catch(_com_error *e)
  108. {
  109. AfxMessageBox(e->ErrorMessage());
  110. }
  111. int nCount = 0;
  112. if (!pRest->adoEOF)
  113. nCount = atoi(_bstr_t(pRest->GetCollect("nCount")));
  114. pRest = NULL;
  115. return nCount;
  116. }
  117. //************************************//
  118. // [函数]:Select
  119. // [描述]:查询数据集
  120. // [参数]:
  121. // vData 返回的数据集
  122. // strTableName 要查询的表名
  123. // strFields 要查询的字段
  124. // strSelLineCount 查询行数 (=="",查询所有行, !=""如:_("top 1")表示:表的第一行的数据
  125. // strfilter where条件
  126. // strSort 排序
  127. // [返回]:数量 =-1失败, 0成功
  128. //************************************//
  129. int CDataManager::Select(CArray<CStringArray, CStringArray>& arr, CString& strTableName, std::vector<CString>& vFields, CString strfilter, const CString& strSelLineCount, CString strSort)
  130. {
  131. if(strTableName.IsEmpty())
  132. return -1;
  133. _ConnectionPtr pContPtr = m_PhoneBookDB.GetContPrt();
  134. if(!pContPtr)
  135. return -1;
  136. int nCount = SelectCount(strTableName);
  137. if(nCount < 0)
  138. return -1;
  139. if(nCount == 0)
  140. return 0;
  141. //SELECT 列名称 FROM 表名称 WHERE 列名称='' ORDER BY 列名称
  142. CString strSql = _T("");
  143. if(vFields.empty())
  144. return -1;
  145. else
  146. {
  147. if(strSelLineCount.IsEmpty())
  148. strSql = _T("select ");
  149. else
  150. strSql = _T("select ") + strSelLineCount +_T(" ");
  151. int i = 0;
  152. int nSize = vFields.size();
  153. std::vector<CString>::iterator iter = vFields.begin();
  154. for(;iter != vFields.end();)
  155. {
  156. strSql += (*iter);
  157. if(i < nSize - 1)
  158. strSql += _T(",");
  159. ++i;
  160. ++iter;
  161. }
  162. strSql += _T(" from ") + strTableName;
  163. }
  164. //条件约束
  165. if(strfilter != _T(""))
  166. strSql += _T(" where ") + strfilter;
  167. if(strSort != _T(""))
  168. strSql += _T(" order by ") + strSort;
  169. _RecordsetPtr pRecordset;
  170. try
  171. {
  172. _variant_t RecordsAffected;
  173. pRecordset = pContPtr->Execute(_bstr_t(strSql), &RecordsAffected, adCmdText);//操作
  174. }
  175. catch(_com_error* e)
  176. {
  177. AfxMessageBox(e->ErrorMessage());
  178. return -1;
  179. }
  180. arr.SetSize(nCount, 1);
  181. try
  182. {
  183. int nIndex = 0;
  184. arr.ElementAt(nIndex).RemoveAll();
  185. while(!pRecordset->adoEOF)
  186. {
  187. int i = 0;
  188. std::vector<CString>::iterator iter = vFields.begin();
  189. for(;iter != vFields.end();)
  190. {
  191. arr.ElementAt(nIndex).Add(_T(""));
  192. CString strVaule = (_bstr_t)pRecordset->GetCollect(_variant_t((*iter)));
  193. arr.ElementAt(nIndex).SetAt(i, strVaule);
  194. ++iter;
  195. ++i;
  196. }
  197. //移动到下一条记录
  198. pRecordset->MoveNext();
  199. ++nIndex;
  200. }
  201. }
  202. catch(_com_error* e)
  203. {
  204. AfxMessageBox(e->ErrorMessage());
  205. return -1;
  206. }
  207. return 0;
  208. }
  209. //************************************//
  210. // [函数]:Insert
  211. // [描述]:添加数据
  212. // [参数]:
  213. // strTableName 要查询的表名
  214. // strField 一个或多个字段(列1, 列2,...)
  215. // pValue 要添加的数值
  216. // ... 格式化传参
  217. // [返回]:数量 =-1失败, 0成功
  218. //************************************//
  219. int CDataManager::Insert(CString& strTableName, CString& strValues, CString strFields)
  220. {
  221. if(strTableName.IsEmpty() || strValues.IsEmpty())
  222. return -1;
  223. _ConnectionPtr pContPtr = m_PhoneBookDB.GetContPrt();
  224. if(!pContPtr)
  225. return -1;
  226. //INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....)
  227. CString strSql = _T("");
  228. if(strFields.IsEmpty())
  229. strSql = _T("INSERT INTO ") + strTableName + _T(" VALUES (") + strValues + _T(")");
  230. else
  231. strSql = _T("INSERT INTO ") + strTableName + _T(" (") + strFields + _T(")") + _T(" VALUES (") + strValues + _T(")");
  232. try
  233. {
  234. _variant_t RecordsAffected;
  235. pContPtr->Execute(_bstr_t(strSql), &RecordsAffected, adCmdText);//操作
  236. }
  237. catch(_com_error* e)
  238. {
  239. AfxMessageBox(e->ErrorMessage());
  240. return -1;
  241. }
  242. return 0;
  243. }
  244. //************************************//
  245. // [函数]:Update
  246. // [描述]:更新数据
  247. // [参数]:
  248. // strTableName 要更新的表
  249. // strValues 一个或多个字段(列1, 列2,...)
  250. // strfilter where条件
  251. // [返回]:数量 =-1失败, 0成功
  252. //************************************//
  253. int CDataManager::Update(CString& strTableName, CString& strValues, CString strfilter)
  254. {
  255. if(strTableName.IsEmpty() || strValues.IsEmpty() || strfilter.IsEmpty())
  256. return -1;
  257. _ConnectionPtr pContPtr = m_PhoneBookDB.GetContPrt();
  258. if(!pContPtr)
  259. return -1;
  260. //update tableanem set msgcount='%s',log='%s',status='%s',issended='%s' where autoid='%s'
  261. CString strSql = _T("");
  262. strSql = _T("update ") + strTableName + _T(" set ") + strValues + _T(" where ") + strfilter;
  263. try
  264. {
  265. _variant_t RecordsAffected;
  266. pContPtr->Execute(_bstr_t(strSql), &RecordsAffected, adCmdText);//操作
  267. }
  268. catch(_com_error* e)
  269. {
  270. AfxMessageBox(e->ErrorMessage());
  271. return -1;
  272. }
  273. return 0;
  274. }
  275. //************************************//
  276. // [函数]:Delete
  277. // [描述]:删除
  278. // [参数]:
  279. // CString& strTableName, 表名
  280. // CString& strFilter 限制条件
  281. // [返回]:数量 =-1失败, 0成功
  282. //************************************//
  283. int CDataManager::Delete(CString& strTableName, CString& strFilter)
  284. {
  285. if(strTableName.IsEmpty() || strFilter.IsEmpty())
  286. return -1;
  287. _ConnectionPtr pContPtr = m_PhoneBookDB.GetContPrt();
  288. if(!pContPtr)
  289. return -1;
  290. CString strSql = _T("");
  291. strSql = _T("delete from ") + strTableName + _T(" where ") + strFilter;
  292. try
  293. {
  294. _variant_t RecordsAffected;
  295. pContPtr->Execute(_bstr_t(strSql), &RecordsAffected, adCmdText);//操作
  296. }
  297. catch(_com_error* e)
  298. {
  299. AfxMessageBox(e->ErrorMessage());
  300. return -1;
  301. }
  302. return 0;
  303. }