Office中國(guó)論壇/Access中國(guó)論壇

 找回密碼
 注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

返回列表 發(fā)新帖
查看: 34902|回復(fù): 132
打印 上一主題 下一主題

[ADO/DAO] ADO編程入門(mén)教程

[復(fù)制鏈接]

點(diǎn)擊這里給我發(fā)消息

跳轉(zhuǎn)到指定樓層
1#
發(fā)表于 2015-1-10 11:14:09 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
跟大家分享一下我在網(wǎng)上找到的一個(gè)ADO編程教程,簡(jiǎn)單介紹ADO編程的幾個(gè)步驟,適合剛接觸及不知道如何下手的朋友,教程簡(jiǎn)單易懂。
游客,如果您要查看本帖隱藏內(nèi)容請(qǐng)回復(fù)

相關(guān)資源
【入門(mén)教程】Roych版主總結(jié)的Access使用ADO開(kāi)發(fā)的教程

http://m.mzhfr.cn/thread-119301-1-1.html

本帖子中包含更多資源

您需要 登錄 才可以下載或查看,沒(méi)有帳號(hào)?注冊(cè)

x
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏7 分享分享 分享淘帖 訂閱訂閱
2#
發(fā)表于 2015-1-10 12:53:53 | 只看該作者
為精神點(diǎn)贊

點(diǎn)擊這里給我發(fā)消息

3#
發(fā)表于 2015-1-10 13:13:56 | 只看該作者
謝謝樓主分享
Ado初學(xué)者教程詳細(xì)內(nèi)容:

