技術(shù) 點(diǎn)
- 技術(shù)
- 點(diǎn)
- V幣
- 點(diǎn)
- 積分
- 144710

|
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é)
果。
|
|