利用SQL Server 和MFC實現對數據庫的簡單管理
工具:SQL Server,VC6.0
步驟如下:
1.建立一個數據庫studentinfo,再建立一個表testtable,表設計和初始值如下(僅僅是舉個例子,后面操作都是基於此表的):
2.建立ODBC數據源
步驟如下:
1.進入計算機管理工具中的ODBC數據源
2.選擇添加用戶DSN
選擇SQL Server Driver驅動,前提是已安裝SQL Server Managemant Studio等相關組件工具
然后填寫數據源名稱和服務器(localhost表示本機服務器)
然后一直點擊下一步直到完成,此時可以看到用戶DSN中已經有了剛剛添加的數據源
3.現在打開VC6.0,新建一個對話框工程(命名為ODBC)
在默認對話框中添加控件如下:
注意:列表視圖控件設置屬性為報表類型Report,如下:
各控件綁定變量如下:
在CODBCDlg類的OnInitDialog()中添加如下代碼
m_listctrl.SetExtendedStyle(LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT);
//設置列表視圖控件為網格狀風格,且為全選狀態(鼠標點擊某一行表現為全選狀態)
m_listctrl.InsertColumn(0,"ID",LVCFMT_LEFT,110);//參數分別為字段索引,字段名,對齊方式,像素(每個字段寬度)
m_listctrl.InsertColumn(1,"姓名",LVCFMT_LEFT,100);
m_listctrl.InsertColumn(2,"性別",LVCFMT_LEFT,120);
m_listctrl.InsertColumn(3,"總分",LVCFMT_LEFT,100);
CString SQL="SELECT * FROM testtable"; //可以通過更改表名達到列出同一數據源中不同表的目的
ListStuInfo(SQL); //列出指定表中所有信息
SetTimer(1,1,NULL);//計時器
return TRUE;
然后在新建ODBC記錄集類CInfoSet,其基類為CRecordSet
建立方式為點擊菜單中的插入,選擇新建類
按照如上圖設置后點擊OK,彈出對話框如下:
ODBC下拉選擇剛才的數據源名稱DSN為stuinfo,點擊OK,然后會彈出一個選擇數據表的對話框,選擇testtable即可
此時在類視圖中可以看見數據庫的testtable表中的列名對應的成員變量m_id,m_score,m_name,m_sex
然后添加CODBCDlg 類的成員函數ListStuInfo(CString strSQL),用於在初始化對話框時在列表控件中顯示學生信息
注意要在ODBCDlg.cpp文件中添加InfoSet.h頭文件
void CODBCDlg::ListStuInfo(CString strSQL)
{
m_listctrl.DeleteAllItems(); //首先刪除所有項目
CInfoSet Infoset; //創建一個記錄集對象
if(!Infoset.Open(CRecordset::dynaset,strSQL,CRecordset::readOnly))//連接數據源並執行給定的SQL語句
{
MessageBox("連接數據源失敗!","警告",MB_ICONASTERISK|MB_OK);
return;
}
CString strTemp;
int i = 0;
while(!Infoset.IsEOF())
{
m_listctrl.InsertItem(i,Infoset.m_id);
m_listctrl.SetItemText(i,1,Infoset.m_name);
m_listctrl.SetItemText(i,2,Infoset.m_sex);
strTemp.Format("%d",Infoset.m_score); //將long int轉為CString
m_listctrl.SetItemText(i,3,strTemp);
Infoset.MoveNext();
i++;
}
Infoset.Close(); //關閉記錄集
UpdateData(FALSE); //將控件變量值傳給對應控件顯示
}
至此編譯運行會出現錯誤,原因是沒有在stdafx.h頭文件添加afxdb.h頭文件,因為使用了記錄集類
然后再編譯運行即可,效果如下:
此時"添加","刪除","修改"按鈕沒有反應,因為還沒有為他們添加消息函數
下面開始構建添加,刪除,修改模塊
添加一個"添加學生信息"對話框資源,如下:
控件綁定變量如下:
雙擊該對話框的確定按鈕為其添加消息函數代碼(CStuInfoDlg 即為添加學生信息對話框對應的類)
void CStuInfoDlg::OnOK()
{
// TODO: Add extra validation here
UpdateData(TRUE);//將控件值傳給控件變量
MessageBox("添加成功!","提示");
CDialog::OnOK();
}
在主對話框(CODBCDlg)添加成員變量如下:
雙擊主對話框添加按鈕為其添加消息響應函數如下:
{
// TODO: Add your control notification handler code here
CStuInfoDlg dlg;
if(dlg.DoModal()!=IDOK)//如果用戶沒有點擊添加對話框的確定按鈕則直接返回,函數結束
{
return;
}
m_newID = dlg.m_addID;
m_newname = dlg.m_addname;
m_newsex = dlg.m_addsex;
m_newscore = dlg.m_addscore;
if(!db.Open("stuinfo"))//直接連接數據源stuinfo
{
MessageBox("連接數據源stuinfo失敗!","警告",MB_ICONASTERISK|MB_OK);
return;
}
CString strSQL;
strSQL.Format("insert into testtable values('%s','%s','%s','%s')",m_newID,m_newname,m_newsex,m_newscore);//編寫SQL插入語句
db.ExecuteSQL(strSQL);//執行SQL語句
db.Close();//斷開與數據源的連接
ListStuInfo("select * from testtable");//列出表中信息
}
添加后列表視圖如下:
接着完成修改模塊
任然要新建對話框“修改學生信息"
其他操作跟添加差不多

