資料庫訪問技術之ODBC

來源:互聯網
上載者:User

在具體的應用之前,我們先瞭解一下ODBC資料庫訪問技術的工作原理:

應用程式要訪問一個資料庫,首先必須用ODBC管理器註冊一個資料來源,管理器根據資料來源提供的資料庫位置、資料庫類型及ODBC驅動程式等資訊,建立起ODBC與具體資料庫的聯絡。這樣,只要應用程式將資料來源名提供給ODBC,ODBC就能建立起與相應資料庫的串連。但是需要注意:在ODBC中,ODBC API不能直接存取資料庫,必須通過驅動程式管理器與資料庫交換資訊。驅動程式管理器負責將應用程式對ODBC
API的調用傳遞給正確的驅動程式,而驅動程式在執行完相應的操作後,將結果通過驅動程式管理器返回給應用程式。

接下來就為我們編寫Demo做一些準備工作:

1 使用Access建立1個資料庫odbcdemo.mdb和1個表studentinfo(注意將id設定為主鍵)  包含:學號(id)、姓名(name)、性別(sex)、年齡(age)、專業(profession)、籍貫(address)六個欄位,再順便添加幾個記錄,儲存並退出。
2 使用控制台---管理工具---資料來源(ODBC),添加資料來源;

  具體步驟: 單擊添加,在開啟的建立資料來源對話方塊中選擇Microsoft Access Driver(*.mdb),單擊完成; 在彈出的ODBC Microsoft Access安裝對話方塊中選擇資料庫odbcdemo.mdb; 並設定資料來源名DSN,在此我們設定為dsn_odbcdemo,當然,也可以單擊進階按鈕,在其中對資料庫進行使用者名稱和密碼的設定。待一切設定完成

後,單擊確定即可完成對資料來源的添加。此時你就會發現在使用者資料來源列表中已經存在dsn_odbcdemo。

3 接下來就開始我們的Demo的編寫了。

具體步驟:  

1. 建立基於對話方塊的應用程式。 注意:可以選上winsock,以後進行伺服器身分識別驗證使用;
2. 建立基於CRecordset類的衍生類別CRecordsetChild,在Database Options對話方塊中指定資料來源,選擇ODBC裡的dsn_odbcdemo,在Recordset type中選動態Dynaset。點擊OK,然後在彈出的對話方塊中選擇表studentinfo,確定退出;
3. 在stdafx.h中增加標頭檔   #include <afxdb.h>
4. 在*Dlg類中增加成員變數

public:CDatabase m_db;//資料庫物件CRecordsetChild * m_pSet;//記錄集的指標

5.在*Dlg.h中增加標頭檔  #include "RecordsetChild.h"
6. 在OnInitDialog()函數中增加代碼  

CString dsn="DSN=dsn_odbcdemo;DBQ=odbcdemo.mdb";//注意:在此資料庫位於工程所在檔案夾中,如果你的資料庫在其他地方,應該修改後面的資料庫路徑CString dsn = "DSN=dsn_odbcdemo;DBQ=odbcdemo.mdb";m_db.OpenEx(dsn);m_pSet = new CRecordsetChild(&m_db);CString sql = "select * from studentinfo";m_pSet->Open(CRecordset::dynaset, sql);//按照select語句將查詢結果放到記錄集裡。動態。

7. 為了將資訊顯示在介面上,需在介面上加6個控制項(編輯框),分別關聯6個變數:  m_edit_name m_edit_id   m_edit_sex   m_edit_age m_edit_profession
  m_edit_address, 同時在OnInitDialog()函數中增加代碼:

m_edit_name = m_pSet ->m_name;m_edit_sex = m_pSet->m_sex;m_edit_age.Format("%d", m_pSet ->m_age);m_edit_id = m_pSet ->m_id;m_edit_profession = m_pSet ->m_profession;m_edit_address = m_pSet ->m_address;UpdateData(FALSE);//更新使其在頁面顯示


  編譯運行後,便可看到從資料庫中讀取到的資訊。
9 怎樣看後面的記錄資訊
增加6個Button控制項,並添加如下代碼:

