直接透過DAO讀、寫Access檔案 (轉)

worldblog發表於2007-12-12
直接透過DAO讀、寫Access檔案 (轉)[@more@] 

直接透過DAO讀、寫Access

作者:徐景周

 :namespace prefix = o ns = "urn:schemas--com::office" />

 

示例原始碼(?paper_id=383)

 

  直接利用DAO來建立、讀寫Access檔案,總的說來,對比上篇來講,要簡單一些。在下面的示例中,我們將用到兩種方法:和DAO類涵數來混合實現它們,這樣做的目地,我想可以使大家更加方便靈活的運用它們來完成你想要做的東西。在示例中預設指定建立名為:Demo.mdb,內部表名為:DemoTable,寫入兩個欄位:名字和年齡,採用和上一篇讀寫Excel類似的操作,你也可以根據自己需要來動態改變它們。示例程式執行介面如下所示:

 

下面讓我們來簡要看看它的實現步驟:

1.  首先,應確保包含進了afxdao.h標頭檔案,可以在StdAfx.h檔案中包含它,如下:

#include     //加入DAO資料庫支援

 

2.  宣告DAO庫及其記錄集變數,可在你的實現檔案中加入下面程式碼:

CDaoDatabase db;  //資料庫

CDaoRecordset RecSet(&db);  //記錄集

 

3.  接著,先讓我們來實現它的建立及寫入操作

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,

  " * 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資料庫已經建立!");

 

}

 

 

4.  最後,讓我們來實現它的讀取操作。

void CRWAccessDlg::OnReadAccess()

{

  COleVariant var;  // 欄位型別

  var.ChangeType(VT_BSTR, NULL);

  CString strName,strAge,strFile;

 

  //清空列表框

  m_Acceist.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 + " --&gt "+strAge );

 

  RecSet.MoveNext();

  }

 

  //關閉記錄集及庫

  RecSet.Close();

  db.Close();

}

 

 

以上部分程式碼的具體實現的細節問題,可在下載例項程式碼後,仔細檢視原始碼既可(內有詳細註釋)。

 

聯絡方式:

地址:陝西省西安市勞動路2號院六單元

郵編:710082

作者E:">jingzhou_xu@163.net

未來工作室(Future Studio)

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-992074/,如需轉載,請註明出處,否則將追究法律責任。

相關文章