添加相關代碼:
{
// TODO: Add your control notification handler code here
int n = m_listctrl.GetSelectionMark();//獲得視圖列表選擇項目的索引
if(n == -1) //為-1表示沒有選中任何項
return;
m_newID = m_listctrl.GetItemText(n,0);
m_newname = m_listctrl.GetItemText(n,1);
m_newsex = m_listctrl.GetItemText(n,2);
m_newscore = m_listctrl.GetItemText(n,3);
dlg.m_ID = m_newID;
dlg.m_name = m_newname;
dlg.m_sex = m_newsex;
dlg.m_score = m_newscore;
//UpdateData(FALSE);//在修改對話框顯示所選中學生信息
return;
UpdateData(TRUE);
m_newID = dlg.m_ID;
m_newname = dlg.m_name;
m_newsex = dlg.m_sex;
m_newscore = dlg.m_score;
if(!db.Open("stuinfo"))//直接連接數據源stuinfo
{
MessageBox("連接數據源stuinfo失敗!","警告",MB_ICONASTERISK|MB_OK);
return;
}
CString strSQL = "",strTemp;
strTemp.Format("update testtable set id='%s',name='%s',sex='%s',score='%s' where name='%s' ",m_newID,m_newname,m_newsex,m_newscore,strOldName);
strSQL+=strTemp;
db.ExecuteSQL(strSQL);
MessageBox("修改成功!","提示");
db.Close();
ListStuInfo("select * from testtable");
}
運行效果如下:(注意:點擊修改按鈕前先選擇列表控件中的要修改項)
修改后:
最后是刪除模塊,不需要建立對話框,只需在CODBCDlg添加如下成員函數:
{
// TODO: Add your control notification handler code here
int n = m_listctrl.GetSelectionMark();
if(n == -1)//沒有選中任何項目
{
MessageBox("請選中一個項目再點擊刪除!","提示");
return;
}
m_newname = m_listctrl.GetItemText(n,1);//獲取選中項的主鍵信息name
CDatabase db;
if(!db.Open("stuinfo"))
{
MessageBox("連接數據源stuinfo失敗!","警告",MB_ICONASTERISK|MB_OK);
return;
}
CString strSQL;
strSQL.Format("delete from testtable where name='%s'",m_newname);
db.ExecuteSQL(strSQL);
MessageBox("刪除成功!","提示");
db.Close();
ListStuInfo("select * from testtable");
}

刪除后:
為了在主對話框實時獲得當前表中記錄數,還要添加計時器函數OnTimer(),利用MFC ClassWizard建立該函數,鼠標右鍵選擇MFC ClassWizard
{
// TODO: Add your message handler code here and/or call default
int count = m_listctrl.GetItemCount();//獲取項目數量
m_count = count;
UpdateData(FALSE);
CDialog::OnTimer(nIDEvent);
}
若您覺得對您有幫助,不妨點個贊👍唄!
提取碼:hfip