ADO 初學(xué)者教程
適合初學(xué)者()
ADO 好像也是深水一潭,但潭里的兩條大魚(yú)(Connection 和 Recordset)是餐桌
上必不可少的佳肴。沒(méi)辦法,擼胳膊,挽袖子,下水摸魚(yú)吧!!
發(fā)上來(lái)用老師的大作之一《ADO 簡(jiǎn)明教案》供大家交流學(xué)習(xí)。(這方面偶有暈呼
呼的感覺(jué),望壇中高手多發(fā)表高見(jiàn))
一、ADO 的概念  
這一部分是不得不講,卻又很難講清的部分,當(dāng)你以后能熟練使用 ADO 的時(shí)候,
你可能會(huì)把這些“概念”全部忘掉了,但如果你從未了解過(guò) ADO 的這些概念,
它會(huì)始終困擾你,甚至影響你繼續(xù)學(xué)習(xí)的信心。  
但是要想完全真正理解這些概念,對(duì)我們幾乎是不可能的。我的理論水平也非
常有限,下面只就 ADO 涉及的最常用的概念給出一些盡可能“易于理解”的說(shuō)
明,首先聲明:這些概念不是官方的嚴(yán)謹(jǐn)敘述,更象是“演義”,目的只是讓
初學(xué)的朋友知道“是那么回事”或者產(chǎn)生一個(gè)“朦朦朧朧的印象”,如果有對(duì)
ADO 相關(guān)理論感性趣的朋友,請(qǐng)參考 MSDN(Microsoft Developer Network)的
文檔。  
閑言少敘。  
概念 1:什么是 ADO?
ActiveX Data Objects:ActiveX 數(shù)據(jù)對(duì)象  
我從未見(jiàn)過(guò)有人給出“ActiveX”的漢語(yǔ)翻譯,不過(guò)僅從后面的兩個(gè)英文單詞,
我們已經(jīng)可以知道 ADO是一種數(shù)據(jù)對(duì)象。  
數(shù)據(jù)對(duì)象嘛,其作用就是用來(lái)管理數(shù)據(jù)的。當(dāng)然管理數(shù)據(jù)的不一定非得是數(shù)據(jù)
對(duì)象,數(shù)據(jù)對(duì)象也不是可以管理所有的數(shù)據(jù)。(繞口令呵)  
對(duì)數(shù)據(jù)的管理我們可以不使用任何對(duì)象,而只使用普通的代碼來(lái)完成;也可以
使用數(shù)據(jù)對(duì)象來(lái)做,至于選用何種方式,主要取決于哪種方式更適合(有時(shí)也
取決于寫(xiě)代碼者的偏好)!  
問(wèn)題是,怎么知道哪種方式更適合呢,當(dāng)然你必要要了解各種方式,今天我們
要了解的是 ADO!  
在這個(gè)概念中,我已經(jīng)初步回答了 ADO 的作用。更多的進(jìn)一步的回答我放在后
面的實(shí)戰(zhàn)中:-)。  
概念 2:什么是 ActiveX?
在很早以前,我曾經(jīng)問(wèn)過(guò)我的一個(gè)朋友:ActiveX 是什么意思?他回答是:一種
商標(biāo)的名字。  
當(dāng)時(shí)我確實(shí)注意到, ActiveX 后面有一個(gè)® (R) , 我是學(xué)經(jīng)濟(jì)類專業(yè)的, 知道®(R)
是注冊(cè)商標(biāo)的意思。所以在很長(zhǎng)時(shí)間我不再去追究它的具體含義,商標(biāo)的名字
有什么好研究的。  
再后來(lái),無(wú)意中看到了些關(guān)于 ActiveX 更多的介紹,現(xiàn)在,我還是覺(jué)得我朋友
給我的解釋最好,大道至簡(jiǎn)!科學(xué)的東西從來(lái)都不復(fù)雜。  
但我還是要給大家介紹一下我所看的相關(guān)介紹,先要來(lái)了解另一個(gè)概念。  
概念 3:什么是 OLE?
OLE 是 Object Linking and Embedding,對(duì)象鏈接與嵌入技術(shù)  
OLE 是封裝了一些軟件(對(duì)象)的庫(kù)文件,這個(gè)庫(kù)文件通常稱為“部件”,它有
幾個(gè)特征:  (1)它是可運(yùn)行代碼  
(2)它是可被其它外部應(yīng)用程序調(diào)用的代碼  
(3)外部程序可以重復(fù)調(diào)用庫(kù)中的代碼,通常稱為代碼重用  
大家可以看出,上面的三個(gè)特征都與“類”有關(guān),這就是為什么說(shuō)“類”是部
件的基礎(chǔ)的原因。  
扯遠(yuǎn)了,趕緊回來(lái)。  
那么 OLE和 ActiveX有什么關(guān)系呢?  
當(dāng)發(fā)展到網(wǎng)絡(luò)時(shí)代的時(shí)候,OLE 需要能夠與 Web 瀏覽器交互,嵌入到網(wǎng)頁(yè)中,隨
網(wǎng)頁(yè)傳送到客戶的瀏覽器上,并在客戶端執(zhí)行。這個(gè)時(shí)候,OLE 的基礎(chǔ)技術(shù)也有
了發(fā)展,就是我們常聽(tīng)說(shuō)的 COM(Component Object Model,部件對(duì)象模型),
我們不再去討論 COM 了,不然就越說(shuō)越遠(yuǎn)了。按照一般的升級(jí)命名原則,這時(shí)
應(yīng)該叫 OLE 2.0,但微軟給 OLE 改名了,它就是 ActiveX。  
所以可以說(shuō),ActiveX其實(shí)就是 OLE 2.0,或者是支持網(wǎng)頁(yè)技術(shù)的 OLE。  
大家知道,由于互聯(lián)網(wǎng)本身具有安全問(wèn)題,訪問(wèn)速度遠(yuǎn)低于本地訪問(wèn)速度等一
些特殊性,ActiveX部件通常還有如下特征:  
(1)一般都提供“代碼簽名”或要求注冊(cè)使用,以保證其安全性。  
(2)占用內(nèi)存盡可能小,效率(速度)盡可能高。但這也不是絕對(duì)的,隨著網(wǎng)
速的提升,很多 ActiveX 部件的制作要求也在下降。  
到這兒,大家再統(tǒng)起來(lái)看看 ActiveX Data Objects,是不是對(duì)這幾個(gè)詞有了一
個(gè)是“朦朧”的印象了~~~  
概念 4:什么是關(guān)系數(shù)據(jù)庫(kù)?
ADO 管理的是數(shù)據(jù),其實(shí)這里的數(shù)據(jù)通常情況下是“關(guān)系數(shù)據(jù)”,這些“關(guān)系數(shù)
據(jù)”的集合稱為關(guān)系數(shù)據(jù)庫(kù)。  
何謂“關(guān)系”,簡(jiǎn)而言之,即“表格”。  
這樣,關(guān)系數(shù)據(jù)庫(kù)的含義就是由“表格”組成的數(shù)據(jù)庫(kù)。  
這樣解釋可能出乎很多朋友的意料,但這個(gè)解釋肯定錯(cuò)不了。我不再去細(xì)說(shuō)這
個(gè)“表格”,說(shuō)的多了,只會(huì)讓人糊涂。只說(shuō)一些我們后面有用的:  
表格的列一般稱為字段,每一列(字段)都具有相同的類型  
表格的行一般稱為記錄。一行稱為一條記錄。  
大家記住一點(diǎn):當(dāng)我們打算使用 ADO 來(lái)管理 EXCEL 數(shù)據(jù)時(shí),這個(gè)數(shù)據(jù)區(qū)域一定
要可以被看做“表格”,它的每一列要保證相同的類型,舉個(gè)例子說(shuō),不能有
些是日期,而另外一些是文本或數(shù)字類型。  
關(guān)系數(shù)據(jù)庫(kù)的概念解釋到此為止。  
概念 5:什么是 SQL?
SQL:Stuctured Query Language 結(jié)構(gòu)化查詢語(yǔ)言  
ADO 管理數(shù)據(jù),是通過(guò)連接 OLE DB 驅(qū)動(dòng)來(lái)完成的(OLE Database這個(gè)詞不用解
釋了吧,大家看名字就知道是干什么活的),真正的數(shù)據(jù)管理者是 OLE DB,管
理嘛,當(dāng)然要使用語(yǔ)言了,OLE DB使用的語(yǔ)言就是 SQL。所以,SQL對(duì)我們來(lái)說(shuō),
是使用 OLE  DB 的核心, 也就成為使用 ADO 的核心內(nèi)容, 你要發(fā)布管理數(shù)據(jù)的 “命
令”必須使用 SQL 語(yǔ)言。不會(huì) SQL就無(wú)法管理數(shù)據(jù),也就談不上使用 ADO。  
這里我們知道了 ADO和 SQL 的關(guān)系了。  
簡(jiǎn)單介紹 SQL 的歷史。  
SQL 是關(guān)系數(shù)據(jù)庫(kù)研究的產(chǎn)物, 他是美國(guó)的一位博士于上世紀(jì) 70 年代最先提出,
80 年代美國(guó)國(guó)家標(biāo)準(zhǔn)局(ANSI)制訂發(fā)布了 SQL 美國(guó)國(guó)家標(biāo)準(zhǔn),并被國(guó)際標(biāo)準(zhǔn)化組織(ISO)所接受。這樣,隨著 SQL 標(biāo)準(zhǔn)地位的確定,很多數(shù)據(jù)庫(kù)廠家都紛
紛采用,SQL 也就成了最流行的數(shù)據(jù)庫(kù)語(yǔ)言。但各家在采用 SQL,都對(duì)“標(biāo)準(zhǔn)”
SQL 進(jìn)行了擴(kuò)充和改動(dòng),形成了很多“方言”,OLE DB 采用的 SQL 也是方言之
一。  
其它概念我們將在后面遇到時(shí)再講。  
請(qǐng)大家看 3 遍。以后就可以放下這些概念問(wèn)題,而把更多的注意力放在 ADO 的
實(shí)際應(yīng)用上。15 分鐘后,我們進(jìn)入 ADO 的實(shí)戰(zhàn)。  
二、ADO 代碼步驟
從現(xiàn)在起,我們需要同步互動(dòng)。  
請(qǐng)打開(kāi)你下載的《模擬數(shù)據(jù).xls》,進(jìn)入 VBE,插入一個(gè)模塊,先寫(xiě)下這樣一個(gè)
框架  
Sub Ado0()  
End Sub

