VC(MFC)以ADO串連資料庫(基於控制項ListControl)

來源:互聯網
上載者:User

 

文章出處: 星魂工作室    獨孤殘雲

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));

    說明:獲得當前選中記錄中的某一個欄位名
     參數一:行數
     參數二:列數

    參數三:欄位名的暫存變數

     參數四:暫存變數的長度

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.