VC++ MFC SQL ADO數據庫訪問技術使用的基本步驟及方法


1.首先,要用#import語句來引用支持ADO的組件類型庫(*.tlb),其中類型庫可以作為可執行程序 (DLL、EXE等)的一部分被定位在其自身程序中的附屬資源里,如:被定位在msado15.dll的附屬資源中,只需要直接用 #import引用它既可。可以直接在Stdafx.h文件中加入下面語句來實現:
  1. #import "c:/program files/common files/system/ado/msado15.dll" no_namespace rename("EOF", "adoEOF")   
【注意,在MFC中路徑要用"/"或者"//"】
其中路徑名可以根據自己系統安裝的ADO支持文件的路徑來自 行設定。當編譯器遇到#import語句時,它會為引用組件類型庫中的接口生成包裝類,#import語句實際上相當於執行了API涵數 LoadTypeLib()。#import語句會在工程可執行程序輸出目錄中產生兩個文件,分別為*.tlh(類型庫頭文件)及*.tli(類型庫實現 文件),它們分別為每一個接口產生智能指針,並為各種接口方法、枚舉類型,CLSID等進行聲明,創建一系列包裝方法。語句no_namespace說明 ADO對象不使用命名空間,rename ("EOF", "adoEOF")說明將ADO中結束標志EOF改為adoEOF,以避免和其它庫中命名相沖突。
    2.其次,在程序初始過程中需要初始化組件,一般可以用CoInitialize(NULL);來實現,這種方法在結束時要關閉初始化的COM,可以用下 面語句CoUnInitialize();來實現。在MFC中還可以采用另一種方法來實現初始化COM,這種方法只需要一條語句便可以自動為我們實現初始 化COM和結束時關閉COM的操作,語句如下所示:
  1. AfxOleInit();   

    3.接着,就可以直接使用ADO的操作了。我們經常使用的只是前面用#import語句引用類型庫時,生成的包裝類.tlh中聲明的智能指針中的三個,它 們分別是_ConnectionPtr、_RecordsetPtr和_CommandPtr。下面分別對它們的使用方法進行介紹:
_ConnectionPtr接 口返回一個記錄集或一個空指針。通常使用它來創建一個數據連接或執行一條不返回任何結果的SQL語句,如一個存儲過程。使用 _ConnectionPtr接口返回一個記錄集不是一個好的使用方法。對於要返回記錄的操作通常用_RecordserPtr來實現。而用 _ConnectionPtr操作時要想得到記錄條數得遍歷所有記錄,而用_RecordserPtr時不需要。
    _CommandPtr接 口返回一個記錄集。它提供了一種簡單的方法來執行返回記錄集的存儲過程和SQL語句。在使用_CommandPtr接口時,你可以利用全局 _ConnectionPtr接口,也可以在_CommandPtr接口里直接使用連接串。如果你只執行一次或幾次數據訪問操作,后者是比較好的選擇。但 如果你要頻繁訪問數據庫,並要返回很多記錄集,那么,你應該使用全局_ConnectionPtr接口創建一個數據連接,然后使用_CommandPtr 接口執行存儲過程和SQL語句。
    _RecordsetPtr是一 個記錄集對象。與以上兩種對象相比,它對記錄集提供了更多的控制功能,如記錄鎖定,游標控制等。同_CommandPtr接口一樣,它不一定要使用一個已 經創建的數據連接,可以用一個連接串代替連接指針賦給 _RecordsetPtr的connection成員變量,讓它自己創建數據連接。如果你要使用多個記錄集,最好的方法是同Command對象一樣使用 已經創建了數據連接的全局_ConnectionPtr接口,然后使用_RecordsetPtr執行存儲過程和SQL語句。