void CODBCDemoDlg::OnButtonAdd()//增加記錄{// TODO: Add your control notification handler code herem_pSet->AddNew();UpdateData(TRUE);m_pSet ->m_name = m_edit_name;m_pSet ->m_age = atoi((LPCTSTR)m_edit_age);m_pSet ->m_sex = m_edit_sex;m_pSet ->m_id = m_edit_id;m_pSet ->m_profession = m_edit_profession;m_pSet ->m_address = m_edit_address;m_pSet ->Update();m_pSet ->MoveLast();}void CODBCDemoDlg::OnButtonDelete()//刪除記錄{// TODO: Add your control notification handler code herem_pSet ->Delete();m_edit_name = "";m_edit_age = "";m_edit_sex = "";m_edit_id = "";m_edit_profession = "";m_edit_address = "";UpdateData(FALSE);}void CODBCDemoDlg::OnButtonUpdate()//修改記錄{// TODO: Add your control notification handler code herem_pSet ->Edit();UpdateData(TRUE);m_pSet ->m_name = m_edit_name;m_pSet ->m_age = atoi((LPCTSTR)m_edit_age);m_pSet ->m_sex = m_edit_sex;m_pSet ->m_id = m_edit_id;m_pSet ->m_profession = m_edit_profession;m_pSet ->m_address = m_edit_address;m_pSet ->Update();}void CODBCDemoDlg::OnButtonFind()//查看{// TODO: Add your control notification handler code hereUpdateData(TRUE);m_pSet->Close();//在此注意:由於查詢時使用的sql語句不同,所以在重新查詢時應先將前面開啟的記錄集關閉CString sql;sql.Format("select * from studentinfo where name='%s'", m_edit_name);m_pSet->Open(CRecordset::dynaset, sql);if (m_pSet != NULL){m_edit_name = m_pSet ->m_name;m_edit_sex = m_pSet->m_sex;m_edit_age.Format("%d", m_pSet ->m_age);m_edit_id = m_pSet ->m_id;m_edit_profession = m_pSet ->m_profession;m_edit_address = m_pSet ->m_address;UpdateData(FALSE);}}void CODBCDemoDlg::OnButtonFirst()//查看第一條記錄{// TODO: Add your control notification handler code herem_pSet->MoveFirst();m_edit_name = m_pSet ->m_name;m_edit_sex = m_pSet->m_sex;m_edit_age.Format("%d", m_pSet ->m_age);m_edit_id = m_pSet ->m_id;m_edit_profession = m_pSet ->m_profession;m_edit_address = m_pSet ->m_address;UpdateData(FALSE);}void CODBCDemoDlg::OnButtonPrevious()//查看前一條記錄{// TODO: Add your control notification handler code herem_pSet->MovePrev();if (m_pSet ->IsBOF()){m_pSet->MoveFirst();}m_edit_name = m_pSet ->m_name;m_edit_sex = m_pSet->m_sex;m_edit_age.Format("%d", m_pSet ->m_age);m_edit_id = m_pSet ->m_id;m_edit_profession = m_pSet ->m_profession;m_edit_address = m_pSet ->m_address;UpdateData(FALSE);}void CODBCDemoDlg::OnButtonNext()//查看下一小記錄{// TODO: Add your control notification handler code herem_pSet->MoveNext();if (m_pSet->IsEOF()){m_pSet->MoveLast();}m_edit_name = m_pSet ->m_name;m_edit_sex = m_pSet->m_sex;m_edit_age.Format("%d", m_pSet ->m_age);//int轉換為CStringm_edit_id = m_pSet ->m_id;m_edit_profession = m_pSet ->m_profession;m_edit_address = m_pSet ->m_address;UpdateData(FALSE);}void CODBCDemoDlg::OnButtonLast()//查看最後一條記錄{// TODO: Add your control notification handler code herem_pSet->MoveLast();m_edit_name = m_pSet ->m_name;m_edit_sex = m_pSet->m_sex;m_edit_age.Format("%d", m_pSet ->m_age);m_edit_id = m_pSet ->m_id;m_edit_profession = m_pSet ->m_profession;m_edit_address = m_pSet ->m_address;UpdateData(FALSE);}

至此,我們的Demo便編寫完成。具體的執行個體代碼可以在一下地址進行下載:

http://download.csdn.net/detail/jhg1204/5252298

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.