……從來(lái)沒(méi)有想過(guò)對(duì)不對(duì) 我的眼中裝滿疲憊 面對(duì)自己總覺(jué)得好累……
1,嗯哼?
諸君好,又見(jiàn)面了。女生擁抱男生握手。
要不要先講個(gè)小笑話,活躍下氛圍?畢竟下面兩個(gè)段落都是僵硬的概念,乏味的很哩。
——不聽(tīng)就算了。
打個(gè)響指,通過(guò)前面的章節(jié),我們已經(jīng)知道,查詢是SQL最頻繁也是最核心的語(yǔ)句;ADO對(duì)象與之相對(duì)應(yīng)的是記錄集的概念,所謂記錄集就是指從數(shù)據(jù)庫(kù)中檢索到的數(shù)據(jù)的集合,由記錄和字段兩個(gè)部分構(gòu)成。
通常有兩種方法創(chuàng)建查詢記錄集。
一種是我們前面講過(guò)的Connection對(duì)象的Execute方法。
Excel VBA ADO SQL入門教程022:Execute方法
另外一種就是我們今天要講的Recordset對(duì)象的Open方法。
2,一個(gè)例子
Recordset對(duì)象是ADO中最重要也是最常用的對(duì)數(shù)據(jù)庫(kù)數(shù)據(jù)進(jìn)行操作的對(duì)象;功能強(qiáng)大,屬性、方法和事件眾多;不過(guò)……放輕松,事件我們基本用不上,屬性和方法經(jīng)常用到的也不多,且大都易于理解和操作。
下面演示如何使用VBA代碼引用Recordset對(duì)象,并創(chuàng)建一個(gè)記錄集。
假設(shè)有一張工作表,名為“數(shù)據(jù)表”,內(nèi)容如下圖所示:
現(xiàn)在需要在“查詢”表里查詢年齡大于18歲的人員明細(xì)。查詢結(jié)果如下:
示例代碼如下:
Sub CreateRecordset()
Dim cnn As Object
Dim rst As Object
Dim strPath As String
Dim strSQL As String
Dim lngCount As Long
Dim i As Integer
Set cnn = CreateObject('ADODB.Connection')
Set rst = CreateObject('ADODB.RecordSet')
'----后期引用Recordset對(duì)象
strPath = ThisWorkbook.FullName
'----指定ADO連接的文件路徑(本工作簿)
cnn.Open 'Provider=Microsoft.ACE.OLEDB.12.0;' _
& 'Extended Properties=Excel 12.0;' _
& 'Data Source=' & strPath
strSQL = 'SELECT * FROM [數(shù)據(jù)表$] WHERE 年齡>18'
'----SQL語(yǔ)句
rst.Open strSQL, cnn, 1, 3
'----使用Open方法建立記錄集
Cells.ClearContents
For i = 0 To rst.Fields.Count - 1
'----遍歷讀取記錄集中的字段
Cells(1, i 1) = rst.Fields(i).Name
Next i
Range('A2').CopyFromRecordset rst
'----讀取記錄集中的記錄
lngCount = rst.RecordCount
'----記錄的數(shù)目
MsgBox '共查詢到:' & lngCount & '條記錄。'
rst.Close
cnn.Close
Set rst = Nothing
Set cnn = Nothing
End Sub
3,Open方法
上述代碼首先使用Connection對(duì)象建立和代碼所在工作簿的連接,然后使用Recordset對(duì)象的Open方法創(chuàng)建查詢記錄集。
Open語(yǔ)法格式如下:
recordset.Open Source, ActiveConnection, CursorType, LockType, Options
示例語(yǔ)句如下:
rst.Open strSQL, cnn, 1, 3
參數(shù)Source是可選的,可以是Command對(duì)象、SQL語(yǔ)句、數(shù)據(jù)庫(kù)的表名等。對(duì)我們而言,通常就是SQL語(yǔ)句。
參數(shù)ActiveConnection是可選的,用于指定Connection對(duì)象變量名;字符串或包含ConnectionString的參數(shù)。對(duì)我們而言,通常也就是Connection對(duì)象。
參數(shù)CursorType是可選的,用于指定當(dāng)打開(kāi)Recordset時(shí)提供者應(yīng)使用的游標(biāo)類型,其值可以是下表所列舉的常量之一。作為新手,固定使用AdOpenKeyset(值為1)即可。
參數(shù)Options是可選的,表示提供者如何計(jì)算Source參數(shù)(如果它代表的不是Command對(duì)象),或者從以前保存Recordset的文件中恢復(fù)Recordset。該參數(shù)可以是一個(gè)或多個(gè)CommandTypeEnum值或ExecuteOptionEnum值——這廝我們一般用不上,可以假裝生命中沒(méi)有它。
小貼士:
使用CreateObject函數(shù)后期綁定ADO類庫(kù)時(shí),ADO對(duì)象的相關(guān)參數(shù)不能使用常量名稱,只能使用參數(shù)的值。例如,示例代碼中使用以下語(yǔ)句會(huì)造成程序運(yùn)行錯(cuò)誤。
rst.Open strSQL, cnn, AdOpenKeyset, AdLockOptimistic
4,F(xiàn)ields集合
上述代碼的以下部分將記錄集中的字段名寫入工作表。
For i = 0 To rst.Fields.Count - 1
Cells(1, i 1) = rst.Fields(i).Name
Next i
rst.fields返回Recordset對(duì)象的Fields集合,該集合包含了和當(dāng)前記錄集有關(guān)的所有字段。
rst.Fields.Count返回字段的數(shù)量。
rst.Fields(0).Name表示記錄集的第1個(gè)字段的標(biāo)題名,也就是“編號(hào)”。
rst.Fields(0).Value表示記錄集第1個(gè)字段的當(dāng)前記錄,也就是100007……除了使用索引法,也可以使用rst.Fields('編號(hào)').Value來(lái)返回指定字段當(dāng)前的記錄。
5,RecordCount
rst.RecordCount返回Recordset對(duì)象中的記錄數(shù)目。通過(guò)它,我們可以判斷是否存在符合條件的查詢結(jié)果。
小貼士:
還記得嗎?在Connection的Execute那一節(jié),我們特別說(shuō)明過(guò),Execute方法返回的記錄集無(wú)法使用RecordCount屬性得到正確的結(jié)果,原因是……不記得了?那就倒帶重看吧。
6,CopyFromRecordset
以下代碼將記錄集中的記錄復(fù)制到工作表左上角為A2單元格的區(qū)域
Range('A2').CopyFromRecordset rst
CopyFromRecordset是Excel Range對(duì)象的方法,用于將記錄集中的記錄復(fù)制到單元格區(qū)域。我們之前的代碼常用它,但一直沒(méi)抓到機(jī)會(huì)詳細(xì)介紹,這兒一并說(shuō)了。
其語(yǔ)法格式如下:
Range.CopyFromRecordset(Data,[MaxRows],[MaxColumns])
參數(shù)Data是必需的,表示復(fù)制到指定區(qū)域的Recordset對(duì)象。
參數(shù)MaxRows是可選的,表示復(fù)制到工作表的記錄個(gè)數(shù)上限。如果忽略該參數(shù),將復(fù)制所有記錄。比如,記錄集有10條記錄,我們只需要前5條,代碼如下:
Range('A2').CopyFromRecordset rst , 5
參數(shù)MaxColumns是可選的,表示復(fù)制到工作表的字段個(gè)數(shù)上限。如果忽略該參數(shù),將復(fù)制所有字段。
后面兩個(gè)可選的參數(shù),雖然有用,但實(shí)際用到的情況并不多,So——僅供了解先。
……
……
The End
聯(lián)系客服