国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當前位置: 首頁 - 科技 - 知識百科 - 正文

MFC通過ADO操作Access數(shù)據(jù)庫

來源:懂視網(wǎng) 責編:小采 時間:2020-11-09 07:28:25
文檔

MFC通過ADO操作Access數(shù)據(jù)庫

MFC通過ADO操作Access數(shù)據(jù)庫:我在《VC知識庫在線雜志》第十四期和第十五期上曾發(fā)表了兩篇文章——直接 通過 ODBC讀、寫Excel表文件和直接 通過 DAO讀、寫Access文件,先后給大家介紹了ODBC和DAO兩種 數(shù)據(jù)庫 訪問技術的基本使用方法,這次要給大家介紹的是ADO 數(shù)據(jù)庫 訪問技
推薦度:
導讀MFC通過ADO操作Access數(shù)據(jù)庫:我在《VC知識庫在線雜志》第十四期和第十五期上曾發(fā)表了兩篇文章——直接 通過 ODBC讀、寫Excel表文件和直接 通過 DAO讀、寫Access文件,先后給大家介紹了ODBC和DAO兩種 數(shù)據(jù)庫 訪問技術的基本使用方法,這次要給大家介紹的是ADO 數(shù)據(jù)庫 訪問技

我在《VC知識庫在線雜志》第十四期和第十五期上曾發(fā)表了兩篇文章——“直接 通過 ODBC讀、寫Excel表文件”和“直接 通過 DAO讀、寫Access文件”,先后給大家介紹了ODBC和DAO兩種 數(shù)據(jù)庫 訪問技術的基本使用方法,這次要給大家介紹的是ADO 數(shù)據(jù)庫 訪問技術的

我在《VC知識庫在線雜志》第十四期和第十五期上曾發(fā)表了兩篇文章——“直接通過ODBC讀、寫Excel表格文件”和“直接通過DAO讀、寫Access文件”,先后給大家介紹了ODBC和DAO兩種數(shù)據(jù)庫訪問技術的基本使用方法,這次要給大家介紹的是ADO數(shù)據(jù)庫訪問技術的使用方法。ADO(Active Data Object,活動數(shù)據(jù)對象)實際上是一種基于COM(組件對象模型)的自動化接口(IDispatch)技術,并以OLE DB(對象連接和鑲入的數(shù)據(jù)庫)為基礎,經(jīng)過OLE DB精心包裝后的數(shù)據(jù)庫訪問技術,利用它可以快速的創(chuàng)建數(shù)據(jù)庫應用程序。 ADO提供了一組非常簡單,將一般通用的數(shù)據(jù)訪問細節(jié)進行封裝的對象。由于ODBC數(shù)據(jù)源也提供了一般的OLE DB Privider,所以ADO不僅可以應用自身的OLE DB Privider,而且還可以應用所有的ODBC驅動程序。關于OLE DB和ADO的其它詳細情況,讀者可以自行查閱相關書籍或MSDN,這里就不一一說明了。讓我們直接步入主題:如何掌握ADO這種數(shù)據(jù)庫訪問技術。ADO的操作方法和前面講過的DAO的操作在很多方面存在相似之處,在這里,筆者為了更有效的說明它的使用方法,用VC6.0做了一個示例程序——AdoRWAccess,這個示例程序可以直接通過ADO來操作Access數(shù)據(jù)庫,示例程序的運行效果如下圖所示:



在示例程序中我們仍采用原庫結構,數(shù)據(jù)庫名Demo.mdb,庫內表名DemoTable,表內字段名為Name(姓名)和Age(年齡)的兩個字段,來構造示例程序操作所需的Access數(shù)據(jù)庫,這也和上兩篇文章的示例源碼中的庫結構相兼容。
下面讓我們看看ADO數(shù)據(jù)庫訪問技術使用的基本步驟及方法:
首先,要用#import語句來引用支持ADO的組件類型庫(*.tlb),其中類型庫可以作為可執(zhí)行程序(DLL、EXE等)的一部分被定位在其自身程序中的附屬資源里,如:被定位在msado15.dll的附屬資源中,只需要直接用#import引用它既可。可以直接在Stdafx.h文件中加入下面語句來實現(xiàn):

