VC++ ADO串連ACCESS詳解

來源:互聯網
上載者:User

 

 

 第一、配置資料來源

控制台 -> 管理工具 ->資料來源(ODBC)

 

為什麼要設定資料來源?

設定資料來源的目的是為了我們的程式可以很好的訪問資料庫資源。

第二、代碼及解析:(建議運行一下,這個代碼)

 #i nclude <iostream.h>
#import "c:/program files/common files/system/ado/msado15.dll" no_namespace rename ("EOF", "adoEOF")
//ADO串連資料庫所需的dll,編譯的時候系統會為我們產生msado15.tlh,ado15.tli兩個C++標頭檔來定義ADO庫
//注意這裡的import一定要放在一行

int main(){

    //該程式使用ADO串連ACCESS(裝office的時候裡面有)資料庫 尾碼為.mdb 運行平台vc6.0
 //2003平台在寫著
    //---------------------------------------------------------------------------------
   
 //ADO資料庫連接分五步走,
 //第一、擷取串連(只到資料庫在什麼地方)
 //第二、開啟串連 open(必要的使用者名稱和密碼)
 //第三、擷取字元集 ResultSet(類似數組的資料存放區對象),
 //第四、顯示資料
 //第五、關閉資料集、關閉串連
 
 //建立個連線物件
 _ConnectionPtr m_pConnection;

    //對串連進行初始化
 CoInitialize(NULL);

 //---------------------------------------------------------------------------------
    //第一步、擷取串連
 //---------------------------------------------------------------------------------
 //同過串連(Connection)建立並擷取一個資料庫連接執行個體,
 //也可以把他看成控制代碼(電影門票)有裡他就有資格使用資料庫裡的資源了 呵呵
    m_pConnection.CreateInstance(__uuidof(Connection));

    // 又於在資料庫連接的時候有有可能會出現錯誤,比如資料來源設定或使用者名稱 密碼錯誤等
 //所以使用try{....}catch(){...}捕獲try{}裡的異常(錯誤)
 //並把這些異常放到_com_error e 這個變數裡,我們可以同過他擷取錯誤的資訊
 //並且,在出錯的時候程式一定回運行catch(){....}裡的東西,我們看到如果串連錯誤的時候
 //會執行cout<<"資料庫連接失敗,確認資料庫mydb.mdb是否在當前路徑下!"<<endl;
    //       return FALSE;  之後推出程式 。如果不加try的話可以在程式出錯的時候造成死機
 //所以,try也可以看成一種出錯的處理(異常處理)
    try               
    {   //---------------------------------------------------------------------------------
        //第二步、開啟串連  參數用 ; 分開
      //---------------------------------------------------------------------------------
  
  //第一個是Provider=Microsoft.Jet.OLEDB.4.0; access的廠商
  //Data Source=mydb.mdb","","",adModeUnknown 資料庫名稱 , 使用者名稱(空) ,密碼(空), 預設串連模式
  //對於該參數:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (1)
  /*adModeUnknown:預設。當前的許可權未設定
          adModeRead:唯讀
          adModeWrite:唯寫
          adModeReadWrite:可以讀寫
          adModeShareDenyRead:阻止其它Connection對象以讀許可權開啟串連
          adModeShareDenyWrite:阻止其它Connection對象以寫入權限開啟串連
          adModeShareExclusive:阻止其它Connection對象開啟串連
          adModeShareDenyNone:允許其它程式或對象以任何許可權建立串連
         */
  //通過這個語句我們的資料庫連接真正得到實現了,m_pConnection有了內容了(被附值了)
  m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=mydb.mdb","","",adModeUnknown);
      
    }
    catch(_com_error e) //捕捉異常
    {
        cout<<"資料庫連接失敗,確認資料庫mydb.mdb是否在當前路徑下!"<<endl;
        return FALSE;
    }

    //資料集對象
 _RecordsetPtr m_pRecordset;
    //執行個體化資料集
 m_pRecordset.CreateInstance(__uuidof(Recordset));

 //---------------------------------------------------------------------------------
 //第三步、擷取資料集
 //---------------------------------------------------------------------------------
    //雖然,前面串連上了,但串連的這個資料庫裡是不是有資料表(test表)還不能確定
 //所以,這裡同樣要捕獲可能出現的錯誤
 try
    {  
        m_pRecordset->Open("SELECT * FROM test",   //是資料查詢字串(即所謂的SQL語句)
                                                                                           //通常這些語句分為 資料的查詢(select),插入(insert)
                                                                                            //更新(update),刪除(delect)
                                                                                           //是否能執行這個命令是由前面(1)確定的
       
     m_pConnection.GetInterfacePtr(),        // 擷取庫接庫的IDispatch指標
       
  adOpenDynamic,                          //動態游標。所有資料庫的操作都會立即在各使用者記錄集上反應出來
       
  adLockOptimistic,                       //樂觀鎖定方式。只有在你調用Update方法時才鎖定記錄。在此之
                                          //前仍然可以做資料的更新、插入、刪除等動作
       
     adCmdText);                             //查詢出來的資料是顯示在控制台裡的
    }
    catch(_com_error *e)
    {
        cout<<e->ErrorMessage()<<endl;
    }  

    _variant_t var;
    char *ID,*name;
  
    try//得到表,但表裡不一定有資料
    {
        if(!m_pRecordset->BOF) //資料表裡是是有資料
            m_pRecordset->MoveFirst(); //將遊標(資料集在資料庫的叫法)移動到一第一條記錄
        else {
            cout<<"表內資料為空白"<<endl;
            return 1;
        }

         //--------------------------------------------------------------------------------------------------------------------------
        // 第四步、顯示資料
        //--------------------------------------------------------------------------------------------------------------------------- 

      while(!m_pRecordset->adoEOF) //和前面的rename ("EOF", "adoEOF") 想對應 這裡使用的是
                           //adoEOF代替EOF (當然這裡如果前面沒有rename也可以使用EOF)
         //判斷遊標是不是到達最後一條資料
        {
            var = m_pRecordset->GetCollect("ID"); //這是擷取表中欄位的一種方法“ID”為表欄位名
            if(var.vt != VT_NULL)                //判斷記錄在該有沒資料
                ID= _com_util::ConvertBSTRToString((_bstr_t)var); //由於得到的資料可能不是字元傳 這裡要轉換
                                                       //將他們轉成字串,從而可以在螢幕上顯示
           
   var = m_pRecordset->GetCollect("name");
            if(var.vt != VT_NULL)
                name=_com_util::ConvertBSTRToString((_bstr_t)var);

            cout<<ID<<" is "<<name<<endl;             //列印該記錄
      
            m_pRecordset->MoveNext();                 //遊標向走向下條記錄
        }
    }
    catch(_com_error *e) //捕獲異常
    {
        cout<<e->ErrorMessage()<<endl; //如有錯誤 ,將錯誤輸出
    }
    //--------------------------------------------------------------------------------------
    //關閉資料集
 //-----------------------------------------------------------------------------------
    m_pRecordset->Close();
    m_pRecordset = NULL;  
  
 //--------------------------------------------------------------------------------------
    //關閉資料庫連接
    //--------------------------------------------------------------------------------------
    if(m_pConnection->State)
    m_pConnection->Close();
    m_pConnection= NULL;

 //這兩步是一定要做的,否則時間長記憶體可能會被用盡
    return 0;
}

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.