MFC基礎知識總結(2)

 4.數據庫
  
  ODBC動態添加數據庫:Lhwy工程
  
  CDatabase類
  public:
   CDatabase m_DB;
  extern CLhwyApp theApp;
  
  #include <odbcinst.h>
  //由於 VC的缺省庫文件中不包含 SQLConfigDataSource()函數,因此使用該函數之前需要將 odbcinst.h文件包含在工程的頭文件中
  
  BOOL CLhwyApp::InitInstance()
  {
   //在VC中動態加載ODBC的方法
   if (!AfxSocketInit())
   {
   AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
   return FALSE;
   }
  
   CString sPath;//數據庫存放路徑
   GetModuleFileName(NULL,sPath.GetBufferSetLength(MAX_PATH+1),MAX_PATH);
   sPath.ReleaseBuffer ();
   int nPos;
   nPos=sPath.ReverseFind ('//');
   sPath=sPath.Left (nPos);
   nPos=sPath.ReverseFind('//');
   sPath=sPath.Left (nPos);
   CString lpszFile = sPath + "//lhwy.mdb";
  
  
   char* szDesc;
   int mlen;
   szDesc=new char[256];
    sprintf(szDesc,"DSN=%s? DESCRIPTION=TOC support source? DBQ=%s? FIL=MicrosoftAccess? DEFAULTDIR=%s?? ","lhwy",lpszFile,sPath);
  
  
  
   mlen = strlen(szDesc);
   for (int i=0; i<mlen; i++)
   {
   if (szDesc[i] == '?')
   szDesc[i] = '/0';
   }
  //Windows系統子目錄中的動態鏈接庫 Odbcinst.dll提供了一個可以動態地增加、修改和刪除數據源的函數 SQLConfigDataSource()。
  //
   if (FALSE == SQLConfigDataSource(NULL,ODBC_ADD_DSN,"Microsoft Access Driver (*.mdb)/0",(LPCSTR)szDesc))
   AfxMessageBox("SQLConfigDataSource Failed");
  
  
   try
   {
   CString strConnect;
   strConnect.Format("DSN=lhwy;");//指定odbc連接的字符串:數據源的名稱和其他//一些選項信息
   if(!m_DB.OpenEx(strConnect,CDatabase::useCursorLib))//裝載ODBC光標庫DLL,如果想直接從Crecordset類得到對象而不是派生得到,就不應該裝載光標庫/
  //要使程序與數據源建立聯繫,需用CDateBase::OpenEx()或CDatabase::Open()函數來進行初始化。數據庫對象必須在使用它構造記錄集對象之前初始化。
   {
   AfxMessageBox("Unable to Connect to the Specified Data Source");
   return FALSE ;
   }
   }
   catch(CDBException *pE)
   {
   pE->ReportError();
   pE->Delete();
   return FALSE;
   }
  
   AfxEnableControlContainer();
   //SetDialogBkColor(RGB(140,130,210),RGB(255,0,0));
   SetDialogBkColor (RGB (140, 180, 220), RGB ( 255 ,0 , 0 ) );//背景色
  連接數據表
  CDRecordset m_Set(&theApp.m_DB);// &theApp.m_DB爲CDatabase類型
  CBRecordset m_bSet(&theApp.m_DB);
  CTRecordset m_tSet(&theApp.m_DB);
  CRecordset類
  數據成員
  m_nFields:記錄集中的字段數目,類型爲UINT.
  m_strFilter:CString對象,包含一個SOL的WHERE字句,作爲過濾器對那些滿足一定條件的記錄進行選擇。
  m_strSort: CString對象,包含一個SOL的ORDER BY字句,用於控制記錄排序的方式。
  GetODBCFieldInfo------返回記錄集中字段的特定種類的信息。
  記錄導向操作
  MoveFirst------設置記錄集的當前記錄爲第一個記錄,此前應調用IsBOF測 試。
  記錄更新操作
  Edit-------準備對當前記錄的更改,編輯,調用Update()完成編輯。
  AddNew----準備增加一個新記錄,調用Update()完成。
  Delete------從記錄中刪除當前記錄,在刪除之後必須滾動到下一個記錄。
  操作應用:
  打開數據表m_Set.Open(AFX_DB_USE_DEFAULT_TYPE,"[NO2STUDENT]");// [NO2STUDENT爲數據表名

用ADO連接數據庫
  ADO庫包含三個基本接口:_ConnectionPtr接口、_CommandPtr接口和_RecordsetPtr接口。
  庫包含三個基本接口:_ConnectionPtr接口、_CommandPtr接口和_RecordsetPtr接口。
   _ConnectionPtr接口返回一個記錄集或一個空指針。通常使用它來創建一個數據連接或執行一條不返回任何結果的SQL語句,如一個存儲過程。 使用_ConnectionPtr接口返回一個記錄集不是一個好的使用方法。通常同CDatabase一樣,使用它創建一個數據連接,然後使用其它對象執 行數據輸入輸出操作。
  _CommandPtr接口返回一個記錄集。它提供了一種簡單的方法來執行返回記錄集的存儲過程和SQL語句。在使用 _CommandPtr接口時,你可以利用全局_ConnectionPtr接口,也可以在_CommandPtr接口裏直接使用連接串。如果你只執行一 次或幾次數據訪問操作,後者是比較好的選擇。但如果你要頻繁訪問數據庫,並要返回很多記錄集,那麼,你應該使用全局_ConnectionPtr接口創建 一個數據連接,然後使用_CommandPtr接口執行存儲過程和SQL語句。
  _RecordsetPtr是一個記錄集對象。與以上兩種對象 相比,它對記錄集提供了更多的控制功能,如記錄鎖定,遊標控制等。同_CommandPtr接口一樣,它不一定要使用一個已經創建的數據連接,可以用一個 連接串代替連接指針賦給_RecordsetPtr的connection成員變量,讓它自己創建數據連接。如果你要使用多個記錄集,最好的方法是同 Command對象一樣使用已經創建了數據連接的全局_ConnectionPtr接口,然後使用_RecordsetPtr執行存儲過程和SQL語句。
  程序中通過_variant_t和_bstr_t轉換COM對象和C++類型的數據, _variant_t類封裝了OLE自治VARIANT數據類型。在C++中使用_variant_t類要比直接使用VARIANT數據類型容易得多。
  在stdafx.h 文件中添加:
  #include 〈comdef.h〉//頭文件comdef.h使我們的應用程序能夠使用Visual C++中的一些特殊COM支持類,這些類使得處//理OLE自治更爲容易一些,OLE自治是ADO使用的數據類型。
  #import "msado15.dll" no_namespace rename("EOF","adoEOF")
  //#import "c:/program files/common files/system/ado/msado15.dll" no_namespace rename("EOF","adoEOF")
  
  #if !defined CATCH_ERROR
  #define CATCH_ERROR /
   { /
   CString strComError; /
   strComError.Format("錯誤編號: %08lx/n錯誤信息: %s/n錯誤源: %s/n錯誤描述: %s", /
   e.Error(), /
   e.ErrorMessage(), /
   (LPCSTR) e.Source(), /
   (LPCSTR) e.Description()); /
   ::MessageBox(NULL,strComError,"錯誤",MB_ICONEXCLAMATION); /
   }
  #endif
  
  連接數據庫:
   打開一個庫連接。先創建一個實例指針,再用Open打開一個庫連接,它將返回一個IUnknown的自動化接口指針。
   _ConnectionPtr m_pConnection;//public
  
   BOOL CCcApp::InitInstance()
   {
   AfxOleInit();//初始化COM庫
  AfxEnableControlContainer();//系統生成
  // 在ADO操作中建議語句中要常用try...catch()來捕獲錯誤信息,
  // 因爲它有時會經常出現一些意想不到的錯誤。
   try
   {
  
   m_pConnection.CreateInstance("ADODB.Connection");///創建Connection對象
  //m_pConnection.CreateInstance(__uuidof(Connection));
   m_pConnection->ConnectionTimeout=3;///設置超時時間爲3秒
  
   m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data
   Source=data.mdb;","","",adModeUnknown);//Data是數據類型
   }
   catch(_com_error e)///捕捉異常
   {
   CATCH_ERROR;
   return false;
   }
  、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
  、、、、、、、、、、、、、、、、、、、、、、、
  關閉一個庫連接 如果連接狀態有效,則用Close方法關閉它並賦於它空值。代碼如下所示:
  
   if(m_pConnection->State)
   m_pConnection->Close();
   m_pConnection= NULL;
  _RecordsetPtr智能指針,可以用來打開庫內數據表,並可以對錶內的記錄、字段等進行各種操作。
  _RecordsetPtr m_pRecordset;
   m_pRecordset.CreateInstance("ADODB.Recordset"); //查詢數據庫,看是否有此用戶和密碼 m_pRecordset->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);
  /* m_pRecordset->Open("SELECT * FROM DemoTable", //
   查詢DemoTable表中所有字段
   theApp.m_pConnection.GetInterfacePtr(), //
   獲取庫接庫的IDispatch指針
   adOpenDynamic,
   adLockOptimistic,
   adCmdText);
   } */
  具體操作:
   附加
   #define CATCH_ERROR /
   catch (_com_error e) /
   { /
   CString strComError; /
   strComError.Format("錯誤編號: %08lx/r/n/r/n錯誤信息: %s/r/n/r/n錯誤源: %s/r/n/r/n錯誤描述: %s", /
   e.Error(), /
   e.ErrorMessage(), /
   (LPCSTR) e.Source(), /
   (LPCSTR) e.Description()); /
   SetDlgItemText(IDC_MESSAGE,strComError); /
   }
  #define SET_TEXT SetDlgItemText(IDC_MESSAGE,"!/r/n/r/n/r/n/r/n/t/t操作成功完成!");
  讀取表內數據
    將表內數據全部讀出並顯示在列表框內,m_AccessList爲列表框的成員變量名。如果沒有遇到表結束標誌adoEOF,則用 GetCollect(字段名)或m_pRecordset->Fields->GetItem(字段名)->Value方法,來獲取 當前記錄指針所指的字段值,然後再用MoveNext()方法移動到下一條記錄位置。
  插入記錄
   可以先用AddNew()方法新增一個空記錄,再用PutCollect(字段名,值)輸入每個字段的值,最後再Update()更新到庫中數據既可。其中變量m_Name和m_Age分別爲姓名及年齡編輯框的成員變量名。
  _variant_t RecordsAffected;
   theApp.m_strSQL="INSERT INTO Records (Name,YorN,College,date1,date2,Reason,Remark,Flag) values('"+m_strName+"','"+YorN+"','"+m_strCollege+"','"+m_date1+"','"+m_date2+"','"+m_strReason+"','"+m_strRemark+"','"+strNowTime+"')";
   theApp.m_pConnection->Execute((_bstr_t)theApp.m_strSQL,&RecordsAffected,adCmdText);
  移動記錄指針
    移動記錄指針可以通過MoveFirst()方法移動到第一條記錄、MoveLast()方法移動到最後一條記錄、MovePrevious()方法移動 到當前記錄的前一條記錄、MoveNext()方法移動到當前記錄的下一條記錄。但我們有時經常需要隨意移動記錄指針到任意記錄位置時,可以使用 Move(記錄號)方法來實現,注意:
   Move()方法是相對於當前記錄來移動指針位置的,正值向後移動、負值向前移動,如:Move(3),當前記錄是3時,它將從記錄3開始往後再移動3條記錄位置。
  改記錄中字段值
   可以將記錄指針移動到要修改記錄的位置處,直接用PutCollect(字段名,值)將新值寫入並Update()更新數據庫既可。
  theApp.m_strSQL="update Records set Name='"+m_strName+
   "',YorN='"+YorN+
   "',College='"+m_strCollege+
   "',Reason='"+m_strReason+
   "',date1='"+m_date1+
   "',date2='"+m_date2+
   "',Remark='"+m_strRemark+
   "' where Flag='"+m_strFlag+"'";
  
   _variant_t RecordsAffected;
   theApp.m_pConnection->Execute((_bstr_t)theApp.m_strSQL,&RecordsAffected,adCmdText);
  刪除記錄
   刪除記錄和上面修改記錄的操作類似,先將記錄指針移動到要修改記錄的位置,直接用Delete()方法刪除它並用Update()來更新數據庫既可。
  登陸窗口連接數據庫
   BOOL LogonDlg::OnInitDialog() //初始化登陸窗口
  {
   CDialog::OnInitDialog();
  
   // TODO: Add extra initialization here
   try
   {
   m_pRecordset.CreateInstance("ADODB.Recordset");//創建對象
    m_pRecordset->Open((_variant_t)"SELECT * FROM Admin",_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);
  
   if(!m_pRecordset->adoEOF)
   {
   theApp.g_Admin=((LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("AdminName"));
   SetDlgItemText(IDC_Use,theApp.g_Admin);
   }
   m_pRecordset->Close();
   }
  
   catch (_com_error e)
   {
   CATCH_ERROR;
   return false;
   }
   return TRUE; // return TRUE unless you set the focus to a control
   // EXCEPTION: OCX Property Pages should return FALSE
  }
  void LogonDlg::OnOK() //當點擊確定按鈕時,所作的操作,成功彈出主界面
  {
   // TODO: Add extra validation here
  UpdateData();
   if(m_Use.IsEmpty() || m_Pass.IsEmpty())
   {
   AfxMessageBox("請輸入用戶名和密碼!");
   }
   else
   {
   CString sql="SELECT * FROM Admin where AdminName='"+theApp.g_Admin+"' and pwd='"+m_Pass+"'";
   try
   { //創建Recordset對象的實例
   m_pRecordset.CreateInstance("ADODB.Recordset"); //查詢數據庫,看是否有此用戶和密碼
    m_pRecordset->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);
  
   if(m_pRecordset->adoEOF) //如果沒有此用戶和密碼
   {
   MessageBox("請輸入正確的用戶名和密碼!","錯誤",MB_ICONASTERISK );
   SetDlgItemText(IDC_Use,"");
   GetDlgItem(IDC_Use)->SetFocus();
   }
   else
   {
   theApp.g_Admin=m_Use;
   theApp.g_Pass=m_Pass;
   CDialog::OnOK();
   }
   }
   catch (_com_error e)
   {
   CATCH_ERROR;
   return;
   }
   }
  
  // CDialog::OnOK();
  }
  void LogonDlg::OnCancel() //
  {
   // TODO: Add extra cleanup here
  //((CCcDlg*)AfxGetMainWnd()):取得主界面的指針
   ((CCcDlg*)AfxGetMainWnd())->EndDialog(IDOK);//當點擊取消按鈕時不彈出主界面
   CDialog::OnCancel();
  }
  顯示所查內容
  extern CCcApp theApp;
  void CCcDlg::List(CString sql) //將SQL語句查詢的結果顯示在列表框中
  {
   m_list.DeleteAllItems();
  
   int nItem=0;
   try
   {
   m_pRecordset.CreateInstance("ADODB.Recordset");
    m_pRecordset->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);
   if(!m_pRecordset->adoEOF) //如果記錄不爲空
   {
   while(!m_pRecordset->adoEOF)
   {
   if(strcmp((LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("YorN"),"Y")==0) //是否批准
   nItem=m_list.InsertItem(0xffff,"Y",0);//0代表正確的圖標 0xffff可用數字代替
   else
   nItem=m_list.InsertItem(0xffff,"N",1);//1代表錯誤的圖標
   m_list.SetItemText(nItem,1,(LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("Name"));
   m_list.SetItemText(nItem,2,(LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("College"));
   m_list.SetItemText(nItem,3,(LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("Reason"));
   m_list.SetItemText(nItem,4,(LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("date1"));
   m_list.SetItemText(nItem,5,(LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("date2"));
   m_list.SetItemText(nItem,6,(LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("Remark"));
   m_pRecordset->MoveNext();
   }
   }
   m_pRecordset->Close();
   }
   catch (_com_error e)
   {
   CATCH_ERROR;
   return;
   }
  
  
   CString strTitle;
   strTitle.Format("學生請假管理系統 共有%d條記錄",nItem+1);
   SetWindowText(strTitle);
  }
  
  刪除一條記錄
  
  void CCcDlg::OnButtonDel() //刪除一條記錄
  {
   try
   {
   POSITION pos = m_list.GetFirstSelectedItemPosition();
   if(pos) //如果選中一行,則生成動態的sql語句
   {
   if(MessageBox("你確定要刪除此記錄嗎?","警告",MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2)==IDYES)
   {
   int nItem = m_list.GetNextSelectedItem(pos);
   theApp.m_strSQL="DELETE FROM Records WHERE name='"
   +m_list.GetItemText(nItem,1)+"' and College='"
   +m_list.GetItemText(nItem,2)+"' and Reason='"
   +m_list.GetItemText(nItem,3)+"' and date1='"
   +m_list.GetItemText(nItem,4)+"' and date2='"
   +m_list.GetItemText(nItem,5)+"' and Remark='"
   +m_list.GetItemText(nItem,6)+"'";
   _variant_t RecordsAffected;
  
   theApp.m_pConnection->Execute((_bstr_t)theApp.m_strSQL,&RecordsAffected,adCmdText); //執行此sql語句
   List("SELECT * FROM Records");
   }
   }
   else
   AfxMessageBox("請選擇一行數據!");
   }
   catch(_com_error e)
   {
   CATCH_ERROR;
   }
  }
  1. 建表
   void CADlg::OnCreatetTable()
  {
   try
   {
   m_pConnection->Execute("CREATE TABLE new(ID INTEGER,username TEXT,old INTEGER)",NULL,adCmdText);
   SET_TEXT;
   }
   CATCH_ERROR;
  }
  2. 刪除數據表
   void CADlg::OnDropTable()
  {
   try
   {
   m_pConnection->Execute("DROP TABLE new",NULL,adCmdText);
   SET_TEXT;
   }
   CATCH_ERROR;
  }
  void CADlg::OnAddItem()
  {
   try
   {
   m_pConnection->Execute("ALTER TABLE new ADD newcolumn1 INTEGER",NULL,adCmdText);
   SET_TEXT;
   }
   CATCH_ERROR;
  }
  
  void CADlg::OnDelItem()
  {
   try
   {
   m_pConnection->Execute("ALTER TABLE new ADD newcolumn1 INTEGER", NULL,adCmdText);
   SET_TEXT;
   }
   CATCH_ERROR;
  
  }
  
  void CADlg::OnAddRecords()
  {
   try
   {
   for(int i = 1;i < 10; i ++)
   {
   CString strSQL;
   strSQL.Format("INSERT INTO new(ID,username,old) VALUES (%d, '程紅秀',%d)",i,i*3);
   m_pConnection->Execute((_bstr_t)strSQL,NULL,adCmdText);
  
   SET_TEXT;
   }
   }
   CATCH_ERROR;
  }
  
  void CADlg::OnOldAdd1()
  {
   try
   {
   m_pConnection->Execute("UPDATE new SET old = old+1", NULL,adCmdText);
   SET_TEXT;
   }
   CATCH_ERROR;
  }
  
  void CADlg::OnSum()
  {
   try
   {
   _RecordsetPtr m_pRecordset;
   _variant_t RecordsAffected;
  
   m_pRecordset =m_pConnection->Execute("SELECT COUNT(*) FROM new where ID > 0",&RecordsAffected,adCmdText);
  
   _variant_t vCount = m_pRecordset->GetCollect((_variant_t)(long)0); //取得第一個字段的值放入vCount變量
  
  
   CString str;
   str.Format("!/r/n/r/n/r/n/t/t/t共有%d條記錄",vCount.lVal);
   SetDlgItemText(IDC_MESSAGE,str);
  
   m_pRecordset->Close();
   }
   CATCH_ERROR;
  
  }
  
  void CADlg::OnSetIdIndex()
  {
   try
   {
   m_pConnection->Execute("CREATE UNIQUE INDEX id ON new(ID)",NULL,adCmdText);
   SET_TEXT;
   }
   CATCH_ERROR;
  
  }
  
  void CADlg::OnOldSum()
  {
   try
   {
   _RecordsetPtr m_pRecordset;
   _variant_t RecordsAffected;
   m_pRecordset =m_pConnection->Execute("select MAX(old) from new",&RecordsAffected,adCmdText);
  
   _variant_t vCount = m_pRecordset->GetCollect((_variant_t)(long)0);
  
  
   m_pRecordset->Close();
   m_pRecordset.Release();
  
   CString Message;
   Message.Format("!/r/n/r/n/r/n/t/t/t最大值是%d",vCount.lVal);
   SetDlgItemText(IDC_MESSAGE,Message);
   }
   CATCH_ERROR;
  }
  
  void CADlg::OnOldSum2()
  {
   try
   {
   _RecordsetPtr m_pRecordset;
   _variant_t RecordsAffected;
  
   m_pRecordset =m_pConnection->Execute("select SUM(old) from new",&RecordsAffected,adCmdText);
   _variant_t vIndex = (long)0;
   _variant_t vCount = m_pRecordset->GetCollect(vIndex);
  
  
   m_pRecordset->Close();
   m_pRecordset.Release();
   CString Message;
   Message.Format("!/r/n/r/n/r/n/t/t/t總和是%d",(long)vCount);
   SetDlgItemText(IDC_MESSAGE,Message);
   }
   CATCH_ERROR;
  }
  
  
  void CADlg::OnOldAverage()
  {
  
   try
   {
   _RecordsetPtr m_pRecordset;
   _variant_t RecordsAffected;
   m_pRecordset =m_pConnection->Execute("select AVG(old) from new",&RecordsAffected,adCmdText);
   _variant_t vIndex = (long)0;
   _variant_t vCount = m_pRecordset->GetCollect(vIndex);
  
  
   m_pRecordset->Close();
   m_pRecordset.Release();
   CString Message;
   Message.Format("!/r/n/r/n/r/n/t/t/t平均值是%d",(long)vCount);
   SetDlgItemText(IDC_MESSAGE,Message);
  
   }
   CATCH_ERROR;
  }
  ////////////////////////////////////////////////////
  //////////////////////////////////////////////////////////////////////////////
  DAO訪問ACCESS數據庫
  CDaoRecordSet類
  類成員:
  數據成員:m_nFields(),m_strFilter(),m_strSort()
   m_pSet->m_strFilter=filter;
   m_pSet->Requery();
  . 屬性成員函數:CanUpdate()
  。記錄操作函數: AddNew()
  動態連接數據庫:
  #include <afxdao.h>
  private:
   CString m_DataSource;
   //動態連接數據庫
   char path[ MAX_PATH ] = { '/0' };
   GetCurrentDirectory( MAX_PATH, path );
   m_DataSource.Format( "%s", path );
   m_DataSource += "//MagicWord.mdb";//數據庫名
  CString CWordDaoSet::GetDefaultDBName()
  {
   return _T( m_DataSource );//數據源的路徑 m_DataSource不加引號
  }
  //實例化
   m_pSet = new CWordDaoSet();
  在視圖文檔中,採用:在PppView.cpp文件的OnInitialUpdate()函數中得到指向數據集的指針
  CFormView::OnInitialUpdate();
   CPppDoc* pDoc = (CPppDoc*)GetDocument(); //得到指向文檔類指針
   m_ShengSet=&pDoc->m_ShengSet;//得到數據庫指針
  /////////////////////////
  //PUBLIC函數 打開數據表進行操作
  void CMagicWordDlg::DisplayFirstRecord()
  {
   try
   {
   if ( m_pSet->IsOpen() )
   m_pSet->Close();
  
   m_pSet->Open();
   PublicAssign();//操作函數
   }
   catch( CDaoException *exception )
   {
   exception->ReportError();
   return;
   }
  }
  、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
   添加功能:執行添加、刪除、查找等操作。
   首先。寫SQL查詢語句
  其次。創建一個新的紀錄集對象
   功能操作
   關閉數據表
  
  添加新單詞
   // 實例化m_pSet
   m_pSet = new CWordDaoSet();
  
  void CMagicWordDlg::OnAddition() //添加函數
  {
   CWordInfoDlg WordInfoDlg; //添加對話框
   CWordDaoSet TempSet;//數據庫表
   CString strSQL;//SQL查詢
  
   // 如果點擊了取消按鈕,則不執行添加操作。
   if ( WordInfoDlg.DoModal() != IDOK )// 調用添加對話框
   return;
  
   // 查詢當前單詞是否已經被收錄於數據庫中
   if ( TempSet.IsOpen() )//關閉原有的記錄集
   TempSet.Close();
   //查詢功能,看添加的內容是否已經存在
   strSQL.Format( "SELECT * FROM WordList WHERE word = '%s'",
   WordInfoDlg.m_word.operator LPCTSTR() );
  //創建一個新的紀錄集對象
   TempSet.Open( AFX_DAO_USE_DEFAULT_TYPE, strSQL, 0 );
  
  
   if ( !TempSet.IsEOF() )
   {
   MessageBox( _T( "當前單詞紀錄已存在,沒有添加的必要!" ),
   _T( "已經存在!" ), MB_OK | MB_ICONASTERISK );
   return;
   }
  
   if ( TempSet.IsOpen() )
   TempSet.Close();
  
   // 執行添加操作
   try
   {
   m_pSet->AddNew();
   //添加內容
   m_pSet->m_Word = WordInfoDlg.m_word;
   m_pSet->m_Explain0 = WordInfoDlg.m_explain0;
   m_pSet->m_Explain1 = WordInfoDlg.m_explain1;
   m_pSet->m_Explain2 = WordInfoDlg.m_explain2;
   m_pSet->m_Phrase0 = WordInfoDlg.m_phrase0;
   m_pSet->m_Phrase1 = WordInfoDlg.m_phrase1;
   m_pSet->m_Phrase2 = WordInfoDlg.m_phrase2;
   m_pSet->m_Sentence0 = WordInfoDlg.m_sentence0;
   m_pSet->m_Sentence1 = WordInfoDlg.m_sentence1;
   //更新數據庫
   if ( m_pSet->CanUpdate() )
   {
   m_pSet->Update();
   MessageBox( _T( "添加新單詞完成!" ),
   _T( "添加成功!" ), MB_OK | MB_ICONASTERISK );
   }
   }
   catch( CDaoException *exception )//異常操作
   {
   exception->ReportError();
   // 否則指針會指向出現異常的紀錄
   m_pSet->MoveNext();
   m_pSet->MovePrev();
   return;
   }
  }
  直接通過DAO讀寫Access文件
  CDaoDatabase db; //數據庫
  CDaoRecordset RecSet(&db); //記錄集
  void CRWAccessDlg::OnWriteAccess() //創建數據庫,並向數據表中添加數據
  {
   //獲取主程序所在路徑,存在sPath中
   CString sPath;
   GetModuleFileName(NULL,sPath.GetBufferSetLength (MAX_PATH+1),MAX_PATH);
   sPath.ReleaseBuffer ();
   int nPos;
   nPos=sPath.ReverseFind ('//');
   sPath=sPath.Left (nPos);
  
   //默認創建數據名:Demo.mdb,內部表名:DemoTable,表內有二個字段:姓名、年齡
   CString lpszFile = sPath + "//Demo.mdb";
  
   CFileFind fFind;//查找文件
   BOOL bSuccess;
   bSuccess=fFind.FindFile(lpszFile);
  
   fFind.Close ();
   //是否已有創建好的Demo.mdb文件,沒有則創建它
   if(!bSuccess)
   {
   db.Create(lpszFile);//創建數據庫
  
   CString SqlCmd = "CREATE TABLE DemoTable(Name VARCHAR(20),Age VARCHAR(3));";
   db.Execute(SqlCmd);//創建數據表
  
   //打開已創建的數據表
   RecSet.Open(AFX_DAO_USE_DEFAULT_TYPE,
   "SELECT * FROM DemoTable", 0);
   //加入第一個記錄,用SQL語句
   db.Execute("INSERT INTO DemoTable (Name,Age) VALUES ('徐景周',26)");
  
   //加入第二個記錄,用DAO涵數
   RecSet.AddNew();
   RecSet.SetFieldValue("Name","徐志慧");
   RecSet.SetFieldValue("Age","21");
   RecSet.Update();
  
   //加入第三個記錄,用DAO涵數
   RecSet.AddNew();
   RecSet.SetFieldValue("Name","郭徽");
   RecSet.SetFieldValue("Age","27");
   RecSet.Update();
  
   //關閉記錄集及庫
   RecSet.Close();
   db.Close();
  
   AfxMessageBox("Access文件寫入成功!");
   }
   else
   AfxMessageBox("Demo.mdb數據庫已經創建!");
  
  }
  void CRWAccessDlg::OnReadAccess() //直接讀取數據庫
  {
   COleVariant var; // 字段類型
   var.ChangeType(VT_BSTR, NULL);
   CString strName,strAge,strFile;
  
   //清空列表框
   m_AccessList.ResetContent();
  
   //獲取主程序所在路徑,存在sPath中
   CString sPath;
   GetModuleFileName(NULL,sPath.GetBufferSetLength (MAX_PATH+1),MAX_PATH);
   sPath.ReleaseBuffer ();
   int nPos;
   nPos=sPath.ReverseFind ('//');
   sPath=sPath.Left (nPos);
  
   strFile = sPath + "//demo.mdb";
   db.Open(strFile); // 打開已創建的demo數據庫及DamoTable表
   RecSet.Open(AFX_DAO_USE_DEFAULT_TYPE,"SELECT * FROM DemoTable",NULL);
  
   while(!RecSet.IsEOF()) // 有沒有到表結尾
   {
   RecSet.GetFieldValue("Name",var);

    strName = (LPCSTR)var.pbstrVal;
   RecSet.GetFieldValue("Age",var);
   strAge = (LPCSTR)var.pbstrVal;
   m_AccessList.AddString( strName + " --> "+strAge );
  
   RecSet.MoveNext();
   }
  
   //關閉記錄集及庫
   RecSet.Close();
   db.Close();
  }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章