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

书籍源码

开发平台:

Visual C++

  1. // ADODialog.cpp : Implementtion of CADODialog
  2. #include "stdafx.h"
  3. #include "ADODialog.h"
  4. /////////////////////////////////////////////////////////////////////////////
  5. // CADODialog
  6. HRESULT CADODialog::OpenConnection() {
  7.     CComBSTR bstrODBCDatabase = m_strODBCDatabase;
  8. CComBSTR bstrUserId = m_strUserID;
  9. CComBSTR bstrPassword = m_strPassword;
  10. //Create new connection
  11. CoCreateInstance(CLSID_CADOConnection, NULL, 
  12. CLSCTX_INPROC_SERVER, IID_IADOConnection, 
  13. (LPVOID *)&m_ADOConn);
  14. //Use the connection to open a link to database
  15. HRESULT hr = m_ADOConn->Open(
  16. bstrODBCDatabase, 
  17. bstrUserId,
  18. bstrPassword,
  19. adOpenUnspecified);
  20. if (FAILED(hr)) {
  21. COLEDBErrorChecking::DisplaySingleError(hr, 
  22. "OpenConnection");
  23. m_ADOConn = NULL;
  24. }
  25. return hr;
  26. }
  27. void CADODialog::CloseConnection() {
  28. if (m_ADOConn != NULL ) {
  29. //Close the connection
  30. m_ADOConn->Close();
  31. m_ADOConn = NULL;
  32. }
  33. }
  34. HRESULT CADODialog::OpenRecordset() {
  35. //Form an SQL statement from the table
  36. CComBSTR bstrSQL = "SELECT * FROM ";
  37. bstrSQL += m_strDBTable;
  38. //Allocate a new ADORecordset variable
  39. CoCreateInstance(CLSID_CADORecordset, NULL, 
  40. CLSCTX_INPROC_SERVER, IID_IADORecordset, 
  41. (LPVOID *)&m_pSet);
  42. //Open the newly formed recordset with the SQL
  43. //and the connection
  44. HRESULT hr = m_pSet->Open(
  45. CComVariant(bstrSQL),
  46. CComVariant(m_ADOConn), 
  47. adOpenKeyset, adLockOptimistic, adCmdText);
  48. if (FAILED(hr)) {
  49. COLEDBErrorChecking::DisplaySingleError(hr, 
  50. "OpenRecordset");
  51. m_pSet = NULL;
  52. }
  53. else {
  54. //Everything worked.  Move to the first record.
  55. ADOMove(FIRST, FALSE);
  56. }
  57. return hr;
  58. }
  59. void CADODialog::CloseRecordset() {
  60. if (m_pSet != NULL ) {
  61. //Close recordset 
  62. m_pSet->Close();
  63. m_pSet = NULL;
  64. }
  65. }
  66. void CADODialog::ExecuteSQL(char *SQL) {
  67. CComBSTR bstrSQL = SQL;
  68. //Execute an SQL string
  69. HRESULT hr = m_ADOConn->Execute(
  70. bstrSQL, //Source statement
  71. NULL, //VARIANT records Affected
  72.         adOptionUnspecified, //Options -- Usually leave unspecified
  73. NULL); //ADORecordset results;
  74. if (FAILED(hr)) {
  75. COLEDBErrorChecking::DisplaySingleError(hr, 
  76. "Execute SQL");
  77. }
  78. }
  79. void CADODialog::UpdateData(BOOL bSaveChangesToSet) {
  80. HRESULT hr;
  81. if (bSaveChangesToSet) {
  82. //Read From Screen
  83. GetDlgItemText(IDC_CODE, m_DepartmentCode, 5);
  84. GetDlgItemText(IDC_NAME, m_DepartmentName, 51);
  85. //Place data in database fields
  86. hr = SetFields();
  87. if (FAILED(hr)) {
  88. COLEDBErrorChecking::DisplaySingleError(hr, "SaveDepartment SetFields");
  89. }
  90. }
  91. else {
  92. //Write to Screen
  93. //Take data from database fields
  94. hr = GetFields();
  95. if (FAILED(hr)) {
  96. COLEDBErrorChecking::DisplaySingleError(hr, "OnMove GetFields");
  97. DisplayStatus("No records found.");
  98. }
  99. SetDlgItemText(IDC_CODE, m_DepartmentCode);
  100. SetDlgItemText(IDC_NAME, m_DepartmentName);
  101. }
  102. }
  103. HRESULT CADODialog::SaveChanges() {
  104. UpdateData(TRUE); //Read from screen
  105. //Update database from fields
  106. HRESULT hr = m_pSet->Update(m_varNoVariant, m_varNoVariant);
  107. if (FAILED(hr)) {
  108. COLEDBErrorChecking::DisplaySingleError(hr, "SaveDepartment Update");
  109. }
  110. return hr;
  111. }
  112. void CADODialog::DisplayStatus(char *strMessage)
  113. {
  114. //Send a message to the status line in the dialog box
  115. SetDlgItemText(IDC_STATUS, strMessage);
  116. }
  117. void CADODialog::ADOMove(ADOMoveEnum position, BOOL SaveFirst) {
  118. //This function is called by other move functions
  119. HRESULT hr;
  120. VARIANT_BOOL vb;
  121. if (SaveFirst) {
  122. //Don't save deleted records or on your first time through
  123. hr = SaveChanges(); //Save changes
  124. if (FAILED(hr)) {
  125. DisplayStatus("Save failed.  Can't move off this record.");
  126. return; //End if save did not work.
  127. }
  128. }
  129. DisplayStatus("");
  130. switch (position) {
  131. case (FIRST) : //first record
  132. hr = m_pSet->MoveFirst();
  133. break;
  134. case (NEXT) : //next record
  135. hr = m_pSet->MoveNext();
  136. m_pSet->get_EOF(&vb);
  137. if (vb) {
  138. //EOF.  No more records
  139. DisplayStatus("Last record reached.");
  140. hr = m_pSet->MoveLast();
  141. }
  142. break;
  143. case (LAST) : //last record
  144. hr = m_pSet->MoveLast();
  145. break;
  146. case (PREV) : //previous record
  147. hr = m_pSet->MovePrevious();
  148. m_pSet->get_BOF(&vb);
  149. if (vb) {
  150. //BOF.  No previous records
  151. DisplayStatus("First record reached.");
  152. hr = m_pSet->MoveFirst();
  153. }
  154. break;
  155. }
  156. if (FAILED(hr)) {
  157. COLEDBErrorChecking::DisplaySingleError(hr, "OnMove Move");
  158. DisplayStatus("No records found.");
  159. return;
  160. }
  161. UpdateData(FALSE); //Update Screen
  162. }
  163. HRESULT CADODialog::GetFields() {
  164. CComPtr<ADOFields> pFields = NULL; //Fields Container
  165. CComPtr<ADOField> pDeptCode = NULL; //Individual Field
  166. CComPtr<ADOField> pDeptName = NULL; //Individual Field
  167. CComVariant varValue; // Variant set to zero
  168. //Get all the fields in the Fields container
  169. HRESULT hr = m_pSet->get_Fields(&pFields);
  170. if (FAILED(hr)) return hr;
  171. //Get the DepartmentCode Field (Field 0)
  172. hr = pFields->get_Item(CComVariant(0), &pDeptCode);
  173. if (FAILED(hr)) return hr;
  174. //Get the value of the DepartmentCode field
  175. hr = pDeptCode->get_Value(&varValue);
  176. if (FAILED(hr)) return hr;
  177. //Assign Variant to Department Code
  178. sprintf(m_DepartmentCode, "%S", varValue.bstrVal);
  179. //Get the DepartmentName Field (Field 1)
  180. hr = pFields->get_Item(CComVariant(1), &pDeptName);
  181. if (FAILED(hr)) return hr;
  182. //Get the value of the DepartmentName field
  183. hr = pDeptName->get_Value(&varValue);
  184. if (FAILED(hr)) return hr;
  185. //Assign Variant to Department Name
  186. sprintf(m_DepartmentName, "%S", varValue.bstrVal);
  187. return hr;
  188. }
  189. HRESULT CADODialog::SetFields() {
  190. CComPtr<ADOFields> pFields = NULL;
  191. CComPtr<ADOField> pDeptCode = NULL; //Individual Field
  192. CComPtr<ADOField> pDeptName = NULL; //Individual Field
  193. //Get all the fields
  194. HRESULT hr = m_pSet->get_Fields(&pFields);
  195. if (FAILED(hr)) return hr;
  196. //Get the DepartmentCode Field (Field 0)
  197. hr = pFields->get_Item(CComVariant(0), &pDeptCode);
  198. if (FAILED(hr)) return hr;
  199. //Set the value of the DepartmentCode field
  200. hr = pDeptCode->put_Value(CComVariant(m_DepartmentCode));
  201. if (FAILED(hr)) return hr;
  202. //Get the DepartmentName Field (Field 1)
  203. hr = pFields->get_Item(CComVariant(1), &pDeptName);
  204. if (FAILED(hr)) return hr;
  205. //Set the value of the DepartmentName field
  206. return pDeptName->put_Value(CComVariant(m_DepartmentName));
  207. }