MFC+ODBC+SQL Server+Visual C++


利用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)添加成員變量如下:

雙擊主對話框添加按鈕為其添加消息響應函數如下:

void CODBCDlg::OnAdd()
{
 // 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;
    CDatabase db;//創建數據庫類對象
    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");//列出表中信息
}
運行效果如下:

添加后列表視圖如下:

接着完成修改模塊

任然要新建對話框“修改學生信息"

其他操作跟添加差不多

不要忘記添加控件和綁定變量

 

添加相關代碼:

void CODBCDlg::OnModify()
{
 // 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);
    CModifyDlg dlg;
 dlg.m_ID = m_newID;
 dlg.m_name = m_newname;
 dlg.m_sex = m_newsex;
 dlg.m_score = m_newscore;
 //UpdateData(FALSE);//在修改對話框顯示所選中學生信息
 if(dlg.DoModal()!=IDOK)
  return;
 CString strOldName = m_newname;//保存主鍵數據
 UpdateData(TRUE);
    m_newID = dlg.m_ID;
 m_newname = dlg.m_name;
 m_newsex = dlg.m_sex;
 m_newscore = dlg.m_score;
 CDatabase db;//創建數據庫類對象
    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添加如下成員函數:

void CODBCDlg::OnDelete()
{
 // 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

void CODBCDlg::OnTimer(UINT nIDEvent)
{
 // TODO: Add your message handler code here and/or call default
 int count = m_listctrl.GetItemCount();//獲取項目數量
 m_count = count;
 UpdateData(FALSE);
 CDialog::OnTimer(nIDEvent);
}

 

若您覺得對您有幫助,不妨點個贊👍唄!

該工程文件百度網盤地址:鏈接:https://pan.baidu.com/s/1r_VqSbEdLO7hnByCm0UOQw
提取碼:hfip


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM