EMPBIZ.CPP
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:12k
源码类别:

Windows编程

开发平台:

Visual C++

  1. // EmpBiz.cpp : implementation file
  2. //
  3. #define INITGUID
  4. #include "stdafx.h"
  5. #include "Emp.h"
  6. #include "EmpBiz.h"
  7. #ifdef _DEBUG
  8. //#define new DEBUG_NEW
  9. #undef THIS_FILE
  10. static char THIS_FILE[] = __FILE__;
  11. #endif
  12. #define THROW_ERR(exp) if (FAILED(hr = (exp))) throw hr
  13. const LPCWSTR g_lpcwszSource = L"OLE_DB_NWind_Jet;";
  14. const LPCWSTR g_lpcwszUser = L"Admin";
  15. const LPCWSTR g_lpcwszPwd = L"";
  16. const LPCWSTR g_lpcwszSQL = L"select EmployeeId, LastName, FirstName, Title, HomePhone from Employees";
  17. static bool fResetFilter = false;
  18. /////////////////////////////////////////////////////////////////////////////
  19. // CEmpBiz 
  20. CEmpBiz::CEmpBiz()
  21. {
  22. m_piConnection = NULL;
  23. m_piEmpRecordSet = NULL; 
  24. m_fConnected = FALSE;
  25. m_fRecordsetEmpty = TRUE;
  26. }
  27. CEmpBiz::~CEmpBiz()
  28. {
  29. if ( m_piConnection != NULL )
  30. m_piConnection->Release();  
  31. if ( m_piEmpRecordSet != NULL )
  32. m_piEmpRecordSet->Release();  
  33. m_varLastGoodRecord.Clear();
  34. m_piConnection = NULL;
  35. m_piEmpRecordSet = NULL;
  36. }
  37. long CEmpBiz::GetEmployeeId() 
  38. {
  39. HRESULT hr;
  40. COleVariant vFldName, vID;
  41. if (!m_fConnected)
  42. return 0;
  43. //Watch for empty recordset
  44. if(m_fRecordsetEmpty)
  45. return 0;
  46. vFldName.bstrVal = CString(EMP_EMPLOYEE_ID).AllocSysString();
  47. vFldName.vt = VT_BSTR;
  48. THROW_ERR(  m_piEmpRecordSet->get_Collect(vFldName, vID) );
  49. return VTOLONG(vID);
  50. }
  51. CString CEmpBiz::GetFirstName() 
  52. {
  53. HRESULT hr;
  54. COleVariant vFldName, vFirstName;
  55.   if (!m_fConnected)
  56. return "";
  57. //Watch for empty recordset
  58. if(m_fRecordsetEmpty)
  59. return "";
  60. vFldName.bstrVal = CString(EMP_FIRST_NAME).AllocSysString();
  61. vFldName.vt = VT_BSTR;
  62. THROW_ERR( m_piEmpRecordSet->get_Collect(vFldName, vFirstName) );
  63. return VTOCSTR(vFirstName);
  64. }
  65.    
  66. CString CEmpBiz::GetLastName() 
  67. {
  68. HRESULT hr;
  69. COleVariant vFldName, vLastName;
  70.   if (!m_fConnected)
  71. return "";
  72. //Watch for empty recordset
  73. if(m_fRecordsetEmpty)
  74. return "";
  75. vFldName.bstrVal = CString(EMP_LAST_NAME).AllocSysString();
  76. vFldName.vt = VT_BSTR;
  77. THROW_ERR( m_piEmpRecordSet->get_Collect(vFldName, vLastName) );
  78. return VTOCSTR(vLastName);
  79. }
  80.  
  81. CString CEmpBiz::GetHomePhone() 
  82. {
  83. HRESULT hr;
  84. COleVariant vFldName, vHomePhone;
  85.  
  86.   if (!m_fConnected)
  87. return "";
  88. //Watch for empty recordset
  89. if(m_fRecordsetEmpty)
  90. return "";
  91. vFldName.bstrVal = CString(EMP_HOME_PHONE).AllocSysString();
  92. vFldName.vt = VT_BSTR;
  93. THROW_ERR( m_piEmpRecordSet->get_Collect(vFldName, vHomePhone) );
  94. return VTOCSTR(vHomePhone);
  95. }
  96.     
  97. CString CEmpBiz::GetTitle() 
  98. {
  99. HRESULT hr;
  100. COleVariant vFldName, vTitle;
  101.   if (!m_fConnected)
  102. return "";
  103. //Watch for empty recordset
  104. if(m_fRecordsetEmpty)
  105. return "";
  106. vFldName.bstrVal = CString(EMP_TITLE).AllocSysString();
  107. vFldName.vt = VT_BSTR;
  108. THROW_ERR( m_piEmpRecordSet->get_Collect(vFldName, vTitle) );
  109. return VTOCSTR(vTitle);
  110. }
  111.   
  112. BOOL CEmpBiz::IsAddMode() 
  113. {
  114. HRESULT hr;
  115.   EditModeEnum lEditMode;
  116. THROW_ERR( m_piEmpRecordSet->get_EditMode(&lEditMode) );
  117. return lEditMode == adEditAdd ;
  118. }
  119. void CEmpBiz::AddRecord() 
  120. {
  121. // TODO: Add your control notification handler code here
  122. HRESULT hr;
  123. VARIANT rgvFields;
  124. VARIANT rgvValues;
  125. if (!m_fConnected)
  126. return;
  127. ClearFilter() ;
  128. //Watch for empty recordset
  129. if(!m_fRecordsetEmpty && !IsAddMode() )
  130. {
  131. //Remember where we were before adding in case the user
  132. //cancels and we have to return
  133. THROW_ERR( m_piEmpRecordSet->get_Bookmark(m_varLastGoodRecord) );
  134. }
  135. rgvFields.vt = VT_ERROR;
  136. rgvFields.scode = DISP_E_PARAMNOTFOUND;
  137. rgvValues.vt = VT_ERROR;
  138. rgvValues.scode = DISP_E_PARAMNOTFOUND;
  139. THROW_ERR( m_piEmpRecordSet->AddNew(rgvFields, rgvValues) );
  140. // THROW_ERR(  m_piEmpRecordSet->Update(rgvFields, rgvValues) );
  141. m_fRecordsetEmpty = FALSE;
  142. return ;
  143. }
  144. void CEmpBiz::CancelPendingAdd()
  145. {
  146. HRESULT hr;
  147. THROW_ERR(  m_piEmpRecordSet->CancelUpdate() );
  148. THROW_ERR(  m_piEmpRecordSet->put_Bookmark(m_varLastGoodRecord) );
  149. }
  150. void CEmpBiz::DeleteRecord() 
  151. {
  152. // TODO: Add your control notification handler code here
  153. HRESULT hr;
  154.   EditModeEnum lEditMode;
  155. VARIANT_BOOL vbEOF, vbBOF;
  156. //Watch for empty recordset
  157. if (!m_fConnected || m_fRecordsetEmpty)
  158. return;
  159. //Delete method depends on current mode
  160. THROW_ERR( m_piEmpRecordSet->get_EditMode(&lEditMode) );
  161. switch (lEditMode)
  162. {
  163. case adEditNone: // Just delete it
  164. {
  165. THROW_ERR(  m_piEmpRecordSet->Delete(adAffectCurrent) );
  166. THROW_ERR(  m_piEmpRecordSet->MoveNext() );
  167. //Watch for end of record set
  168. THROW_ERR(  m_piEmpRecordSet->get_EOF(&vbEOF) );
  169. if(vbEOF)
  170. {
  171. THROW_ERR( m_piEmpRecordSet->MovePrevious() );
  172. //Check for empty record set.
  173. THROW_ERR(  m_piEmpRecordSet->get_BOF(&vbBOF) );
  174. if(vbBOF)
  175. m_fRecordsetEmpty  = TRUE;
  176. }
  177. break;
  178. }
  179. case adEditInProgress: //Forget changes
  180. {
  181. THROW_ERR(  m_piEmpRecordSet->CancelUpdate() );
  182. THROW_ERR(  m_piEmpRecordSet->Delete(adAffectCurrent) );
  183. THROW_ERR(  m_piEmpRecordSet->MoveFirst() );
  184. break;
  185. }
  186. case adEditAdd: //If new record, go back to last known
  187. {
  188. THROW_ERR(  m_piEmpRecordSet->CancelUpdate() );
  189. THROW_ERR(  m_piEmpRecordSet->put_Bookmark(m_varLastGoodRecord) );
  190. }
  191. }
  192. return ;
  193. }
  194. BOOL CEmpBiz::MoveNext() 
  195. {
  196. // TODO: Add your control notification handler code here
  197. HRESULT hr;
  198. VARIANT_BOOL vbEOF;
  199. if (!m_fConnected || m_fRecordsetEmpty)
  200. return FALSE;
  201.  
  202. if (fResetFilter)
  203. ClearFilter();
  204. THROW_ERR( m_piEmpRecordSet->MoveNext() );
  205. //Watch for end of record set
  206. THROW_ERR( m_piEmpRecordSet->get_EOF(&vbEOF) );
  207. if(vbEOF)
  208. {
  209. THROW_ERR( m_piEmpRecordSet->MovePrevious() );
  210. return FALSE;
  211. }
  212. else
  213. {
  214. return TRUE;
  215. }
  216. }
  217. BOOL CEmpBiz::MovePrevious() 
  218. {
  219. // TODO: Add your control notification handler code here
  220. HRESULT hr;
  221. VARIANT_BOOL vbBOF;
  222. if (!m_fConnected || m_fRecordsetEmpty)
  223. return FALSE;
  224. if (fResetFilter)
  225. ClearFilter();
  226. THROW_ERR( m_piEmpRecordSet->MovePrevious() );
  227. //Watch for beginning of recordset
  228. THROW_ERR( m_piEmpRecordSet->get_BOF(&vbBOF) );
  229. if(vbBOF)
  230. {
  231. THROW_ERR( m_piEmpRecordSet->MoveNext() );  
  232. return FALSE;
  233. }
  234. else
  235. {
  236. return TRUE;
  237. }
  238. }
  239. BOOL CEmpBiz::MoveFirst() 
  240. {
  241. // TODO: Add your control notification handler code here
  242. HRESULT hr;
  243. VARIANT_BOOL vbBOF;
  244. if (!m_fConnected || m_fRecordsetEmpty)
  245. return FALSE;
  246. if (fResetFilter)
  247. ClearFilter();
  248. THROW_ERR( m_piEmpRecordSet->MoveFirst() );
  249. //Watch for beginning of recordset
  250. THROW_ERR( m_piEmpRecordSet->get_BOF(&vbBOF) );
  251. if(vbBOF)
  252. {
  253. return FALSE;
  254. }
  255. else
  256. {
  257. return TRUE;
  258. }
  259. }
  260. BOOL CEmpBiz::MoveLast() 
  261. {
  262. // TODO: Add your control notification handler code here
  263. HRESULT hr;
  264. VARIANT_BOOL vbEOF;
  265. if (!m_fConnected || m_fRecordsetEmpty)
  266. return FALSE;
  267. if (fResetFilter)
  268. ClearFilter();
  269. THROW_ERR( m_piEmpRecordSet->MoveLast() );
  270. //Watch for beginning of recordset
  271. THROW_ERR( m_piEmpRecordSet->get_BOF(&vbEOF) );
  272. if(vbEOF)
  273. {
  274. return FALSE;
  275. }
  276. else
  277. {
  278. return TRUE;
  279. }
  280. }
  281. BOOL CEmpBiz::FindForward(CString strCriteria) 
  282. {
  283. HRESULT hr;
  284. VARIANT_BOOL vbEOF;
  285. COleVariant v;
  286. if (!m_fConnected || m_fRecordsetEmpty)
  287. return FALSE;
  288. THROW_ERR( m_piEmpRecordSet->get_Filter(&v) );
  289. if ( v.vt != VT_BSTR || strCriteria != v.bstrVal )
  290. {
  291. v.vt = VT_BSTR;
  292. v.bstrVal = strCriteria.AllocSysString();
  293. THROW_ERR(  m_piEmpRecordSet->put_Filter(v) );
  294. fResetFilter = true;
  295. }
  296. else
  297. {
  298. THROW_ERR( m_piEmpRecordSet->MoveNext() );
  299. }
  300. //Watch for ending of recordset
  301. THROW_ERR( m_piEmpRecordSet->get_EOF(&vbEOF));
  302. if(vbEOF)
  303. {    
  304. ClearFilter() ;
  305. THROW_ERR( m_piEmpRecordSet->MoveLast() );
  306. return FALSE;
  307. }
  308. else
  309. {
  310. return TRUE;
  311. }
  312. }
  313. void CEmpBiz::ClearFilter() 
  314. {
  315. HRESULT hr;
  316. VARIANT v;
  317. if ( !m_fRecordsetEmpty)
  318. {
  319. v.vt = VT_I2;
  320. v.iVal = adFilterNone;
  321. THROW_ERR( m_piEmpRecordSet->put_Filter(v) );
  322. fResetFilter = false;
  323. }
  324. }
  325.   
  326. //
  327. //Update record in the database
  328. //
  329. void CEmpBiz::UpdateEmpRec(CString &strFirstName, 
  330. CString &strHomePhone, CString &strLastName,
  331. CString &strTitle)
  332. {
  333. HRESULT hr;
  334. VARIANT varFields;    
  335. VARIANT varValues;
  336. WCHAR *columnNames[4] = { L"firstName", L"Lastname", L"title", L"homePhone"};
  337. ADOFields *pFields = NULL;
  338. ADOField *pField = NULL;
  339. CVar varIndex(VT_BSTR);
  340. COleVariant varFieldVal;
  341. if  (m_fRecordsetEmpty)
  342. return;
  343. varFields.vt = VT_ERROR;
  344. varFields.scode = DISP_E_PARAMNOTFOUND;
  345. varValues.vt = VT_ERROR;
  346. varValues.scode = DISP_E_PARAMNOTFOUND;
  347. try
  348. {
  349. // get the fields interface
  350. THROW_ERR(  m_piEmpRecordSet->get_Fields(&pFields) );
  351. varIndex = SysAllocString(columnNames[0]) ;
  352. THROW_ERR(  pFields->get_Item(varIndex, &pField) );
  353. varFieldVal.vt = VT_BSTR;
  354. varFieldVal.bstrVal = strFirstName.AllocSysString();
  355. THROW_ERR(  pField->put_Value(varFieldVal) );
  356. varFieldVal.Clear();
  357. varIndex = SysAllocString(columnNames[1]) ;
  358. THROW_ERR(  pFields->get_Item(varIndex, &pField) );
  359. varFieldVal.vt = VT_BSTR;
  360. varFieldVal.bstrVal = strLastName.AllocSysString();
  361. THROW_ERR(  pField->put_Value(varFieldVal) );
  362. varFieldVal.Clear();
  363. varIndex = SysAllocString(columnNames[2]) ;
  364. THROW_ERR(  pFields->get_Item(varIndex, &pField) );
  365. varFieldVal.vt = VT_BSTR;
  366. varFieldVal.bstrVal = strTitle.AllocSysString();
  367. THROW_ERR(  pField->put_Value(varFieldVal) );
  368. varFieldVal.Clear();
  369. varIndex = SysAllocString(columnNames[3]) ;
  370. THROW_ERR(  pFields->get_Item(varIndex, &pField) );
  371. varFieldVal.vt = VT_BSTR;
  372. varFieldVal.bstrVal = strHomePhone.AllocSysString();
  373. THROW_ERR(  pField->put_Value(varFieldVal) );
  374. varFieldVal.Clear();
  375. //Commit the changes   
  376. THROW_ERR(  m_piEmpRecordSet->Update(varFields, varValues) );
  377. pField->Release();
  378. pFields->Release();
  379. //Return to the edited record
  380. //CADOBookmark cBookmark = m_piEmpRecordSet->GetLastModified();
  381. //m_piEmpRecordSet->SetBookmark(cBookmark);
  382. }
  383. catch (HRESULT hr)
  384. {
  385. if (pField)
  386. pField->Release();
  387. if (pFields)
  388. pFields->Release();
  389. throw hr;
  390. }
  391. return ;
  392. }
  393. /////////////////////////////////////////////////////////////////////////////
  394. // CEmpBiz support 
  395. //When the document is created, connect to the database and open the
  396. //Employee recordset.
  397. BOOL CEmpBiz::ConnectToDatabase()
  398. {
  399. CVar varDataSource, varUserId, varPwd, varSQL;
  400. HRESULT hr;
  401. CVar vNull(VT_ERROR, DISP_E_PARAMNOTFOUND);
  402. VARIANT_BOOL vbEOF, vbBOF;
  403. varDataSource = g_lpcwszSource;
  404. varUserId = g_lpcwszUser;
  405. varPwd = g_lpcwszPwd;
  406. varSQL = g_lpcwszSQL;
  407. //Open the database and the recordset
  408. try
  409. {
  410. if ( m_piConnection == NULL || m_piEmpRecordSet == NULL)
  411. {
  412. THROW_ERR(   CoInitialize(NULL) );
  413. THROW_ERR(   CoCreateInstance(CLSID_CADOConnection, NULL, CLSCTX_INPROC_SERVER, IID_IADOConnection, (LPVOID *)&m_piConnection) );
  414. THROW_ERR(   m_piConnection->Open( varDataSource, varUserId, varPwd, adOpenUnspecified ) );
  415. THROW_ERR(   CoCreateInstance(CLSID_CADORecordset, NULL, CLSCTX_INPROC_SERVER, IID_IADORecordset, (LPVOID *)&m_piEmpRecordSet) );
  416. THROW_ERR(   m_piEmpRecordSet->putref_ActiveConnection(m_piConnection) );
  417. THROW_ERR(   m_piEmpRecordSet->put_Source(varSQL) );  
  418. vNull.vt = VT_ERROR;
  419. vNull.scode = DISP_E_PARAMNOTFOUND;
  420. THROW_ERR(   m_piEmpRecordSet->Open(vNull, vNull, adOpenKeyset, adLockOptimistic, adCmdText) );
  421. //Check for empty record set.
  422. THROW_ERR(  m_piEmpRecordSet->get_EOF(&vbEOF) );
  423. THROW_ERR(  m_piEmpRecordSet->get_BOF(&vbBOF) );
  424. if(vbEOF && vbBOF)
  425. m_fRecordsetEmpty  = TRUE;
  426. else
  427. m_fRecordsetEmpty  = FALSE;
  428. }
  429. return TRUE;
  430. }
  431. catch (HRESULT hr)
  432. {
  433. PopupErrorMessage(hr);
  434. return (FALSE);
  435. }
  436. }
  437. void PopupErrorMessage(HRESULT hr)
  438. {
  439. IErrorInfo *pei = NULL;
  440. if (::GetErrorInfo(0, &pei) == S_OK)
  441. {
  442. BSTR err;
  443. int wlen = 0;
  444. TCHAR szBuff[1024];
  445. pei->GetDescription(&err);
  446. pei->Release();
  447. wlen = WideCharToMultiByte(CP_ACP, 0, err, SysStringLen(err), szBuff, 1023, NULL, NULL);
  448. SysFreeString(err);
  449. if (wlen > 0)
  450. {
  451. szBuff[wlen] = '';
  452. AfxMessageBox(szBuff);
  453. return;
  454. }
  455. }
  456. TCHAR szBuf[256];
  457. wsprintf(szBuf, _T("Error: %X n"), hr);
  458. AfxMessageBox(szBuf);
  459. }