#import "c:\programfiles\common files\system\ado\msado15.dll" \

no_namespace \

rename ("EOF", "adoEOF")

其中路徑名可以根據(jù)自己系統(tǒng)安裝的ADO支持文件的路徑來自行設定。當編譯器遇到#import語句時,它會為引用組件類型庫中的接口生成包裝類,#import語句實際上相當于執(zhí)行了API涵數(shù)LoadTypeLib()。#import語句會在工程可執(zhí)行程序輸出目錄中產生兩個文件,分別為*.tlh(類型庫頭文件)及*.tli(類型庫實現(xiàn)文件),它們分別為每一個接口產生智能指針,并為各種接口方法、枚舉類型,CLSID等進行聲明,創(chuàng)建一系列包裝方法。語句no_namespace說明ADO對象不使用命名空間,rename ("EOF", "adoEOF")說明將ADO中結束標志EOF改為adoEOF,以避免和其它庫中命名相沖突。
其次,在程序初始過程中需要初始化組件,一般可以用CoInitialize(NULL);來實現(xiàn),這種方法在結束時要關閉初始化的COM,可以用下面語句CoUnInitialize();來實現(xiàn)。在MFC中還可以采用另一種方法來實現(xiàn)初始化COM,這種方法只需要一條語句便可以自動為我們實現(xiàn)初始化COM和結束時關閉COM的操作,語句如下所示: AfxOleInit();
接著,就可以直接使用ADO的操作了。我們經(jīng)常使用的只是前面用#import語句引用類型庫時,生成的包裝類.tlh中聲明的智能指針中的三個,它們分別是_ConnectionPtr、_RecordsetPtr和_CommandPtr。下面分別對它們的使用方法進行介紹:
1、_ConnectionPtr智能指針,通常用于打開、關閉一個庫連接或用它的Execute方法來執(zhí)行一個不返回結果的命令語句(用法和_CommandPtr中的Execute方法類似)。
——打開一個庫連接。先創(chuàng)建一個實例指針,再用Open打開一個庫連接,它將返回一個IUnknown的自動化接口指針。代碼如下所示:

_ConnectionPtr m_pConnection;

// 初始化COM,創(chuàng)建ADO連接等操作

AfxOleInit();

m_pConnection.cc(__uuidof(Connection));

// 在ADO操作中建議語句中要常用try...catch()來捕獲錯誤信息,

// 因為它有時會經(jīng)常出現(xiàn)一些意想不到的錯誤。jingzhou xu

try

{

// 打開本地Access庫Demo.mdb

m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;DataSource=Demo.mdb","","",adModeUnknown);

}

catch(_com_error e)

{

AfxMessageBox("數(shù)據(jù)庫連接失敗,確認數(shù)據(jù)庫Demo.mdb是否在當前路徑下!");

return FALSE;

}

——關閉一個庫連接。如果連接狀態(tài)有效,則用Close方法關閉它并賦于它空值。代碼如下所示:

if(m_pConnection->State)

m_pConnection->Close();

m_pConnection= NULL;

2、_RecordsetPtr智能指針,可以用來打開庫內數(shù)據(jù)表,并可以對表內的記錄、字段等進行各種操作。
——打開數(shù)據(jù)表。打開庫內表名為DemoTable的數(shù)據(jù)表,代碼如下:

_RecordsetPtr m_pRecordset;

m_pRecordset.CreateInstance(__uuidof(Recordset));

// 在ADO操作中建議語句中要常用try...catch()來捕獲錯誤信息,

// 因為它有時會經(jīng)常出現(xiàn)一些意想不到的錯誤。jingzhou xu

try

{

m_pRecordset->Open("SELECT * FROMDemoTable", // 查詢DemoTable表中所有字段

theApp.m_pConnection.GetInterfacePtr(), // 獲取庫接庫的IDispatch指針

adOpenDynamic,

adLockOptimistic,

adCmdText);

}