點(diǎn)擊這里給我發(fā)消息

4#
發(fā)表于 2015-1-10 13:14:46 | 只看該作者

我們下面以“查詢”為例介紹 ADO的工作步驟。使用 ADO工作共有五個(gè)步驟:  
步驟 1:創(chuàng)建 ADO 對(duì)象。
我們只介紹最常用兩個(gè) ADO 對(duì)象 Connection 和 Recordset,Record(記錄)對(duì)
象表示 Recordset(記錄集)對(duì)象中的一條記錄,我們也會(huì)提到。  
Connection 對(duì)象代表打開(kāi)的、與數(shù)據(jù)源的連接。
Recordset 對(duì)象表示的是來(lái)自基本表或命令執(zhí)行結(jié)果的記錄全集。
上面的概念來(lái)自 ADO 的幫助文檔,現(xiàn)在覺(jué)得抽象不要緊,關(guān)鍵是后面學(xué)會(huì)怎么
用它們就行。  
是用 ADO,必須先創(chuàng)建 ADO 對(duì)象。  
創(chuàng)建 ADO 對(duì)象方法 1:使用 VBA的 CreateObject 函數(shù)。
  Dim cnn As Object, rst As Object  
  Set cnn = CreateObject("ADODB.Connection")  
  Set rst = CreateObject("ADODB.Recordset")  
  上面語(yǔ)句為我們創(chuàng)建了兩個(gè) ADO對(duì)象。  
創(chuàng)建 ADO 對(duì)象方法 2:添加工程引用
這個(gè)方法首先通過(guò) VBE“工具”菜單-引用,在“引用”列表中找到  
Microsoft ActiveX Data Objects 2.x Library  
勾選后確定。應(yīng)盡量選擇高一點(diǎn)版本。  
然后就可以使用下面的代碼創(chuàng)建 ADO 對(duì)象:  
  Dim cnn As ADODB.Connection  
  Set cnn = New ADODB.Connection  
也可以在聲明是直接創(chuàng)建,上面代碼寫(xiě)為:  
  Dim cnn As New ADODB.Connection  
創(chuàng)建 ADO 對(duì)象的方法使用上面的兩種方法之一即可,第二種方法的好處是可以
在編輯代碼時(shí)“自動(dòng)列出對(duì)象成員”,后面的代碼我們將采用這種方法。  
現(xiàn)在,請(qǐng)?jiān)谀愕?Sub Ado0 中寫(xiě)入如下代碼(后三行我們后面會(huì)用到):  
  Dim cnn As New ADODB.Connection  
  Dim rst As New ADODB.Recordset  
  Dim Sql As String  
  Dim i As Integer
  Dim j As Integer  步驟 2:建立連接
創(chuàng)建了 ADO對(duì)象后,首先要做的就是為 Connection 對(duì)象指定連接的數(shù)據(jù)源。  
ADO 建立連接是通過(guò) OLE DB 進(jìn)行的,OLE DB的驅(qū)動(dòng)種類有很多,對(duì) EXCEL 而言,
支持的 OLE DB 連接方式有兩種:  
ODBC(Open Database Connectivety)開(kāi)放數(shù)據(jù)庫(kù)連接
JET(Joint Engine Technology)連接引擎技術(shù)  
ODBC 是早期的 OLE DB 驅(qū)動(dòng),它對(duì)系統(tǒng)的底層依賴和限制過(guò)多,且以“效率最低”
著稱,相對(duì)而言,JET 更為靈活高效,所以我們只介紹 JET 連接。不是 ODBC 沒(méi)
用,對(duì)早期的某些數(shù)據(jù)源,因?yàn)?JET 沒(méi)有提供支持,或者你的機(jī)器上沒(méi)有 JET
驅(qū)動(dòng)(可能性不大),還是必須使用 ODBC 的。  
建立連接是通過(guò)使用 Connection 對(duì)象的 Open 方法來(lái)完成的,在打開(kāi)連接前,
需要先設(shè)置 Connection 對(duì)象的Provider和 ConnectionString屬性。下面代碼
為前面創(chuàng)建的 cnn 對(duì)象建立連接:
  With cnn
    .Provider = "Microsoft.Jet.OleDb.4.0"  
    .ConnectionString = "Extended Properties='Excel 8.0;Hdr=Yes;';Data
Source=" & ThisWorkbook.FullName  
    .Open
  End With  
