文章出處: 星魂工作室 獨孤殘雲
MFC以ADO串連資料庫的方法大致分為如下幾個步驟:
1.在Stdafx.h中引入相應的dll檔案
#import "c:/program files/common files/system/ado/msado15.dll" /<br />no_namespace /<br />rename ("EOF", "adoEOF")
2.在相應的App檔案中聲明串連變數
_ConnectionPtr m_pConnection; //多為public類型
3.在相應的App檔案的InitInstance()函數中構建變數m_pConnection的執行個體
AfxOleInit();//初始化相應的Com環境(這一句是必不可少的!!!)</p><p>m_pConnection.CreateInstance(__uuidof(Connection));</p><p>// 在ADO操作中建議語句中要常用try...catch()來捕獲錯誤資訊,<br />// 因為它有時會經常出現一些想不到的錯誤。(在後面的代碼中我們省略這一步,以此類推)</p><p>try<br />{<br /> // 開啟本地Access庫Demo.mdb<br /> m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Demo.mdb","","",adModeUnknown);</p><p>}<br />catch(_com_error e)<br />{<br /> AfxMessageBox("資料庫連接失敗,確認資料庫Demo.mdb是否在當前路徑下!");<br /> return FALSE;<br />}
4.在相應的Dlg檔案中聲明相應的串連變數
_ConnectionPtr m_pConnection;<br />_CommandPtr m_pCommand;<br />_RecordsetPtr m_pRecordset;
5.在相應的Dlg的OnInitDialog()中聲明ListControl的風格
( 此之前一定要記得為相應的ListControl控制項添加相應的變數m_List !!! )
DWORD dwStyle; // 設定新風格<br />dwStyle=::GetWindowLong(m_List.m_hWnd,GWL_STYLE);<br />dwStyle|=LVS_REPORT | LVS_SHOWSELALWAYS | LVS_EDITLABELS;<br />::SetWindowLong(m_List.m_hWnd,GWL_STYLE,dwStyle);<br />dwStyle=m_List.GetExtendedStyle();<br />dwStyle|=LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT;<br />m_List.SetExtendedStyle(dwStyle);</p><p>m_List.InsertColumn(0,"Columnname1",LVCFMT_CENTER,60); </p><p>m_List.InsertColumn(1,"Columnname2",LVCFMT_CENTER,60); //初始化ListControl控制項的各個列
6.聲明相應的讀取資料庫函數ReadList()
void CMyClass::ReadList()<br />{<br />UpdateData();<br />m_List.DeleteAllItems();//首先將ListControl中已有的資料清空,而後重新從資料庫讀入,以實現重新整理效果</p><p>CString SQL,Columnname1,Columnname2......;<br />/*****************************通過以下兩句代碼即可實現實質上的以SQL語句操控資料庫***************************/</p><p> SQL.Format("select /*列名*/,MajorName from Tablename where mdbColumnname1='%s'",m_Columnname1); /*聲明相應的SQL語句*/</p><p> m_pRecordset=theApp.m_pConnection->Execute((_bstr_t)SQL,NULL,adCmdText);/*記錄集指標執行SQL語句*/</p><p>/*********************************************************************************************************************************/</p><p>int Counter=0;<br /> if(!(m_pRecordset->BOF))//若記錄集指標未指向資料庫中的首元素<br /> {<br /> m_pRecordset->MoveFirst();//則將其指向首元素位置<br /> while (!m_pRecordset->adoEOF)//若記錄集指標未指向資料庫中的尾元素,則迴圈永遠不會結束</p><p> {<br /> Columnname1=(char*)(_bstr_t)m_pRecordset->GetCollect("mdbColumnname1");<br /> Columnname1=(char*)(_bstr_t)m_pRecordset->GetCollect("mdbColumnname2");</p><p> //...............................</p><p> m_List.InsertItem(Counter,0);</p><p> m_List.SetItemText(Counter,0,Columnname1);//其中的Counter為行號;0為列號即欄位號<br /> m_List.SetItemText(Counter,1,Columnname2);//同上</p><p> //...........................................<br /> m_pRecordset->MoveNext();<br /> Counter++;<br /> }<br />}<br />UpdateData(false);<br />}
7.聲明相應的添加記錄函數AddList()
void CMyClass::AddList()<br />{<br />CString SQL,m_Columnname1,m_Columnname2........;//聲明SQL暫存字串及其他可能用到的資料庫欄位暫存變數</p><p> UpdateData();<br /> int editmajorno=atoi(dlg.m_editmajorno);<br /> SQL.Format("Insert into .../*Tablename*/... (/*Columnnames*/.......) Values (........)",m_Columnname1,m_Columnname2,.......);<br /> theApp.m_pConnection->Execute((_bstr_t)SQL,NULL,adCmdText);/*記錄集指標執行SQL語句*/<br /> ReadList(SQL);</p><p>}
8.聲明相應的刪除記錄函數DelList()
void CMyClass::DelList()<br />{<br />// TODO: Add your control notification handler code here<br />CString SQL;<br />POSITION pos=m_List.GetFirstSelectedItemPosition();<br />int n=m_List.GetNextSelectedItem(pos);<br />char m_ID[30]={'/0'};<br /> m_List.GetItemText(n,0,m_ID,sizeof(m_ID));<br /> SQL.Format("Delete from Tablename where ID='%s'",m_ID);<br /> theApp.m_pConnection->Execute((_bstr_t)SQL,NULL,adCmdText);<br /> ReadList(SQL);<br />}
9.聲明相應的修改記錄函數UpdList();
void CMAJOR::OnUpdmajor()<br />{</p><p>CString SQL;</p><p> POSITION pos=m_List.GetFirstSelectedItemPosition();<br /> int n=m_List.GetNextSelectedItem(pos);</p><p>char m_ID[30]={'/0'};<br /> m_List.GetItemText(n,0,m_ID,sizeof(m_ID)); </p><p> UpdateData();<br /> SQL.Format("Update tablename Set Columnname1='%s',Columnname2='% s',......",m_Columnname1,m_Columnname2......); </p><p> theApp.m_pConnection->Execute((_bstr_t)SQL,NULL,adCmdText);/*記錄集指標執行SQL語句*/<br /> ReadList(SQL);</p><p>}
10.以下是針對於ListControl的一些常用函數(補充中。。。)
1>m_List.InsertColumn(0,"name",LVCFMT_CENTER,60);
說明:該函數可快速實現ListControl控制項相應欄位的初始化
參數一:欄位索引
參數二:欄位名稱
參數三:欄位顯示方式(範例中為置中顯示)
參數四:欄位預設寬度(範例中為60)
2>POSITION pos=m_List.GetFirstSelectedItemPosition();
說明:獲得控制項中當前選中記錄的位置
int n=m_List.GetNextSelectedItem(pos);
說明:由位置轉化得到當前選中記錄的行數
m_List.GetItemText(n,0,m_ID,sizeof(m_ID));
說明:獲得當前選中記錄中的某一個欄位名
參數一:行數
參數二:列數
參數三:欄位名的暫存變數
參數四:暫存變數的長度