特別聲明:如果是MFC程序,則初始化ado組件就不需要用CoInitialize(NULL), 只需要在**App::InitInstance()函數中調用AfxOleInit();即可:例如:

  1. BOOL CMyAdoTestApp::InitInstance()  
  2. {  
  3. if(!AfxOleInit())//這就是初始化COM庫  
  4. {  
  5. AfxMessageBox(“OLE初始化出錯!”);  
  6. return FALSE;  
  7. }  

創建一個對話框程序。新建一個名為ADOConn的類,在頭文件中導入msado15.dll

語句如下:

  1. #import "C:/Program Files/Common Files/System/ado/msado15.dll" no_namespace  
  2.   
  3. rename("EOF","adoEOF")rename("BOF","adoBOF")  

這句話主要作用是引入ADO類庫。

1:在ADOConn.h頭文件中為類添加變量和初始化函數

  1. //添加一個指向Connection的指針  
  2.   
  3.    _ConnectionPtr m_pConnection;  
  4.   
  5. //添加一個指向Recordset對象的指針  
  6.   
  7. _RecordsetPtr m_pRecordset;  
  8.   
  9. void ADOConn::OnInitADOConn()  
  10.   
  11. {  
  12.   
  13. //初始化OLE/COM庫環境  
  14.   
  15.      ::CoInitialize(NULL);  
  16.   
  17. try  
  18.   
  19. {  
  20.   
  21. //´創建connection連接對象  
  22.   
  23.         m_pConnection.CreateInstance("ADODB.Connection");     
  24.   
  25.     //設置連接字符串  
  26.   
  27.     _bstr_t strConnect="Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security  
  28.   
  29.   
  30. Info=False;Initial Catalog=data;Data Source=.";  
  31.   
  32.     //SERVER和UID,PWD的設定需要根據自己的情況  
  33.   
  34.     m_pConnection->Open(strConnect,"","",adModeUnknown);  
  35.   
  36. }  
  37.   
  38. //捕捉異常  
  39.   
  40. catch(_com_error e)  
  41.   
  42. {  
  43.   
  44. //顯示錯誤信息  
  45.   
  46. AfxMessageBox(e.Description());  
  47.   
  48. }  
  49.   
  50. }  

2:為ADOConn類添加GetRecordSet的函數,目的是打開並獲得記錄集,代碼如下:

  1. _RecordsetPtr& ADOConn::GetRecordSet(_bstr_t bstrSQL)  
  2.   
  3. {  
  4.   
  5.      try  
  6.   
  7. {  
  8.   
  9. //連接數據庫,如果connection為空則重新連接  
  10.   
  11. if(m_pConnection==NULL)  
  12.   
  13.                OnInitADOConn();  
  14.   
  15. //創建記錄集對象  
  16.   
  17. m_pRecordset.CreateInstance(__uuidof(Recordset));  
  18.   
  19. //取得表中的記錄  
  20.   
  21.          m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),  
  22.   
  23. adOpenDynamic,adLockOptimistic,adCmdText);  
  24.   
  25. }  
  26.   
  27.      catch(_com_error e)  
  28.   
  29. {  
  30.   
  31. e.Description();  
  32.   
  33. }  
  34.   
  35. //返回記錄集  
  36.   
  37. return m_pRecordset;  
  38.   
  39. }  

3:在ADOConn類中添加ExecteSQL函數,目的是用來執行SQL語句,代碼如下:

  1. BOOL ADOConn::ExecuteSQL(_bstr_t bstrSQL)  
  2.   
  3. {  
  4.   
  5. _variant_t RecordsAffected;  
  6.   
  7. try  
  8.   
  9. {  
  10.   
  11. //是否連接上數據庫  
  12.   
  13.          if(m_pConnection==NULL)  
  14.   
  15.       OnInitADOConn();  
  16.   
  17.          m_pConnection->Execute(bstrSQL,NULL,adCmdText);//adCmdText文本命令  
  18.   
  19. return true;  
  20.   
  21. }  
  22.   
  23. catch(_com_error e)  
  24.   
  25. {  
  26.   
  27. e.Description();  
  28.   
  29. return false;  
  30.   
  31. }  
  32.   
  33. }  