上面 with 語(yǔ)句體中,第一句為 cnn 指定 OLE DB 驅(qū)動(dòng)提供者為
Microsoft.Jet.OleDb.4.0,下面說(shuō)明一下第二句:  
Extended Properties='Excel 8.0;Hdr=Yes; 表示要連接的數(shù)據(jù)源是 EXCEL 文
件,Hdr=Yes 表示后面對(duì)數(shù)據(jù)源進(jìn)行查詢時(shí),將要查詢的“表”區(qū)域的第一行做
為表頭區(qū), 即每一列的第一行作為 “字段名” , 第二行起為數(shù)據(jù)區(qū)。 如果 Hdr=No,
則表示全部為數(shù)據(jù)區(qū),這時(shí)需要“字段名”第一列系統(tǒng)默認(rèn)為 f1,第二列為 f2,
依此類推。  
后面的 ThisWorkbook.FullName 表示數(shù)據(jù)源文件的全路徑,這里是連接自身文
件,如果是其它 EXCEL 文件,只需要替換一下這兒的 ThisWorkbook.FullName
即可。  
上 面 連接 Hdr=Yes 是 系 統(tǒng)的默認(rèn)設(shè)置,所以一般不需要寫(xiě)出來(lái),
ConnectionString 屬性的設(shè)置可以簡(jiǎn)化為:  
.ConnectionString = "Extended Properties=Excel 8.0;Data Source=" &
ThisWorkbook.FullName  
注意如果存在兩個(gè)以上的“Extended Properties”,等號(hào)后面必須用引號(hào)引起
來(lái),而且上面連接表達(dá)式中的分號(hào)是不能省略的。  
如果不想先設(shè)置Connection對(duì)象的Provider和ConnectionString屬性在打開(kāi)
連接,也可以在使用 Open 方法打開(kāi)連接的時(shí)候完成這些設(shè)置。上面的連接代碼
可以寫(xiě)成這樣:  
  cnn.Open "Provider=Microsoft.Jet.OleDb.4.0;Extended
Properties=Excel 8.0;Data Source=" & ThisWorkbook.FullName  
這種寫(xiě)法看起來(lái)更簡(jiǎn)潔,我們后面將采用這種寫(xiě)法。請(qǐng)將上行代碼寫(xiě)到你 Sub
Ado0 中  
Open 方法 (ADO Connection)  
打開(kāi)到數(shù)據(jù)源的連接。  語(yǔ)法  
connection.Open ConnectionString, UserID, Password, Options  
參數(shù)  
ConnectionString   可選,字符串,包含連接信息。  
UserID   可選,字符串,包含建立連接時(shí)所使用用戶名。  
Password   可選,字符串,包含建立連接時(shí)所使用密碼。  
Options   可選,決定該方法是連接是異步還是同步返回。  
說(shuō)明一下:其實(shí) ADO 對(duì)不同數(shù)據(jù)源如 ACCESS,VFP 的操作,步驟都是相同的,
甚至后面要講的 SQL 語(yǔ)句的使用也是相同的,唯一差別就表現(xiàn)在連接的方式上,
或者說(shuō)連接字符串的表達(dá)上  
步驟 3:構(gòu)造并執(zhí)行 SQL 語(yǔ)句,得到結(jié)果集
現(xiàn)在我們先舉一個(gè)例子:  
請(qǐng)將下行代碼寫(xiě)到你 Sub Ado0中:  
  Sql = "Select 班級(jí),姓名 From [一年級(jí)$]"
