DBDialog.cpp
上传用户:benben_wyd
上传日期:2010-02-26
资源大小:1229k
文件大小:4k
源码类别:

书籍源码

开发平台:

Visual C++

  1. // DBDialog.cpp : Implementation of CDBDialog
  2. #include "stdafx.h"
  3. #include "DBDialog.h"
  4. /////////////////////////////////////////////////////////////////////////////
  5. // CDBDialog
  6. /**********************************************
  7. The following were added by Chuck Wood for
  8. Visual C++ Database Developer's Guide
  9. **********************************************/
  10. void CDBDialog::OnMove(int position)
  11. {
  12. //This OnMove is not really an event, but
  13. //rather is called by other move functions
  14. HRESULT hr;
  15. if (FAILED(SaveDepartment())) {
  16. DisplayStatus("Save failed.  No move is possible.");
  17. return; //End if save did not work.
  18. }
  19. DisplayStatus("");
  20. switch (position) {
  21. case (FIRST) :
  22. hr = m_pSet->MoveFirst();
  23. break;
  24. case (NEXT) :
  25. hr = m_pSet->MoveNext();
  26. if (hr != S_OK) { //EOF
  27. DisplayStatus("Last record reached.");
  28. hr = m_pSet->MoveLast();
  29. }
  30. break;
  31. case (LAST) :
  32. hr = m_pSet->MoveLast();
  33. break;
  34. case (PREV) :
  35. hr = m_pSet->MovePrev();
  36. if (hr != S_OK) { //BOF
  37. DisplayStatus("First record reached.");
  38. hr = m_pSet->MoveFirst();
  39. }
  40. break;
  41. }
  42. if (FAILED(hr)) {
  43. DisplayError("No records found. Adding new record");
  44. DisplayStatus("No records found.");
  45. AddRecord();
  46. }
  47. UpdateData(FALSE); //Update Screen
  48. }
  49. void CDBDialog::ResetRowSet()
  50. {
  51. if (m_pSet->MoveNext() != S_OK) { //Go to next record
  52. if (m_pSet->MoveFirst() != S_OK) {
  53. MessageBox("No more records", "",
  54. MB_ICONEXCLAMATION);
  55. //No records, so set up an add record
  56. AddRecord();
  57. }
  58. }
  59. UpdateData(FALSE); //Write changes to window
  60. }
  61. void CDBDialog::AddRecord()
  62. {
  63. m_pSet->ClearRecord();
  64. m_bAddingRecord = TRUE;
  65. UpdateData(FALSE); //Update the window
  66. }
  67. HRESULT CDBDialog::SaveDepartment()
  68. {
  69. UpdateData(TRUE); //Read from screen
  70. HRESULT hr;
  71. if (m_bAddingRecord) {
  72. hr = m_pSet->Insert(); //Insert New rew
  73. }
  74. else {
  75. hr = m_pSet->SetData(); //Update current row
  76. }
  77. if (FAILED(hr)) {
  78. DisplayError("Update Failed.", hr, "SaveDepartment");
  79. }
  80. else {
  81. m_bAddingRecord = FALSE;
  82. }
  83. return hr;
  84. }
  85. HRESULT CDBDialog::UpdateDepartment() {
  86. m_bChangesMade = FALSE;
  87. HRESULT hr = SaveDepartment();
  88. if (FAILED(hr)) {
  89. return hr;
  90. }
  91. hr = m_pSet->m_session.Commit(); //Make Changes permanent
  92. if (FAILED(hr)){
  93. DisplayError("Commit failed", hr, "UpdateDepartment");
  94. }
  95. //Restart transaction
  96. hr = m_pSet->m_session.StartTransaction();
  97. if (FAILED(hr)){
  98. DisplayError("StartTransaction failed", hr, "UpdateDepartment");
  99. }
  100. return hr;
  101. }
  102. void CDBDialog::UpdateData(BOOL bSaveChangesToSet)
  103. {
  104. if (bSaveChangesToSet) {
  105. //Read From Screen
  106. GetDlgItemText(IDC_DEPARTMENTCODE,
  107. (char *) m_pSet->m_DepartmentCode, 5);
  108. GetDlgItemText(IDC_DEPARTMENTNAME,
  109. (char *) m_pSet->m_DepartmentName, 51);
  110. }
  111. else {
  112. //First preserve change variable
  113. BOOL ChangesMade = m_bChangesMade;
  114. //Write to Screen
  115. SetDlgItemText(IDC_DEPARTMENTCODE,
  116. (char *) m_pSet->m_DepartmentCode);
  117. SetDlgItemText(IDC_DEPARTMENTNAME,
  118. (char *) m_pSet->m_DepartmentName);
  119. //Now preserve change variable
  120. m_bChangesMade = ChangesMade;
  121. }
  122. }
  123. void CDBDialog::DisplayStatus(char *strMessage)
  124. {
  125. SetDlgItemText(IDC_STATUS, strMessage);
  126. }
  127. void CDBDialog::DisplayError(char *strMessage, HRESULT hresult, char *strFunction)
  128. {
  129. //Allow 1 k for the error message
  130. char message[1024];
  131. strcpy(message, strMessage);
  132. if (strFunction) { //Check for function equal to null
  133. //Function was passed, so see what function it was
  134. strcat(message, " in the ");
  135. strcat(message, strFunction);
  136. strcat(message, " function ");
  137. }
  138. if (FAILED(hresult)) {
  139. char holdmessage[512]; //Allow 512 bytes for HR message
  140. sprintf(holdmessage, "nnHRESULT was %ld", hresult);
  141. strcat(message, holdmessage);
  142. }
  143. MessageBox(message, "An error has occurred");
  144. }