2012-12-13 22:27 (分類:預設分類)
1.首先建立資料源,正常情況下載下傳控制台-管理工具-資料源,打開後有使用者DSN系統DSN
兩者差別在于系統級的DSN,就是對該系統的所有登入使用者可用,使用者DSN是隻對建立它的使用者可用
2.配置自己的DSN,比如連接配接ACCESS資料庫
單擊“添加”按鈕,顯示“建立新資料源”對話框。選擇“Microsoft Access Driver(*.mdb)”,
單擊<完成>,進入下一步。
随起個資料源名稱(如:MyData),再單擊“選擇(S)...”,選擇Access資料庫,确定,就OK了。
我這裡連接配接的是ACCESS 資料源名稱是 “登陸框“ 裡面隻有一個表 登入表 三個字段 ID 使用者名 密碼
特别說明,win7 64位的同學打開資料源,單擊“添加”按鈕後,是不是沒有驅動,去這裡
C:\Windows\SysWOW64\odbcad32.exe 32位資料源
這樣資料源就添加成功了
建立程式 這次通過vc6.0 建立MFC exe 程式
主要運用MFC封裝的 odbc類
選擇單文檔,要求包含資料庫(檢視資料庫使用檔案支援),在下方點選資料源,選擇剛才建立的資料源,
和相應的表,基本就這樣
做的是個登陸框首頁面驗證登陸,注冊按鈕蹦出個對話框為注冊頁面;
下邊是重點,弄了好幾天才明白,在單文檔首頁面如下

兩個編輯框添加成員變量為m_name,m_pwd;為登入按鈕添加消息相應函數 内容如下
UpdateData(TRUE);//重新整理控件的值到對應的變量
if(m_name==m_pSet->m_column1&&m_pwd==m_pSet->m_column2)
//與資料庫進行比對m_column1為資料庫 使用者名字段 m_column2為資料庫 密碼字段 MessageBox("OK");//成功彈出ok
else
MessageBox("ERROR");//失敗彈出error 這裡說一下m_pSet 這個是CRecordset類中的指針 第二個需求為點選注冊按鈕彈出注冊頁面,這裡我建立一個對話框 ,添加一個dialog,如下
為兩個編輯框設定成員變量為 m_name_zhuce 和 m_pwd_zhuce,
這個對話框要繼承哪個類呢? Crecordview?Crecordset?還是 CDialog?
1.第一種情況:為了能使用m_pSet 對話框繼承 Crecordview類或者Crecordset類,問題出來了在主視窗的注冊按鈕裡的代碼 正常為建立一個對話框叫SecondDialog,它的類名叫SecondDialog。
輕按兩下主對話框上的注冊按鈕進入代碼編輯區。
NO.1把SecondDialog.cpp的#include "SecondDialog.h" 加入到主對話框"類"中,
要在#include "stdafx.h"後
NO.2、在按鈕事件裡面寫下面兩句代碼CSecondDialog dlg; dlg.DoModal();
這樣就可以在點選 注冊按鈕後 彈出注冊對話框了
但是在Crecordview類或者Crecordset類 裡沒有DoModal()這個函數
是以按照上面的代碼,無法編譯通過
怎麼辦呢?是不是通過 其它方法呢?showWindows()這個函數是不是能把它顯示出來呢?
2.第二種情況:仍然繼承CDialog類,這樣可以使用CSecondDialog dlg;
dlg.DoModal();了
怎樣讓這個這個對話框連接配接資料庫呢?這裡就用上 MFC 封裝的odbc類了,
注意下邊的代碼了,每一個我都加注釋了,很累滴 UpdateData(TRUE); //更新控件資訊
CDatabase base1; // 建立CDatabase類 對象
//通過對象去連接配接資料庫
// 資料源名稱,獨占打開?隻讀打開?資料源資訊,加載ODBC光标動态連接配接庫 ? base1.Open(NULL,FALSE,FALSE,"ODBC;DSN=登陸框;UID=NULL;PWD=NULL",FALSE);
CRecordset object(&base1); //構造記錄集對象object(關聯記錄集)
//這裡要使用具體的類,我建的工程裡 是CStuSet object(&base1)CStuSet繼承CRecordset
//記錄集對象object 以動态方式打開student表所有字段,擷取資料庫資料
object.Open(CRecordset::dynaset,“Select * from students”);
//進行查詢操作 ,查詢剛才關聯的表
object.m_strFilter="name='admin'" //m_strFilter相當于where 查詢姓名為admin的資料
object.m_strSort="name" //m_strSort相當于order by 依據name 排序
object.Requery(); //重建立立記錄集
// void MoveNext( )前進一個記錄; void MovePrev( )後退一個記錄;
//void MoveFirst( )滾動到記錄集中的第一個記錄;
//void MoveLast( )滾動到記錄集中的最後一個記錄//進行添加操作
object.AddNew(); //在表尾進行添加操作
object.m_column1="admin"; //為字段1指派
object.m_column2="123"; //為字段2指派
object.Update(); //新紀錄存入資料庫
object.Requrey(); //重建立立記錄集 //進行删除操作
//調用Delete()成員函數能夠實作記錄删除,在調用Delete()函數後不需調用Update()函數,
object.Delete();
if (!object.IsEOF()) //判斷光标是否在記錄集最後
object.MoveNext(); //不是則向下移一位
else
object.MoveLast(); //是的化滾動到最後一個記錄//寫到這裡很累了,要下課了,明天繼續吧
很不幸,寫完未儲存,這是第二遍了 煩, 3.第三種情況
依舊使用CDialog類 來做注冊對話框,繼續使用資料源,不用代碼連接配接資料庫 CLoginView *p=new CLoginView; //這個CLoginView繼承CRecordView類,建立工程時建好
// 執行個體化類的對象 為指針 p
p->m_pSet = new CLoginSet;
p->m_pSet-> Open();
p->m_pSet->AddNew();
//對記錄集中的字段指派
p->m_pSet->m_column1 = "wocao";
p->m_pSet->m_column2 = "123";
//更新記錄集,将新記錄存入資料源
p->m_pSet->Update();
//重新整理記錄集,并使記錄集指針回到第一條記錄
p->m_pSet->Requery();在編譯時會報錯,基類中class CLoginSet : public CRecordset 就是這個類有一部分是私有的
沒法使用 ,我直接改成公有的,ok了 4.第四種情況
更絕對些,直接建立對話框mfc,不包含資料源,全部用代碼實作
對話框 确定按鈕 消息響應函數 如下 CDatabase base1; // 建立CDatabase類 對象
//通過對象去連接配接資料庫
// 資料源名稱,獨占打開?隻讀打開?資料源資訊,加載ODBC光标動态連接配接庫 ?
base1.Open(NULL,FALSE,FALSE,"ODBC;DSN=登陸框",FALSE);
CRecordset object(&base1); //構造記錄集對象object(關聯記錄集)
//我這裡使用的是CStuSet object(&base1); 是繼承CRecordset類
//記錄集對象object 以動态方式打開student表所有字段,擷取資料庫資料
object.Open(CRecordset::dynaset,"Select * from 登入表");
CString sql=" INSERT INTO 登入表(使用者名,密碼) VALUES('laji2','123')";
base1.ExecuteSQL( sql);這樣簡單多了吧,ExecuteSQL這個函數就是用來執行SQL代碼的,SQL語句不會就自己查吧,要注意的是 access 和 其它資料庫 文法可能有些小不同,自己注意吧,
一周了,odbc就到這裡吧