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