1. 程式人生 > >採用ADO+ACCESS進行資料庫操作

採用ADO+ACCESS進行資料庫操作

第一接觸資料庫是2年前在研究生院上課的時候,北京理工大學的一個老太太講的。不是太好!選課失敗!今天做的東西中有根資料庫相關的部分,於是便學了一下,最終決定採用ADO方式防衛ACCESS。 感謝W.C.Y, Z.W.J, W.S.F在這個過程中給與的指導和討論!

(1) 動態建立資料庫

bool createDatabase(std::string &databasefile,std::string &strcnn)
{

 //生成Database路徑
 strcnn="Provider=Microsoft.JET.OLEDB.4.0;Data source=";
    strcnn+=databasefile;
 
 //試圖建立該Database,如果該Database不存在的話,不進行建立
 CFileFind  fFind;
 BOOL bSuccess;
 bSuccess=fFind.FindFile(databasefile.c_str());
 if(bSuccess)
  return true;
 else
 {
  HRESULT hr = S_OK;
  try 
  {
   _CatalogPtr m_pCatalog = NULL;
   hr = m_pCatalog.CreateInstance(__uuidof (Catalog));
   if(FAILED(hr))
   {
    _com_issue_error(hr);
   }
   else
   {
    m_pCatalog->Create(_bstr_t((strcnn.c_str()))); //Create MDB
   }
   
  } 
  catch(_com_error &e) 
  {
   
   AfxMessageBox("建立資料庫檔案失敗!");
   return false;
  }

 }
 return true;
}

(2)準備工作

#import "D:\Program Files\Common Files\System\ADO\msado15.dll" \
              rename("EOF", "EndOfFile")
#import "msadox.dll" no_namespace

 ::CoInitialize(NULL);

  
  
 ::CoUninitialize(); 

(3)開啟資料庫

 ADODB::_ConnectionPtr m_pConnection;
 m_pConnection.CreateInstance(__uuidof(ADODB::Connection));
 try                
 { 
  // 開啟本地Access庫Demo.mdb
  m_pConnection->Open(strOpen.c_str(),
   "","",ADODB::adModeUnknown);
 }
 catch(_com_error e)
 {
  AfxMessageBox("資料庫連線失敗,確認資料庫是否存在!");
  return;
 }

(4)資料庫資訊新增

variant_t RecordsAffected;
 //執行SQL命令:CREATE TABLE建立表格
 m_pConnection->Execute("CREATE TABLE users(ID INTEGER,Histogram INTEGER)",&RecordsAffected,ADODB::adCmdText);
 //往表格裡面新增記錄
  //   unsigned int i=2;
   //  unsigned int val=2001;
    //  m_pConnection->Execute("INSERT INTO users(ID,Histogram)VALUES (1, 200)",&RecordsAffected,ADODB::adCmdText);
     //  m_pConnection->Execute("INSERT INTO users(ID,Histogram)VALUES (2, 2002)",&RecordsAffected,ADODB::adCmdText);

    //向資料庫中新增資料項
 ADODB::_RecordsetPtr m_pRecordset;
  m_pRecordset.CreateInstance (__uuidof (ADODB::Recordset));
  try
 {
  m_pRecordset->Open("SELECT * FROM users",                // 查詢DemoTable表中所有欄位
   m_pConnection.GetInterfacePtr(),  // 獲取庫接庫的IDispatch指標
   ADODB::adOpenDynamic,
   ADODB::adLockOptimistic,
   ADODB::adCmdText);
 }
 catch(_com_error *e)
 {
  AfxMessageBox(e->ErrorMessage());
  return;
 } 
  _variant_t var;
 for(int i=0; i<20; i++)
 {
    m_pRecordset->AddNew();
  var.intVal=i;
  var.vt=VT_INT;
  m_pRecordset->PutCollect("ID",var);
  var.intVal=i*i;
  m_pRecordset->PutCollect("Histogram",var);
  
 } 
 m_pRecordset->Update();
 m_pRecordset->Close();
 m_pRecordset = NULL;

(5)查詢資料庫

可以採用兩種方式,第一種:

ADODB::_CommandPtr m_pCommand;
m_pCommand.CreateInstance(__uuidof(ADODB::Command));
 m_pCommand->ActiveConnection = m_pConnection; 
m_pCommand->CommandText = "SELECT * FROM users WHERE ID=9";  
 m_pRecordset = m_pCommand->Execute(NULL, NULL,ADODB::adCmdText);
  _variant_t vSum;
vSum = m_pRecordset->GetCollect("Histogram");// m_pRecordset->Fields->GetItem("Histogram")->Value;
CString mystr;
mystr.Format("%d",vSum.intVal);
AfxMessageBox(mystr);

第二種

 m_pRecordset=m_pConnection->Execute("SELECT * FROM users WHERE ID=9",&vSum,ADODB::adCmdText);
 vSum = m_pRecordset->GetCollect("Histogram");// m_pRecordset->Fields->GetItem("Histogram")->Value;   _variant_t vSum;
 CString mystr;
 mystr.Format("%d",vSum.intVal);
  AfxMessageBox(mystr);

std::string strCmd="SELECT COUNT(ID) AS IDCount FROM users";
 _variant_t vSum;
 m_ppara->m_pRecordset = m_ppara->m_pConnection->Execute(strCmd.c_str(),&vSum,ADODB::adCmdText);
 vSum = m_ppara->m_pRecordset->GetCollect("IDCount");
 if(vSum.vt == NULL)
  return false;
 else
 {
  int nLookup = vSum.intVal;

 }

(5)遍歷資料庫

while(!m_pRecordset->adoEOF)
{
var = m_pRecordset->GetCollect("Name");
if(var.vt != VT_NULL)
strName = (LPCSTR)_bstr_t(var);
var = m_pRecordset->GetCollect("Age");
if(var.vt != VT_NULL)
strAge = (LPCSTR)_bstr_t(var);
m_AccessList.AddString( strName + " --> "+strAge );
m_pRecordset->MoveNext();
}

參考文獻:

(1)資料庫查詢方面

http://www.vckbase.com/document/viewdoc/?id=1215

http://www.codeguru.com/cpp/data/mfc_database/ado/article.php/c6729__2/

(2)資料庫建立方面

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ado270/htm/adproprimarykeyxvc.asp

http://www.51cto.com/html/2005/0922/3585.htm

(3) 資料庫升級部分

http://www.codeproject.com/database/ADOImageDB.asp

 遇到的典型問題

(1) error C2011: 'DataTypeEnum' : 'enum' type redefinition

解決方案:

#import "msado15.dll"  rename("EOF","adoEOF") rename("DataTypeEnum","adoDataTypeEnum")
#import "msadox.dll"  rename_namespace("MAJIANGLIN") rename("EOF","adoXEOF") rename("DataTypeEnum","adoXDataTypeEnum")

我試從http://www.blogcn.com/user3/jiangsheng/index.html 伯克商找到的答案, TKS google