- #import "c:/program files/common files/system/ado/msado15.dll" no_namespace rename("EOF", "adoEOF")
其中路徑名可以根據自己系統安裝的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的操作,語句如下所示:
- 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();即可:例如:
- BOOL CMyAdoTestApp::InitInstance()
- {
- if(!AfxOleInit())//這就是初始化COM庫
- {
- AfxMessageBox(“OLE初始化出錯!”);
- return FALSE;
- }
創建一個對話框程序。新建一個名為ADOConn的類,在頭文件中導入msado15.dll
語句如下:
- #import "C:/Program Files/Common Files/System/ado/msado15.dll" no_namespace
- rename("EOF","adoEOF")rename("BOF","adoBOF")
這句話主要作用是引入ADO類庫。
1:在ADOConn.h頭文件中為類添加變量和初始化函數
- //添加一個指向Connection的指針
- _ConnectionPtr m_pConnection;
- //添加一個指向Recordset對象的指針
- _RecordsetPtr m_pRecordset;
- void ADOConn::OnInitADOConn()
- {
- //初始化OLE/COM庫環境
- ::CoInitialize(NULL);
- try
- {
- //´創建connection連接對象
- m_pConnection.CreateInstance("ADODB.Connection");
- //設置連接字符串
- _bstr_t strConnect="Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security
- Info=False;Initial Catalog=data;Data Source=.";
- //SERVER和UID,PWD的設定需要根據自己的情況
- m_pConnection->Open(strConnect,"","",adModeUnknown);
- }
- //捕捉異常
- catch(_com_error e)
- {
- //顯示錯誤信息
- AfxMessageBox(e.Description());
- }
- }
2:為ADOConn類添加GetRecordSet的函數,目的是打開並獲得記錄集,代碼如下:
- _RecordsetPtr& ADOConn::GetRecordSet(_bstr_t bstrSQL)
- {
- try
- {
- //連接數據庫,如果connection為空則重新連接
- if(m_pConnection==NULL)
- OnInitADOConn();
- //創建記錄集對象
- m_pRecordset.CreateInstance(__uuidof(Recordset));
- //取得表中的記錄
- m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),
- adOpenDynamic,adLockOptimistic,adCmdText);
- }
- catch(_com_error e)
- {
- e.Description();
- }
- //返回記錄集
- return m_pRecordset;
- }
3:在ADOConn類中添加ExecteSQL函數,目的是用來執行SQL語句,代碼如下:
- BOOL ADOConn::ExecuteSQL(_bstr_t bstrSQL)
- {
- _variant_t RecordsAffected;
- try
- {
- //是否連接上數據庫
- if(m_pConnection==NULL)
- OnInitADOConn();
- m_pConnection->Execute(bstrSQL,NULL,adCmdText);//adCmdText文本命令
- return true;
- }
- catch(_com_error e)
- {
- e.Description();
- return false;
- }
- }
4:設置退出記錄集類
- void ADOConn::ExitConnect()
- {
- //關閉記錄集和連接
- if(m_pRecordset!=NULL)
- m_pRecordset->Close();
- m_pConnection->Close();
- }
5:為對話框添加一個ListControl控件按鈕,並設置屬性為Report
為ListControl控件關聯一個對象CListCtrl m_grid;
在初始化對話框函數里面添加
- //設置ListControl控件的風格
- m_grid.SetExtendedStyle(LVS_EX_FLATSB
- |LVS_EX_FULLROWSELECT
- |LVS_EX_HEADERDRAGDROP
- |LVS_EX_ONECLICKACTIVATE
- |LVS_EX_GRIDLINES);
- m_grid.InsertColumn(0,"編號",LVCFMT_LEFT,100,0);
- m_grid.InsertColumn(1,"姓名",LVCFMT_LEFT,100,1);
- m_grid.InsertColumn(2,"性別",LVCFMT_LEFT,100,2);
- ADOConn m_AdoConn;
- m_AdoConn.OnInitADOConn();
- CString sql;
- sql.Format("select* from employees order by 編號 desc");
- _RecordsetPtr m_pRecordset;
- m_pRecordset = m_AdoConn.GetRecordSet((_bstr_t)sql);
- while(m_AdoConn.m_pRecordset->adoEOF==0)//EOF判斷是否到末尾
- {
- m_grid.InsertItem(0,"");
- m_grid.SetItemText(0,0,(char*)(_bstr_t)m_pRecordset->GetCollect("編號"));
- m_grid.SetItemText(0,1,(char*)(_bstr_t)m_pRecordset->GetCollect("姓名"));
- m_grid.SetItemText(0,2,(char*)(_bstr_t)m_pRecordset->GetCollect("性別"));
- m_pRecordset->MoveNext();
- }
- m_AdoConn.ExitConnect();//斷開數據庫連接
6:添加數據.
在對話框添加兩個EditBox控件和一個Combox控件和一個按鈕控件
如下圖:
關聯對象如下
- CString m_id,m_name;CComboBox m_combo;
- //在初始化中添加
- m_combo.InsertString(0,"男");
- m_combo.InsertString(1,"女");
- m_combo.SetCurSel(0);
- //按鈕響應事件:
- UpdateData(true);
- if(m_id.IsEmpty())
- {
- MessageBox("編號不能為空");
- return;
- }
- if(m_name.IsEmpty())
- {
- MessageBox("姓名不能為空");
- return;
- }
- ADOConn m_AdoConn;
- m_AdoConn.OnInitADOConn();
- _bstr_t sql;
- sql = "select*from employees";
- _RecordsetPtr m_pRecordset;
- m_pRecordset=m_AdoConn.GetRecordSet(sql);
- CString sex;
- m_combo.GetLBText(m_combo.GetCurSel(),sex);
- try
- {
- m_pRecordset->AddNew();//添加新行
- m_pRecordset->PutCollect("編號",(_bstr_t)m_id);
- m_pRecordset->PutCollect("姓名",(_bstr_t)m_name);
- m_pRecordset->PutCollect("性別",(_bstr_t)sex);
- m_AdoConn.ExitConnect();
- }
- catch(...)
- {
- MessageBox("操作失敗");
- return;
- }
- MessageBox("保存成功");
- m_grid.DeleteAllItems();
- AddToGrid();//這個是用來顯示數據的,就是第八步初始化中的代碼
7 修改記錄集
在添加一個EditBox控件,關聯對象CString m_old;用來保存,修改之前的編號;
添加修改按鈕,並響應事件,代碼如下:
- UpdateData(true);
- if(m_name.IsEmpty())
- {
- MessageBox("姓名不能為空");
- return;
- }
- ADOConn m_AdoConn;
- m_AdoConn.OnInitADOConn();
- _bstr_t sql;
- sql = "select*from employees";
- _RecordsetPtr m_pRecordset;
- m_pRecordset=m_AdoConn.GetRecordSet(sql);
- CString sex;
- m_combo.GetLBText(m_combo.GetCurSel(),sex);
- try
- {
- m_pRecordset->Move((long)pos,vtMissing);
- m_pRecordset->PutCollect("編號",(_bstr_t)m_id);
- m_pRecordset->PutCollect("姓名",(_bstr_t)m_name);
- m_pRecordset->PutCollect("性別",(_bstr_t)sex);
- m_pRecordset->Update();
- m_AdoConn.ExitConnect();
- }
- catch(...)
- {
- MessageBox("操作失敗");
- return;
- }
- MessageBox("操作成功");
- m_grid.DeleteAllItems();
- AddToGrid();
- 8:刪除記錄集
- UpdateData(true);
- ADOConn m_AdoConn;
- m_AdoConn.OnInitADOConn();
- _bstr_t sql;
- sql = "select*from employees";
- _RecordsetPtr m_pRecordset;
- m_pRecordset=m_AdoConn.GetRecordSet(sql);
- CString m_id;
- try
- {
- m_pRecordset->Move(pos,vtMissing);
- m_pRecordset->Delete(adAffectCurrent);
- m_pRecordset->Update();
- m_AdoConn.ExitConnect();
- }
- catch(...)
- {
- MessageBox("操作失敗");
- return;
- }
- MessageBox("刪除成功.");
- m_grid.DeleteAllItems();
- AddToGrid();
以上總結了,SQL連接四種基本操作