上面 Sql 語(yǔ)句的意思是從“一年級(jí)”表中查詢(提。┧杏涗浀陌嗉(jí)和姓名
兩個(gè)字段。SQL 語(yǔ)法我們下一部分會(huì)詳細(xì)講。  
構(gòu)造了 Sql語(yǔ)句后,就是執(zhí)行查詢,得到結(jié)果集。也有兩種方法:  
方法 1:使用 Connection 對(duì)象的Execute方法
  Set rst = cnn.Execute(Sql)  
通過(guò)上面語(yǔ)句,我們就可以執(zhí)行查詢,并將結(jié)果保存到 rst 對(duì)象中。  
Execute 方法 (ADO Connection)  
執(zhí)行指定的查詢、SQL 語(yǔ)句、存儲(chǔ)過(guò)程或特定提供者的文本等內(nèi)容。  
語(yǔ)法  
connection.Execute CommandText, RecordsAffected, Options  
返回值  
返回 Recordset 對(duì)象引用。  
參數(shù)  
CommandText    字符串,通常為要執(zhí)行的 SQL 語(yǔ)句、表名。  
RecordsAffected    可選,長(zhǎng)整型變量,提供者向其返回操作所影響的記錄數(shù)
目。  
Options    可選,長(zhǎng)整型值,指示提供者應(yīng)如何計(jì)算 CommandText 參數(shù)。  
后面兩個(gè)可選參數(shù)我們一般用不到去設(shè)置,這里不做介紹。  
使用 Connection 對(duì)象的 Execute方法返回的結(jié)果集,始終為只讀、僅向前的游
標(biāo)。也無(wú)法取得返回結(jié)果集合中的記錄數(shù)。一般在只需將結(jié)果一次性寫(xiě)入工作
表中(CopyFromRecordset)時(shí)使用,它的好處是寫(xiě)法簡(jiǎn)潔。如果需要處理返回
結(jié)果的更多操作,應(yīng)使用下面的方法。
方法 2:使用 Recordset 對(duì)象的 Open 方法
  rst.Open Sql, cnn  
本句的功能效果同前面的 Set rst = cnn.Execute(Sql)一樣。

點(diǎn)擊這里給我發(fā)消息

5#
發(fā)表于 2015-1-10 13:15:08 | 只看該作者

  
Open 方法 (ADO Recordset)  
打開(kāi)游標(biāo)。  
語(yǔ)法  
recordset.Open Source,  ActiveConnection, CursorType, LockType,  Options  參數(shù)  
Source   可選,變體型,通常為 SQL 語(yǔ)句、表名。  
ActiveConnection   可選。變體型,一般為有效 Connection 對(duì)象變量名。  
CursorType   可選,CursorTypeEnum 值,打開(kāi) Recordset 時(shí)使用游標(biāo)類型。  
LockType   可選。打開(kāi) Recordset 時(shí)使用的鎖定(并發(fā))類型。  
Options   可選,長(zhǎng)整型值,用于指示提供者如何計(jì)算 Source 參數(shù)。  
應(yīng)該說(shuō)這五個(gè)參數(shù)都比較有用,但我們最常用的就是前面三個(gè)參數(shù),后面兩個(gè)
參數(shù)不用管它們就可以了。我只貼一部分幫助內(nèi)容,大家實(shí)際看幫助時(shí),不要
被這么多幫助內(nèi)容嚇到,通過(guò)實(shí)際使用就容易理解它們了。學(xué)習(xí) ADO 和其它的
知識(shí)一樣,也是需要理論和實(shí)踐交互的過(guò)程,實(shí)際應(yīng)用后再回頭去看幫助中的
一些理論內(nèi)容,可以理解的更深,提高也會(huì)更快。  
這里我們遇到了一個(gè)詞:游標(biāo)(Cursor)。游標(biāo)是數(shù)據(jù)庫(kù)的組件,在數(shù)據(jù)庫(kù)中,
對(duì)數(shù)據(jù)的操作我們直觀的感覺(jué)是對(duì)“表”或者記錄(集)進(jìn)行的,但在系統(tǒng)內(nèi)
部記錄的留覽和更新都是通過(guò)游標(biāo)來(lái)進(jìn)行的。 通俗點(diǎn)講, 游標(biāo)就是 “數(shù)據(jù)指針” 。   
下面說(shuō)明一下第三個(gè)參數(shù) CursorType,游標(biāo)可以并且一般也需要在打開(kāi)前確定
其類型。打開(kāi)游標(biāo)是可以指定的類型有四種:
AdOpenForwardOnly (默認(rèn)值)打開(kāi)僅向前類型游標(biāo)。  
AdOpenKeyset 打開(kāi)鍵集類型游標(biāo)。  
AdOpenDynamic 打開(kāi)動(dòng)態(tài)類型游標(biāo)。  
AdOpenStatic 打開(kāi)靜態(tài)類型游標(biāo)。  
如果需要計(jì)算返回記錄集的記錄數(shù)(RecordCount),需要將游標(biāo)指定為
adOpenStatic 或 adOpenKeyset類型,如果需要對(duì)游標(biāo)進(jìn)行更新,則需要指定為
adOpenKeyset 或 AdOpenDynamic類型。  
請(qǐng)將下行代碼寫(xiě)到你 Sub Ado0中:  
  rst.Open Sql, cnn, adOpenKeyset  
步驟 4:處理查詢結(jié)果
處理查詢結(jié)果通常是將查詢結(jié)果寫(xiě)入工作表中或控件(比如 Listview)中。  
處理 1:CopyFromRecordset 方法簡(jiǎn)便處理
如果只需要將查詢的結(jié)果寫(xiě)入工作表中,可以使用 Range 對(duì)象的
CopyFromRecordset方法簡(jiǎn)便處理:  
Sheet7.Range("A2").CopyFromRecordset rst  
上面 A2 是要寫(xiě)入工作表區(qū)域的左上角單元格。  
CopyFromRecordset 方法(Range 對(duì)象)  
將一個(gè) ADO或 DAO Recordset 對(duì)象的內(nèi)容復(fù)制到工作表中,復(fù)制的起始位置在
指定區(qū)域的左上角。  
句法  
Rng.CopyFromRecordset(Data, MaxRows, MaxColumns)  
參數(shù)  
Data:Void 類型,必選。復(fù)制到指定區(qū)域的 Recordset 對(duì)象。  
MaxRows:Variant 類型,可選。復(fù)制到工作表的記錄個(gè)數(shù)上限。如果省略該參
數(shù),將復(fù)制 Recordset 對(duì)象的所有記錄。  
MaxColumns:Variant 類型,可選。復(fù)制到工作表的字段個(gè)數(shù)上限。如果省略
該參數(shù),將復(fù)制 Recordset 對(duì)象的所有字段。  
處理 2:更為細(xì)致的處理 當(dāng)查詢結(jié)果不是寫(xiě)入工作表中,或者雖是寫(xiě)入工作表中但不是按查詢結(jié)果的方
式時(shí)。這時(shí)需要對(duì)更為細(xì)致的處理,比如逐條記錄、逐個(gè)字段進(jìn)行處理。  
  For i = 1 To rst.RecordCount  
    For j = 0 To rst.Fields.Count - 1  
      Sheet7.Cells(i + 1, j + 1) = rst.Fields(j)  
    Next j  
    rst.MoveNext  
  Next i  
大家仔細(xì)看一下上面的代碼,應(yīng)該不難理解的。簡(jiǎn)單地解釋一下:  
rst.RecordCount 是記錄結(jié)果集中的記錄數(shù),前面我們已經(jīng)提過(guò)。  
rst.Fields.Count 是記錄結(jié)果集中的字段數(shù),F(xiàn)ields是字段集對(duì)象,由單個(gè)的
Field 字段組成,表示 Recordset 對(duì)象的列的集合。Fields 成員的下標(biāo)從 0 開(kāi)
始,0 表示第一個(gè)字段。  
上面代碼我們都假定第一行為預(yù)先設(shè)定好的表頭,代碼中不再考慮。有時(shí)需要
將字段名寫(xiě)入表頭,請(qǐng)看下面的代碼:  
  For i = 1 To rst.Fields.Count  
    Sheet7.Cells(1, i) = rst.Fields(i - 1).Name  
  Next i  
請(qǐng)將上面代碼寫(xiě)入 Sub Ado0 中。  
處理 3:記錄定位
(1)Move系列方法
上面已經(jīng)用到了 Recordset 對(duì)象的 MoveNext 方法。  
rst.MoveNext 移動(dòng)游標(biāo)到下一記錄。在使用 MoveNext 移動(dòng)游標(biāo)時(shí),一般需要
通過(guò) Recordset 對(duì)象的 EOF 屬性先進(jìn)行判斷游標(biāo)是否到了記錄尾。當(dāng)游標(biāo)到了
記錄尾時(shí),EOF 屬性會(huì)被設(shè)置為 True。上面的代碼可以這樣寫(xiě):  
  i = 1  
  Do While Not rst.EOF  
    For j = 0 To rst.Fields.Count - 1  
      Sheet7.Cells(i + 1, j + 1) = rst.Fields(j)  
    Next j  
    i = i + 1  
  Loop  
請(qǐng)將上面代碼寫(xiě)入 Sub Ado0 中。  
與 EOF 對(duì)應(yīng)的是 BOF,用來(lái)判斷游標(biāo)是否到了記錄首。  
與 MoveNext 類似的還有 MoveFirst、MoveLast 和 MovePrevious 方法,在指定
Recordset 對(duì)象中移動(dòng)到第一個(gè)、最后一個(gè)或前一個(gè)記錄并使該記錄成為當(dāng)前
記錄。  
此外,移動(dòng)記錄還可以使用 Move方法。  
Move 方法(Recordset 對(duì)象)  
移動(dòng) Recordset 對(duì)象中當(dāng)前記錄的位置。  
語(yǔ)法  
recordset.Move NumRecords, Start  
參數(shù)  
NumRecords    長(zhǎng)整型,指定當(dāng)前記錄位置移動(dòng)的記錄數(shù)。  Start   可選,字符串或變體型,指定從哪兒開(kāi)始移動(dòng)。也可為下值之一:  
AdBookmarkCurrent(0) 默認(rèn)。從當(dāng)前記錄開(kāi)始。  
AdBookmarkFirst(1) 從首記錄開(kāi)始。  
AdBookmarkLast(2) 從尾記錄開(kāi)始。  
在 Recordset 對(duì)象中定位游標(biāo)位置, 除了上面的幾個(gè) Move 方法外, 常用的還有:   
(2)使用Recordset 對(duì)象的 AbsolutePosition 屬性。
AbsolutePosition 屬性可以設(shè)置或返回游標(biāo)當(dāng)前的記錄位置。下面代碼將游標(biāo)
當(dāng)前位置保存在變量 c中,然后設(shè)置為第 10條記錄:
  c = rst.AbsolutePosition
  rst.AbsolutePosition = 10
(3)使用Recordset 對(duì)象的 Bookmark 屬性。
Bookmark 屬性可以設(shè)置或返回游標(biāo)當(dāng)前當(dāng)前記錄的書(shū)簽。Recordset 對(duì)象的每
一條記錄都有唯一的“書(shū)簽”值。下面代碼先將游標(biāo)當(dāng)前位置設(shè)置為第 10 條記
錄,然后將當(dāng)前記錄的書(shū)簽保存到變量 c 中,然后移動(dòng)到下一條記錄(實(shí)際使
用時(shí)一般是進(jìn)行其它的處理操作),最后在通過(guò)設(shè)置 Bookmark 屬性將記錄定位
到原來(lái)的第 10 條記錄。
  rst.AbsolutePosition = 10
  c = rst.Bookmark
  rst.MoveNext
  rst.Bookmark = c
與使用 AbsolutePosition 屬性的區(qū)別是,使用 Bookmark 屬性時(shí),往往不知道
或不關(guān)心記錄所處的實(shí)際位置。
(4)Find方法
Find 方法(Recordset 對(duì)象)  
搜索 Recordset 中滿足指定標(biāo)準(zhǔn)的記錄。如果滿足標(biāo)準(zhǔn),則記錄集位置設(shè)置在
找到的記錄上,否則位置將設(shè)置在記錄集的末尾。  
語(yǔ)法  
Find (criteria, SkipRows, searchDirection, start)  
參數(shù)  
criteria   字符串,包含指定用于搜索的列名、比較操作符和值的語(yǔ)句。  
SkipRows  可選,長(zhǎng)整型值,默認(rèn)值為零,指定當(dāng)前行或 start 書(shū)簽的位移以
開(kāi)始搜索。  
searchDirection   可選的 SearchDirectionEnum 值,指定搜索應(yīng)從當(dāng)前行還
是下一個(gè)有效行開(kāi)始。其值可為 adSearchForward(1) 或 adSearchBackward
(-1)。搜索是在記錄集的開(kāi)始還是末尾結(jié)束由 searchDirection 值決定。  
start    可選,變體型書(shū)簽,用作搜索的開(kāi)始位置。
下面代碼搜索所有記錄,將姓陳的同學(xué)名單寫(xiě)入 Sheet7的第 3 列:
  i = 2
  rst.MoveFirst
  rst.Find "姓名 Like '陳*'"
  Do While Not rst.EOF
    Sheet7.Cells(i, 3) = rst.Fields("姓名")
    rst.Find "姓名 Like '陳*'", 1, adSearchForward
    i = i + 1   Loop
請(qǐng)將上面代碼寫(xiě)入 Sub Ado0 中。  
步驟 5:關(guān)閉并釋放 ADO 對(duì)象
使用 ADO 完成了全部工作后,應(yīng)該關(guān)閉并釋放創(chuàng)建的 ADO對(duì)象。
請(qǐng)將下面代碼寫(xiě)到你 Sub Ado0中:  
  rst.Close
  cnn.Close
  Set rst = Nothing
  Set cnn = Nothing
至此,我們完成了一個(gè)實(shí)例,也介紹完了 ADO代碼的全部步驟。大家休息 10 分
鐘。
上面的代碼并沒(méi)有完全寫(xiě)進(jìn)我們的 Sub Ado0 中,大家可以自己試驗(yàn)一下運(yùn)行結(jié)
果。

點(diǎn)擊這里給我發(fā)消息

6#
發(fā)表于 2015-1-10 13:15:21 | 只看該作者


三、構(gòu)建 SQL 語(yǔ)句
從上面我們對(duì) ADO 工作步驟的了解,已經(jīng)知道要讓 ADO 有效工作,關(guān)鍵是我們
給它發(fā)出什么樣的 SQL指令。
在概念部分,我們已經(jīng)簡(jiǎn)單介紹了 SQL 的有關(guān)情況,F(xiàn)在我們來(lái)詳細(xì)探討它。
SQL 語(yǔ)句從功能上可以分為兩大類: 數(shù)據(jù)定義語(yǔ)言 (DDL) 和數(shù)據(jù)操縱語(yǔ)言 (DML) 。
前者主要用于對(duì)數(shù)據(jù)庫(kù)中表及字段,還有我們沒(méi)有提到的索引的創(chuàng)建、刪除、
修改;后者用于對(duì)記錄的查詢、更新、插入、刪除等操作。就 EXCEL 而言,我
們通常使用的是 DML 部分語(yǔ)句。下面將對(duì)常用的語(yǔ)句進(jìn)行介紹。
(一)簡(jiǎn)單查詢
句法 1:Select 查詢表達(dá)式 From 數(shù)據(jù)區(qū)域
前面我們使用的 SQL 語(yǔ)句就屬于此類。  
查詢表達(dá)式
請(qǐng)粘貼下面的過(guò)程:
Sub Ado1()  
  Dim cnn As New ADODB.Connection  
  Dim Sql As String  
  cnn.Open "Provider=Microsoft.Jet.OleDb.4.0;Extended
Properties=Excel 8.0;Data Source=" & ThisWorkbook.FullName  
  Sql = "Select * from [一年級(jí)$]"  
  Sheet7.Cells.Clear  
  Sheet7.[a2].CopyFromRecordset cnn.Execute(Sql)  
  cnn.Close  
  Set cnn = Nothing  
End Sub  
查詢表達(dá)式可以是下列之一或其組合,對(duì)多種方式的組合,用逗號(hào)擱開(kāi):
(1)星號(hào)(*) 表示“數(shù)據(jù)區(qū)域”的所有字段。
(2)字段名
(3)常量表達(dá)式
(4)任何有效的計(jì)算表達(dá)方式
下面是一些 SQL 語(yǔ)句,請(qǐng)分別替換 Sub Ado1 的 Sql 句,并查看運(yùn)行結(jié)果。
  Sql = "Select '一年級(jí)',* from [一年級(jí)$]"   Sql = "Select 姓名,語(yǔ)文+數(shù)學(xué)+英語(yǔ) from [一年級(jí)$]"
  Sql = "Select 姓名,iif(語(yǔ)文>=60,'及格','不及格') from [一年級(jí)$]"
使用 AS 重新命名列名稱
當(dāng)查詢表達(dá)式使用(2)字段名時(shí),字段名就是其本身,使用(3)常量表達(dá)式
和(4)任何有效的計(jì)算表達(dá)方式時(shí),系統(tǒng)將為該字段重新命名一個(gè)字段名,這
個(gè)字段名通常沒(méi)有意義,這時(shí)可以在表達(dá)式中使用 AS 為字段重新命名,當(dāng)然對(duì)
字段名也可以通過(guò)使用 AS 為其重新命名。使用 AS 通常在需要使用字段名的場(chǎng)
合(在對(duì) HDR=NO 的 EXCEL 數(shù)據(jù)源更為常見(jiàn)),如我們前面提過(guò)的將字段名寫(xiě)入
第一行,也可用在多表查詢時(shí)簡(jiǎn)化構(gòu)造語(yǔ)句或者因特殊處理需要。后面我們或
許會(huì)看到有關(guān)的例子。AS 并不對(duì)查詢結(jié)果造成實(shí)質(zhì)影響。下面是使用 AS 的一個(gè)
例子:
  Sql = "Select 班級(jí),姓名 AS 名字,語(yǔ)文+數(shù)學(xué)+英語(yǔ) AS 總成績(jī) from [一年
級(jí)$]"
數(shù)據(jù)區(qū)域
請(qǐng)粘貼下面的過(guò)程:
Sub Ado2()  
  Dim cnn As New ADODB.Connection  
  Dim Sql As String  
  cnn.Open "Provider=Microsoft.Jet.OleDb.4.0;Extended