catch(_com_error *e)

{

AfxMessageBox(e->ErrorMessage());

}

——讀取表內數(shù)據(jù)。將表內數(shù)據(jù)全部讀出并顯示在列表框內,m_AccessList為列表框的成員變量名。如果沒有遇到表結束標志adoEOF,則用GetCollect(字段名)或m_pRecordset->Fields->GetItem(字段名)->Value方法,來獲取當前記錄指針所指的字段值,然后再用MoveNext()方法移動到下一條記錄位置。代碼如下所示:

_variant_t var;

CString strName,strAge;

try

{

if(!m_pRecordset->BOF)

m_pRecordset->MoveFirst();

else

{

AfxMessageBox("表內數(shù)據(jù)為空");

return;

}

// 讀入庫中各字段并加入列表框中

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();

}

// 默認列表指向第一項,同時移動記錄指針并顯示

m_AccessList.SetCurSel(0);

}

catch(_com_error *e)

{

AfxMessageBox(e->ErrorMessage());

}

——插入記錄。可以先用AddNew()方法新增一個空記錄,再用PutCollect(字段名,值)輸入每個字段的值,最后再Update()更新到庫中數(shù)據(jù)既可。其中變量m_Name和m_Age分別為姓名及年齡編輯框的成員變量名。代碼所下所示:

try

{

// 寫入各字段值

m_pRecordset->AddNew();

m_pRecordset->PutCollect("Name", _variant_t(m_Name));

m_pRecordset->PutCollect("Age", atol(m_Age));

m_pRecordset->Update();

AfxMessageBox("插入成功!");

}

catch(_com_error *e)

{

AfxMessageBox(e->ErrorMessage());

}

——移動記錄指針。移動記錄指針可以通過MoveFirst()方法移動到第一條記錄、MoveLast()方法移動到最后一條記錄、MovePrevious()方法移動到當前記錄的前一條記錄、MoveNext()方法移動到當前記錄的下一條記錄。但我們有時經(jīng)常需要隨意移動記錄指針到任意記錄位置時,可以使用Move(記錄號)方法來實現(xiàn),注意:Move()方法是相對于當前記錄來移動指針位置的,正值向后移動、負值向前移動,如:Move(3),當前記錄是3時,它將從記錄3開始往后再移動3條記錄位置。代碼如下所示:

try

{

int curSel = m_AccessList.GetCurSel();

// 先將指針移向第一條記錄,然后就可以相對第一條記錄來隨意移動記錄指針

m_pRecordset->MoveFirst();

m_pRecordset->Move(long(curSel));

}

catch(_com_error *e)

{

AfxMessageBox(e->ErrorMessage());

}

——修改記錄中字段值。可以將記錄指針移動到要修改記錄的位置處,直接用PutCollect(字段名,值)將新值寫入并Update()更新數(shù)據(jù)庫既可。可以用上面方法移動記錄指針,修改字段值代碼如下所示:

try

{

// 假設對第二條記錄進行修改

m_pRecordset->MoveFirst();

m_pRecordset->Move(1); // 從0開始

m_pRecordset->PutCollect("Name", _variant_t(m_Name));

m_pRecordset->PutCollect("Age", atol(m_Age));

m_pRecordset->Update();

}

catch(_com_error *e)

{

AfxMessageBox(e->ErrorMessage());

}

——刪除記錄。刪除記錄和上面修改記錄的操作類似,先將記錄指針移動到要修改記錄的位置,直接用Delete()方法刪除它并用Update()來更新數(shù)據(jù)庫既可。代碼如下所示:

try

{

// 假設刪除第二條記錄

m_pRecordset->MoveFirst();

m_pRecordset->Move(1); // 從0開始

m_pRecordset->Delete(adAffectCurrent); // 參數(shù)adAffectCurrent為刪除當前記錄

m_pRecordset->Update();

}

catch(_com_error *e)

{

AfxMessageBox(e->ErrorMessage());

}

——關閉記錄集。直接用Close方法關閉記錄集并賦于其空值。代碼如下所示:

m_pRecordset->Close();

