#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; } |