Properties=Excel 8.0;Data Source=" & ThisWorkbook.FullName  
  Sql = "Select * from [一班$]"  
  Sheet7.Cells.Clear  
  Sheet7.[a2].CopyFromRecordset cnn.Execute(Sql)  
  cnn.Close  
  Set cnn = Nothing  
End Sub  
數(shù)據(jù)區(qū)域可以是下列之一:
(1)當(dāng)要查詢的數(shù)據(jù)區(qū)域是從工作表的第一行、第一列開(kāi)始的整個(gè)表格時(shí),可
以使用[工作表名$]的形式
(2)如果不是(1)的情形,則需要使用[工作表名$區(qū)域范圍]的形式
    'A:C列
Sql = "Select * from [一班$A:C]"
  '《不規(guī)范表》的 A2:H19
  Sql = "Select * from [不規(guī)范表$A2:H19]"
上面兩中方式中的方括號(hào)和美元符號(hào)不能省略。
(3)如果工作表中定義了名稱,則可以直接使用名稱。
  '《不規(guī)范表》的 A2:H19 已經(jīng)定義名稱為 DATA
  Sql = "Select * from DATA"
(4)數(shù)據(jù)區(qū)域是多個(gè)區(qū)域的情況我們后面再講
,[]\使用 DISTINCT刪除重復(fù)記錄
《不規(guī)范表》的 K2:R24 區(qū)域有重復(fù)的記錄,如果希望重復(fù)的記錄只顯示一條,
可以使用 DISTINCT進(jìn)行限定。
  Sql = "Select distinct * from [不規(guī)范表$K2:R24]"