m_pRecordset = NULL;

3、CommandPtr智能指針,可以使用_ConnectionPtr或_RecordsetPtr來執(zhí)行任務,定義輸出參數(shù),執(zhí)行存儲過程或SQL語句。
——執(zhí)行SQL語句。先創(chuàng)建一個_CommandPtr實例指針,再將庫連接和SQL語句做為參數(shù),執(zhí)行Execute()方法既可。代碼如下所示:

_CommandPtr m_pCommand;

m_pCommand.CreateInstance(__uuidof(Command));

m_pCommand->ActiveConnection =m_pConnection; // 將庫連接賦于它

m_pCommand->CommandText ="SELECT * FROM DemoTable"; //SQL語句

m_pRecordset =m_pCommand->Execute(NULL, NULL,adCmdText); // 執(zhí)行SQL語句,返回記錄集

——執(zhí)行存儲過程。執(zhí)行存儲過程的操作和上面執(zhí)行SQL語句類似,不同點僅是CommandText參數(shù)中不再是SQL語句,而是存儲過程的名字,如Demo。另一個不同點就是在Execute()中參數(shù)由adCmdText(執(zhí)行SQL語句),改為adCmdStoredProc來執(zhí)行存儲過程。如果存儲過程中存在輸入、輸出參數(shù)的話,需要使用到另一個智能指針_ParameterPtr來逐次設置要輸入、輸出的參數(shù)信息,并將其賦于_CommandPtr中Parameters參數(shù)來傳遞信息,有興趣的讀者可以自行查找相關書籍或MSDN。執(zhí)行存儲過程的代碼如下所示:

_CommandPtr m_pCommand;

m_pCommand.CreateInstance(__uuidof(Command));

m_pCommand->ActiveConnection = m_pConnection; // 將庫連接賦于它

m_pCommand->CommandText ="Demo";

m_pCommand->Execute(NULL,NULL, adCmdStoredProc)

聲明:本網(wǎng)頁內容旨在傳播知識,若有侵權等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

MFC通過ADO操作Access數(shù)據(jù)庫

MFC通過ADO操作Access數(shù)據(jù)庫:我在《VC知識庫在線雜志》第十四期和第十五期上曾發(fā)表了兩篇文章——直接 通過 ODBC讀、寫Excel表文件和直接 通過 DAO讀、寫Access文件,先后給大家介紹了ODBC和DAO兩種 數(shù)據(jù)庫 訪問技術的基本使用方法,這次要給大家介紹的是ADO 數(shù)據(jù)庫 訪問技
推薦度:
  • 熱門焦點

最新推薦

猜你喜歡

熱門推薦

專題
Top
主站蜘蛛池模板: 香蕉视频免费在线看 | 一区二区三区免费电影 | 亚洲人成一区 | 纯毛片| 亚洲国产成人久久 | 中文国产成人精品久久app | 国产区精品 | 欧美极品视频 | 黑人一区二区三区中文字幕 | 伊人久久综合成人网小说 | 国产高清不卡码一区二区三区 | 免费日本黄色网址 | 久久久久久久国产a∨ | 亚洲欧洲日韩 | 真实的国产乱xxxx在线 | 97一级毛片全部免费播放 | 久久无码精品一区二区三区 | 久久精品一区二区国产 | 亚洲精品视频在线播放 | 欧美孕妇性xxxⅹ精品hd | 国产成人久久精品一区二区三区 | 亚洲精品国产综合一线久久 | 一级毛片子 | 中文在线免费看视频 | er久99久热只有精品国产 | 国产96在线 | 亚洲专区欧美专区 | 欧美精品福利 | 国产精品一区二区免费 | 99久久精品国产综合一区 | 欧美视频一区二区三区在线观看 | 亚洲精品国产精品精 | 久久久久久夜精品精品免费啦 | 久久国产精品高清一区二区三区 | 人人草人人澡 | 国产亚洲欧美一区二区三区 | 国产成人一区二区 | 精品欧美 | 在线观看免费国产视频 | 亚洲精品在线免费看 | 羞羞网站在线观看 |