AdoImpl.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514
  1. #include "StdAfx.h"
  2. #include "AdoImpl.h"
  3. AdoImpl::AdoImpl(void)
  4. {
  5. m_pADODatabase = NULL;
  6. memset(m_szConnectString, 0, 1024);
  7. InitializeCriticalSection(&m_csAdo);
  8. }
  9. AdoImpl::~AdoImpl(void)
  10. {
  11. DeleteCriticalSection(&m_csAdo);
  12. }
  13. void AdoImpl::SetConnectString(
  14. IN const int &nType,
  15. IN LPCTSTR lpDataSource,
  16. IN LPCTSTR lpDatabaseTCPPort,
  17. IN LPCTSTR lpDatabaseAccount,
  18. IN LPCTSTR lpDatabasePassWord,
  19. IN LPCTSTR lpDatabaseName,
  20. IN LPCTSTR lpDatabaseFile)
  21. {
  22. switch (nType)
  23. {
  24. case ADO_ACCESS97:
  25. _stprintf_s(m_szConnectString, _T("Provider=Microsoft.Jet.OLEDB.3.51;Data Source=%s"), lpDatabaseFile);
  26. break;
  27. case ADO_ACCESS2000:
  28. _stprintf_s(m_szConnectString, _T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s"), lpDatabaseFile);
  29. break;
  30. case ADO_ACCESS2007:
  31. _stprintf_s(m_szConnectString, _T("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=%s"), lpDatabaseFile);
  32. break;
  33. case ADO_EXCEL2003:
  34. _stprintf_s(m_szConnectString, _T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s; Extended Properties='Excel 8.0; HDR=Yes; IMEX=1'"), lpDatabaseFile);
  35. break;
  36. case ADO_EXCEL2007:
  37. _stprintf_s(m_szConnectString, _T("Provider=Microsoft.Jet.OLEDB.3.51;Data Source=%s; Extended Properties='Excel 12.0; HDR=Yes; IMEX=1'"), lpDatabaseFile);
  38. break;
  39. case ADO_SQLSERVER:
  40. {
  41. if ( !_tcsicmp(lpDatabaseTCPPort, _T("0")))
  42. {
  43. //sprintf(m_szConnectString, "Provider=sqloledb.1;Persist Security Info=false;Data Source=%s;Initial Catalog=%s;User Id=%s;Password=%s; ",
  44. _stprintf_s(m_szConnectString, _T("Provider=sqloledb;Data Source=%s;Initial Catalog=%s;User Id=%s;Password=%s; "),
  45. lpDataSource, // IP地址或服务名称;
  46. lpDatabaseName,
  47. lpDatabaseAccount,
  48. lpDatabasePassWord);
  49. }
  50. else
  51. {
  52. //sprintf(m_szConnectString, "Provider=sqloledb.1;Persist Security Info=false;Data Source=%s,%s;Initial Catalog=%s;User Id=%s;Password=%s; ",
  53. _stprintf_s(m_szConnectString, _T("Provider=sqloledb;Data Source=%s,%s;Initial Catalog=%s;User Id=%s;Password=%s; "),
  54. lpDataSource, // IP地址或服务名称;
  55. lpDatabaseTCPPort,
  56. lpDatabaseName,
  57. lpDatabaseAccount,
  58. lpDatabasePassWord);
  59. }
  60. }
  61. break;
  62. case ADO_PGSQL:
  63. {
  64. _stprintf_s(m_szConnectString, _T("DRIVER={PostgreSQL ODBC Driver(UNICODE)}; SERVER=%s; port=%s; DATABASE=%s; UID=%s; PWD=%s;"),
  65. lpDataSource, // IP地址或服务名称;
  66. lpDatabaseTCPPort,
  67. lpDatabaseName,
  68. lpDatabaseAccount,
  69. lpDatabasePassWord);
  70. }
  71. break;
  72. default:
  73. break;
  74. }
  75. }
  76. BOOL AdoImpl::IsOpen()
  77. {
  78. if ( m_pADODatabase == NULL)
  79. return FALSE;
  80. return m_pADODatabase->IsOpen();
  81. }
  82. BOOL AdoImpl::Opendatabase(IN LPCTSTR lpConnectString /* = NULL */)
  83. {
  84. BOOL bResult = FALSE;
  85. if( NULL == m_pADODatabase )
  86. {
  87. m_pADODatabase = new CADODatabase();
  88. if( m_pADODatabase )
  89. {
  90. if( lpConnectString == NULL )
  91. {
  92. m_pADODatabase->SetConnectionString(m_szConnectString);
  93. }
  94. else
  95. {
  96. m_pADODatabase->SetConnectionString(lpConnectString);
  97. _tcscpy_s(m_szConnectString, lpConnectString);
  98. }
  99. if( TRUE == m_pADODatabase->Open() )
  100. {
  101. bResult = TRUE;
  102. }
  103. else
  104. {
  105. if( m_pADODatabase->IsOpen() )
  106. {
  107. m_pADODatabase->Close();
  108. }
  109. delete m_pADODatabase;
  110. m_pADODatabase = NULL;
  111. }
  112. }
  113. }
  114. return bResult;
  115. }
  116. void AdoImpl::Closedatabase()
  117. {
  118. if( NULL != m_pADODatabase )
  119. {
  120. if( m_pADODatabase->IsOpen() )
  121. {
  122. m_pADODatabase->Close();
  123. }
  124. if( m_pADODatabase )
  125. delete m_pADODatabase;
  126. m_pADODatabase = NULL;
  127. }
  128. }
  129. int AdoImpl::Execute(IN LPCTSTR lpSQL)
  130. {
  131. INT nRetCode = 0;
  132. if( NULL == m_pADODatabase )
  133. {
  134. return -1;
  135. }
  136. EnterCriticalSection(&m_csAdo);
  137. if ( m_pADODatabase->IsOpen() )
  138. {
  139. nRetCode = m_pADODatabase->Execute(lpSQL);
  140. LeaveCriticalSection(&m_csAdo);
  141. }
  142. else
  143. {
  144. LeaveCriticalSection(&m_csAdo);
  145. return -1;
  146. }
  147. return nRetCode;
  148. }
  149. void AdoImpl::DeleteADORecordSet(CADORecordset* pRSet)
  150. {
  151. CloseADORecordSet(pRSet);
  152. if( pRSet )
  153. {
  154. delete pRSet;
  155. pRSet = NULL;
  156. }
  157. }
  158. BOOL AdoImpl::OpenADORecordSet(IN CADORecordset *pRSet, IN LPCTSTR lpSQL, IN const int& nCursorLocation)
  159. {
  160. BOOL bResult = TRUE;
  161. if( NULL == pRSet ) return FALSE;
  162. if ( !pRSet->Open(lpSQL, CADORecordset::openQuery))
  163. {
  164. DeleteADORecordSet(pRSet);
  165. bResult = FALSE;
  166. }
  167. return bResult;
  168. }
  169. void AdoImpl::CloseADORecordSet(CADORecordset* pRSet)
  170. {
  171. if( NULL != pRSet )
  172. {
  173. if( pRSet->IsOpen() )
  174. {
  175. pRSet->Close();
  176. }
  177. }
  178. }
  179. bool AdoImpl::GetADODateBaseStatus()
  180. {
  181. if( NULL == m_pADODatabase || !m_pADODatabase->IsOpen())
  182. return false;
  183. return true;
  184. }
  185. DWORD AdoImpl::GetTableRecordCount(IN LPCTSTR lpTableName, IN LPCTSTR lpFilters)
  186. {
  187. if ( lpTableName == NULL)
  188. return -1;
  189. TCHAR szSQL[1024] = _T("");
  190. if(lpFilters == NULL || _tcscmp(lpFilters,_T("")) == 0)
  191. _stprintf_s(szSQL,_T("select count(*) as cot from %s"),lpTableName);
  192. else
  193. _stprintf_s(szSQL,_T("select count(*) as cot from %s where %s"),lpTableName,lpFilters);
  194. DWORD nRecordCount = 0;
  195. _variant_t vtFieldValue;
  196. BOOL bResult = FALSE;
  197. //AutoThreadSection aSection(&s_critSection);
  198. EnterCriticalSection(&m_csAdo);
  199. bResult = GetADODateBaseStatus();
  200. if( FALSE == bResult )
  201. {
  202. LeaveCriticalSection(&m_csAdo);
  203. return -1;
  204. }
  205. CADORecordset* pRSet = new CADORecordset(m_pADODatabase);
  206. if( NULL == pRSet )
  207. {
  208. LeaveCriticalSection(&m_csAdo);
  209. return -1;
  210. }
  211. bResult = OpenADORecordSet(pRSet, szSQL);
  212. if( FALSE == bResult )
  213. {
  214. LeaveCriticalSection(&m_csAdo);
  215. return -1;
  216. }
  217. if( !pRSet->IsFieldNull(_T("cot")) )
  218. {
  219. pRSet->GetFieldValue(_T("cot"), nRecordCount);
  220. }
  221. else
  222. {
  223. nRecordCount = -1;
  224. }// end if( !pRSet->IsFieldNull(0) )
  225. DeleteADORecordSet(pRSet);
  226. LeaveCriticalSection(&m_csAdo);
  227. return nRecordCount;
  228. }
  229. /************************************************************************/
  230. /* 函数:GetFieldValueList[4/12/2016 IT];
  231. /* 描述:获取指定表查询字段的条件记录集;
  232. /* 参数:;
  233. /* [IN] lpTableName:要查询的表;
  234. /* [IN] lpFields:要查询的字段;
  235. /* [IN] lpFilters:查询的条件;
  236. /* [IN] dwCallBackType:回调函数类型;
  237. /* [IN] lpCallBack:回调函数指针;
  238. /* [INOUT] lpParamter:传递给回调函数的参数;
  239. /* 返回:成功查询返回记录数, 参数错误返回-1;
  240. /* 注意:不使用select count(*) as cot from table来获取记录数;
  241. /* 示例:;
  242. /*
  243. /* 修改:;
  244. /* 日期:;
  245. /* 内容:;
  246. /************************************************************************/
  247. int AdoImpl::GetFieldValueList(IN LPCTSTR lpTableName, IN LPCTSTR lpFields, IN LPCTSTR lpFilters, OUT INT& nFieldsCount, IN const DWORD &dwCallBackType, IN LPVOID lpCallBack, IN OUT LPVOID lpParamter)
  248. {
  249. if ( lpCallBack == NULL || lpParamter == NULL )
  250. return -1;
  251. if ( lpTableName == NULL || lpTableName[0] == _T('\0') || lpFields == NULL || lpFields[0] == _T('\0'))
  252. return -1;
  253. int nRecordCount = 0;
  254. BOOL bResult = FALSE;
  255. TCHAR szSQL[2048] = _T(""); // 长度可能会不够,_stprintf_s结果导致SQL语句不正确;
  256. EnterCriticalSection( &m_csAdo );
  257. bResult = GetADODateBaseStatus();
  258. if( FALSE == bResult ){
  259. LeaveCriticalSection( &m_csAdo );
  260. return -1;
  261. }
  262. // 获取查询记录集;
  263. CADORecordset *pRSet = new CADORecordset(m_pADODatabase);
  264. LeaveCriticalSection( &m_csAdo );
  265. if( NULL == pRSet )
  266. return -1;
  267. if ( lpFilters && lpFilters[0] != _T('\0') )
  268. _stprintf_s(szSQL, _T("select %s from %s where %s"), lpFields, lpTableName, lpFilters);
  269. else
  270. _stprintf_s(szSQL, _T("select %s from %s"), lpFields, lpTableName);
  271. bResult = OpenADORecordSet(pRSet, szSQL);
  272. if( FALSE == bResult )
  273. {
  274. return -1;
  275. }
  276. // 让回调函数处理返回的数据集结果;
  277. nRecordCount = ((RecordsetCallback)lpCallBack)(dwCallBackType, lpParamter, 0, pRSet);
  278. // 返回字段数量;
  279. nFieldsCount = pRSet->GetFieldCount();
  280. DeleteADORecordSet(pRSet);
  281. return nRecordCount;
  282. }
  283. /************************************************************************/
  284. /* 函数:GetFieldValueList[4/12/2016 IT];
  285. /* 描述:获取指定表查询字段的条件记录集;
  286. /* 参数:;
  287. /* [IN] lpTableName:要查询的表;
  288. /* [IN] lpFields:要查询的字段;
  289. /* [IN] lpFilters:查询的条件;
  290. /* [IN] dwCallBackType:回调函数类型;
  291. /* [IN] lpCallBack:回调函数指针;
  292. /* [INOUT] lpParamter:传递给回调函数的参数;
  293. /* 返回:成功查询返回记录数, 参数错误返回-1;
  294. /* 注意:;
  295. /* 示例:;
  296. /*
  297. /* 修改:;
  298. /* 日期:;
  299. /* 内容:;
  300. /************************************************************************/
  301. int AdoImpl::GetFieldValueListEx(IN LPCTSTR lpTableName, IN LPCTSTR lpFields, IN LPCTSTR lpFilters, OUT INT& nFieldsCount, IN const DWORD &dwCallBackType, IN LPVOID lpCallBack, IN OUT LPVOID lpParamter)
  302. {
  303. if ( lpCallBack == NULL || lpParamter == NULL )
  304. return -1;
  305. if ( lpTableName == NULL || lpTableName[0] == _T('\0') || lpFields == NULL || lpFields[0] == _T('\0'))
  306. return -1;
  307. int nRecordCount = 0;
  308. BOOL bResult = FALSE;
  309. TCHAR szSQL[2048] = _T(""); // 长度可能会不够,_stprintf_s结果导致SQL语句不正确;
  310. if ( lpFilters && lpFilters[0] != _T('\0') )
  311. {
  312. _stprintf_s(szSQL, _T("select count(*) as cot from %s where %s"), lpTableName, lpFilters);
  313. }
  314. else
  315. {
  316. _stprintf_s(szSQL, _T("select count(*) as cot from %s"), lpTableName);
  317. }
  318. EnterCriticalSection( &m_csAdo );
  319. bResult = GetADODateBaseStatus();
  320. if( FALSE == bResult ){
  321. LeaveCriticalSection( &m_csAdo );
  322. return -1;
  323. }
  324. // 获取记录数;
  325. CADORecordset* pRSet = new CADORecordset(m_pADODatabase);
  326. LeaveCriticalSection( &m_csAdo );
  327. if( NULL == pRSet )
  328. return -1;
  329. bResult = OpenADORecordSet(pRSet, szSQL);
  330. if( FALSE == bResult ){
  331. return -1;
  332. }
  333. if( !pRSet->IsFieldNull(_T("cot")) )
  334. {
  335. pRSet->GetFieldValue(_T("cot"), nRecordCount);
  336. }
  337. else
  338. {
  339. nRecordCount = -1;
  340. // 没有记录则返回;
  341. DeleteADORecordSet(pRSet);
  342. return -1;
  343. }
  344. DeleteADORecordSet(pRSet);
  345. // 获取查询记录集;
  346. pRSet = new CADORecordset(m_pADODatabase);
  347. LeaveCriticalSection( &m_csAdo );
  348. if( NULL == pRSet )
  349. return -1;
  350. if ( lpFilters && lpFilters[0] != _T('\0') )
  351. _stprintf_s(szSQL, _T("select %s from %s where %s"), lpFields, lpTableName, lpFilters);
  352. else
  353. _stprintf_s(szSQL, _T("select %s from %s"), lpFields, lpTableName);
  354. bResult = OpenADORecordSet(pRSet, szSQL);
  355. if( FALSE == bResult )
  356. {
  357. return -1;
  358. }
  359. // 让回调函数处理返回的数据集结果;
  360. nRecordCount = ((RecordsetCallback)lpCallBack)(dwCallBackType, lpParamter, nRecordCount, pRSet);
  361. // 返回字段数量;
  362. nFieldsCount = pRSet->GetFieldCount();
  363. DeleteADORecordSet(pRSet);
  364. return nRecordCount;
  365. }
  366. BOOL AdoImpl::AppenChunkFromFile(IN LPCTSTR lpTableName, IN LPCTSTR lpFieldName, IN LPCTSTR lpFileName)
  367. {
  368. if ( lpTableName == NULL ||
  369. lpTableName[0] == _T('\0') ||
  370. lpFieldName == NULL ||
  371. lpFieldName[0] == _T('\0') ||
  372. lpFileName == NULL ||
  373. !PathFileExists(lpFileName) )
  374. return FALSE;
  375. CFile cf;
  376. BYTE* pBuffer = NULL;
  377. if ( !cf.Open(lpFileName, CFile::modeRead) )
  378. return FALSE;
  379. DWORD dwLength = cf.GetLength();
  380. pBuffer = new BYTE[dwLength+1];
  381. memset(pBuffer, 0, dwLength + 1);
  382. cf.Read(pBuffer, dwLength);
  383. cf.Close();
  384. BOOL bResult = AppenChunkFromBuffer(lpTableName, lpFieldName, pBuffer, dwLength);
  385. if ( pBuffer )
  386. {
  387. delete []pBuffer;
  388. pBuffer = NULL;
  389. }
  390. return bResult;
  391. }
  392. /************************************************************************/
  393. /* 函数:AppenChunkFromBuffer[4/13/2016 IT];
  394. /* 描述:从指定的缓冲区里把二进制数据写入字段中;
  395. /* 参数:;
  396. /* [IN] lpTableName:表名;
  397. /* [IN] lpFieldName:字段名;
  398. /* [IN] lpBuffer:缓冲区数据;
  399. /* [IN] nBuflen:缓冲区大小;
  400. /* 返回:void;
  401. /* 注意:;
  402. /* 示例:;
  403. /*
  404. /* 修改:;
  405. /* 日期:;
  406. /* 内容:;
  407. /************************************************************************/
  408. BOOL AdoImpl::AppenChunkFromBuffer(IN LPCTSTR lpTableName, IN LPCTSTR lpFieldName, IN BYTE* lpBuffer, IN const int& nBuflen)
  409. {
  410. if ( lpTableName == NULL ||
  411. lpTableName[0] == _T('\0') ||
  412. lpFieldName == NULL ||
  413. lpFieldName[0] == _T('\0') ||
  414. lpBuffer == NULL )
  415. return FALSE;
  416. EnterCriticalSection( &m_csAdo );
  417. BOOL bResult = GetADODateBaseStatus();
  418. if( FALSE == bResult ){
  419. LeaveCriticalSection( &m_csAdo );
  420. return FALSE;
  421. }
  422. CADORecordset *pRSet = new CADORecordset(m_pADODatabase);
  423. LeaveCriticalSection( &m_csAdo );
  424. if( NULL == pRSet )
  425. return -1;
  426. TCHAR szSQL[2048] = {0};
  427. _stprintf_s(szSQL, _T("select %s from %s"), lpFieldName, lpTableName);
  428. // 写二进制大文件时,_RecordSetPtr必须以adUseSever方式打开,则否更新不成功;
  429. bResult = OpenADORecordSet(pRSet, szSQL, adUseServer);
  430. if( FALSE == bResult )
  431. {
  432. return FALSE;
  433. }
  434. pRSet->Edit();
  435. bResult = pRSet->AppendChunk(lpFieldName, lpBuffer, nBuflen);
  436. if ( bResult )
  437. {
  438. pRSet->Update();
  439. }
  440. DeleteADORecordSet(pRSet);
  441. return bResult;
  442. }