使用 Top 限制返回行數(shù) 如果記錄返回的行數(shù)比較多,可以使用 Top 限制返回的行數(shù),通常和后面介紹
的 Order by 排續(xù)配合使用。
下面語(yǔ)句返回前 20 條記錄。
  Sql = "Select top 20 * from [一班$]"
下面語(yǔ)句返回全部符合條件記錄的 1%。
  Sql = "Select top 1 percent * from [一班$]"
句法 2:Select 查詢表達(dá)式 From 數(shù)據(jù)區(qū)域 Where 條件表達(dá)式
在句法 1 的基礎(chǔ)上,通過(guò)使用 Where 可以設(shè)置查詢條件。
請(qǐng)粘貼下面的過(guò)程:
Sub Ado3()  
  Dim cnn As New ADODB.Connection  
  Dim Sql As String  
  cnn.Open "Provider=Microsoft.Jet.OleDb.4.0;Extended
Properties=Excel 8.0;Data Source=" & ThisWorkbook.FullName  
  Sql = "Select * from [一班$] where 性別='男'"  
  Sheet7.Cells.Clear  
  Sheet7.[a2].CopyFromRecordset cnn.Execute(Sql)  
  cnn.Close  
  Set cnn = Nothing  
End Sub  
查詢的條件表達(dá)式可以是:
(1)任何邏輯表達(dá)式
  '語(yǔ)文+數(shù)學(xué)成績(jī)大于 120 的男生
  Sql = "Select * from [一班$] where 性別='男'and 語(yǔ)文+數(shù)學(xué)>120"
  '語(yǔ)文或數(shù)學(xué)成績(jī)大于 80
  Sql = "Select * from [一班$] where 語(yǔ)文>80 or 數(shù)學(xué)>80"