4:設置退出記錄集類

  1. void ADOConn::ExitConnect()  
  2.   
  3. {  
  4.   
  5. //關閉記錄集和連接  
  6.   
  7.      if(m_pRecordset!=NULL)  
  8.   
  9. m_pRecordset->Close();  
  10.   
  11. m_pConnection->Close();  
  12.   
  13.   
  14. }  

5:為對話框添加一個ListControl控件按鈕,並設置屬性為Report

為ListControl控件關聯一個對象CListCtrl m_grid;

在初始化對話框函數里面添加

  1. //設置ListControl控件的風格  
  2.   
  3. m_grid.SetExtendedStyle(LVS_EX_FLATSB  
  4.   
  5. |LVS_EX_FULLROWSELECT  
  6.   
  7. |LVS_EX_HEADERDRAGDROP  
  8.   
  9. |LVS_EX_ONECLICKACTIVATE  
  10.   
  11. |LVS_EX_GRIDLINES);  
  12.   
  13. m_grid.InsertColumn(0,"編號",LVCFMT_LEFT,100,0);  
  14.   
  15. m_grid.InsertColumn(1,"姓名",LVCFMT_LEFT,100,1);  
  16.   
  17. m_grid.InsertColumn(2,"性別",LVCFMT_LEFT,100,2);  
  18.   
  19. ADOConn m_AdoConn;  
  20.   
  21. m_AdoConn.OnInitADOConn();  
  22.   
  23. CString sql;  
  24.   
  25. sql.Format("select* from employees order by 編號 desc");  
  26.   
  27. _RecordsetPtr m_pRecordset;  
  28.   
  29. m_pRecordset = m_AdoConn.GetRecordSet((_bstr_t)sql);  
  30.   
  31. while(m_AdoConn.m_pRecordset->adoEOF==0)//EOF判斷是否到末尾  
  32.   
  33. {  
  34.   
  35. m_grid.InsertItem(0,"");  
  36.   
  37. m_grid.SetItemText(0,0,(char*)(_bstr_t)m_pRecordset->GetCollect("編號"));  
  38.   
  39. m_grid.SetItemText(0,1,(char*)(_bstr_t)m_pRecordset->GetCollect("姓名"));  
  40.   
  41. m_grid.SetItemText(0,2,(char*)(_bstr_t)m_pRecordset->GetCollect("性別"));  
  42.   
  43. m_pRecordset->MoveNext();  
  44.   
  45. }  
  46.   
  47. m_AdoConn.ExitConnect();//斷開數據庫連接  

6:添加數據.

在對話框添加兩個EditBox控件和一個Combox控件和一個按鈕控件

如下圖:


關聯對象如下

  1. CString m_id,m_name;CComboBox m_combo;  
  2.   
  3. //在初始化中添加  
  4.   
  5. m_combo.InsertString(0,"男");  
  6.   
  7. m_combo.InsertString(1,"女");  
  8.   
  9. m_combo.SetCurSel(0);  
  10.   
  11. //按鈕響應事件:  
  12.   
  13. UpdateData(true);  
  14.   
  15. if(m_id.IsEmpty())  
  16.   
  17. {  
  18.   
  19. MessageBox("編號不能為空");  
  20.   
  21. return;  
  22.   
  23. }  
  24.   
  25. if(m_name.IsEmpty())  
  26.   
  27. {  
  28.   
  29. MessageBox("姓名不能為空");  
  30.   
  31. return;  
  32.   
  33. }  
  34.   
  35. ADOConn m_AdoConn;  
  36.   
  37. m_AdoConn.OnInitADOConn();  
  38.   
  39. _bstr_t sql;  
  40.   
  41. sql = "select*from employees";  
  42.   
  43. _RecordsetPtr m_pRecordset;  
  44.   
  45.      m_pRecordset=m_AdoConn.GetRecordSet(sql);  
  46.   
  47. CString sex;  
  48.   
  49. m_combo.GetLBText(m_combo.GetCurSel(),sex);  
  50.   
  51. try  
  52.   
  53. {  
  54.   
  55. m_pRecordset->AddNew();//添加新行  
  56.   
  57. m_pRecordset->PutCollect("編號",(_bstr_t)m_id);  
  58.   
  59. m_pRecordset->PutCollect("姓名",(_bstr_t)m_name);  
  60.   
  61. m_pRecordset->PutCollect("性別",(_bstr_t)sex);  
  62.   
  63. m_AdoConn.ExitConnect();  
  64.   
  65. }  
  66.   
  67. catch(...)  
  68.   
  69. {  
  70.   
  71. MessageBox("操作失敗");  
  72.   
  73. return;  
  74.   
  75. }  
  76.   
  77. MessageBox("保存成功");  
  78.   
  79. m_grid.DeleteAllItems();  
  80.   
  81. AddToGrid();//這個是用來顯示數據的,就是第八步初始化中的代碼  