(2)IN/NOT IN ( 表達(dá)式 1,表達(dá)式 2,…. )
注意上面的括號(hào)不可少,各表達(dá)式用逗號(hào)擱開(kāi)。
  '查詢姓名在括號(hào)中列出名單范圍內(nèi)的人
  Sql = "Select * from [一班$] where 姓名 in ('梁少娟','袁泳霞')"
將上面的 IN 換為 NOT IN 查詢范圍正好相反。
IN/NOT IN的另一種表達(dá)后面再講。
句法 3:Select 查詢表達(dá)式 From 數(shù)據(jù)區(qū)域 [Where 條件表達(dá)式] Order by 排
序字段
通過(guò)使用 Order by可以對(duì)查詢結(jié)果按一列或多列進(jìn)行排序。
請(qǐng)粘貼下面的過(guò)程:
Sub Ado4()  
  Dim cnn As New ADODB.Connection  
  Dim Sql As String  
  cnn.Open "Provider=Microsoft.Jet.OleDb.4.0;Extended
Properties=Excel 8.0;Data Source=" & ThisWorkbook.FullName  
  Sql = "Select * from [一班$] Order by 語(yǔ)文"  
  Sheet7.Cells.Clear  
  Sheet7.[a2].CopyFromRecordset cnn.Execute(Sql)    cnn.Close  
  Set cnn = Nothing  
End Sub  
再看幾個(gè)例子:  
'首先按語(yǔ)文成績(jī)降序排列,語(yǔ)文成績(jī)相同的按數(shù)學(xué)成績(jī)升序排列  
  Sql = "Select * from [一班$] Order by 語(yǔ)文 desc,數(shù)學(xué) asc"  
  '按三科成績(jī)之和排序  
  Sql = "Select * from [一班$] Order by 語(yǔ)文+數(shù)學(xué)+英語(yǔ) "  
ASC 是升序排列,在不指定排序方式的情況下是默認(rèn)的,因此可以省略。  

點(diǎn)擊這里給我發(fā)消息

7#
 樓主| 發(fā)表于 2015-1-10 13:28:46 | 只看該作者
獨(dú)樂(lè)樂(lè),不如眾樂(lè)樂(lè)。
8#
發(fā)表于 2015-1-10 14:31:24 | 只看該作者
1、這是比較早,也比較基礎(chǔ)的教程。主要圍繞著Recordset這個(gè)子集來(lái)講解,Connection部分講得很少!(dāng)然,我寫(xiě)的ADO教程則傾向于講全面一些,所以Recordset的一些方法都沒(méi)寫(xiě)出來(lái)(例如Find)。
2、CopyFromRecordset、Thisworkbook等等都僅限于Excel里使用。如果在access里,Connection部分直接可以使用CurrentProject.Connection就好。

點(diǎn)擊這里給我發(fā)消息

9#
發(fā)表于 2015-1-10 15:23:42 | 只看該作者
zhidao 發(fā)表于 2015-1-10 13:28
獨(dú)樂(lè)樂(lè),不如眾樂(lè)樂(lè)。

正是,幫助別人,就是自己再鞏固一次。謝謝分享!!
10#
發(fā)表于 2015-1-10 15:28:44 | 只看該作者
謝謝分享 正需要
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則

QQ|站長(zhǎng)郵箱|小黑屋|手機(jī)版|Office中國(guó)/Access中國(guó) ( 粵ICP備10043721號(hào)-1 )  

GMT+8, 2025-7-13 08:44 , Processed in 0.120911 second(s), 35 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回復(fù) 返回頂部 返回列表