7 修改記錄集

在添加一個EditBox控件,關聯對象CString m_old;用來保存,修改之前的編號;

添加修改按鈕,並響應事件,代碼如下:

  1. UpdateData(true);  
  2.   
  3. if(m_name.IsEmpty())  
  4.   
  5. {  
  6.   
  7. MessageBox("姓名不能為空");  
  8.   
  9. return;  
  10.   
  11. }  
  12.   
  13. ADOConn m_AdoConn;  
  14.   
  15. m_AdoConn.OnInitADOConn();  
  16.   
  17. _bstr_t sql;  
  18.   
  19. sql = "select*from employees";  
  20.   
  21. _RecordsetPtr m_pRecordset;  
  22.   
  23.      m_pRecordset=m_AdoConn.GetRecordSet(sql);  
  24.   
  25. CString sex;  
  26.   
  27. m_combo.GetLBText(m_combo.GetCurSel(),sex);  
  28.   
  29. try  
  30.   
  31. {  
  32.   
  33. m_pRecordset->Move((long)pos,vtMissing);  
  34.   
  35. m_pRecordset->PutCollect("編號",(_bstr_t)m_id);  
  36.   
  37. m_pRecordset->PutCollect("姓名",(_bstr_t)m_name);  
  38.   
  39. m_pRecordset->PutCollect("性別",(_bstr_t)sex);  
  40.   
  41. m_pRecordset->Update();  
  42.   
  43. m_AdoConn.ExitConnect();  
  44.   
  45. }  
  46.   
  47. catch(...)  
  48.   
  49. {  
  50.   
  51. MessageBox("操作失敗");  
  52.   
  53. return;  
  54.   
  55. }  
  56.   
  57. MessageBox("操作成功");  
  58.   
  59. m_grid.DeleteAllItems();  
  60.   
  61. AddToGrid();  
  62.   
  63. 8:刪除記錄集  
  64.   
  65. UpdateData(true);  
  66.   
  67. ADOConn m_AdoConn;  
  68.   
  69. m_AdoConn.OnInitADOConn();  
  70.   
  71. _bstr_t sql;  
  72.   
  73. sql = "select*from employees";  
  74.   
  75. _RecordsetPtr m_pRecordset;  
  76.   
  77.      m_pRecordset=m_AdoConn.GetRecordSet(sql);  
  78.   
  79. CString m_id;  
  80.   
  81. try  
  82.   
  83. {  
  84.   
  85. m_pRecordset->Move(pos,vtMissing);  
  86.   
  87. m_pRecordset->Delete(adAffectCurrent);  
  88.   
  89. m_pRecordset->Update();  
  90.   
  91. m_AdoConn.ExitConnect();  
  92.   
  93. }  
  94.   
  95. catch(...)  
  96.   
  97. {  
  98.   
  99. MessageBox("操作失敗");  
  100.   
  101. return;  
  102.   
  103. }  
  104.   
  105. MessageBox("刪除成功.");  
  106.   
  107. m_grid.DeleteAllItems();  
  108.   
  109. AddToGrid();  

以上總結了,SQL連接四種基本操作


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM