大家好,今天給繼續(xù)講解VBA數(shù)據(jù)庫解決方案的第15講:Recordset集合的單個(gè)數(shù)據(jù)精確處理,在前幾講中,我們講了對(duì)于Table的對(duì)象的添加和刪除。今天我們要講的內(nèi)容是Recordset集合的處理方案,這個(gè)處理和Table的處理是關(guān)系緊密的,在第10講中我們講了利用下面的語句實(shí)現(xiàn)Recordset集合內(nèi)容的可視化導(dǎo)出:Range("A2").CopyFromRecordsetrsADO,那么是否還有其他的辦法能精確的控制導(dǎo)出的內(nèi)容呢? 比如我只需要其中幾個(gè)字段的記錄,該如何處理呢?這時(shí)我們需要對(duì)Recordset集合的詳細(xì)的數(shù)據(jù)處理了,也就是說要通過循環(huán)語句把每一個(gè)數(shù)據(jù)都要遍歷到。 一 為了達(dá)到對(duì)Recordset集合數(shù)據(jù)的詳細(xì)處理,我們先看看記錄集的MoveFirs,MoveLast,MoveNext,MovePrevious系列的方法: 1 MoveFirst方法 作用是:將記錄指針移動(dòng)到記錄集中的第一條記錄。它以第一條記錄作為當(dāng)前記錄。 注意:當(dāng)記錄集為空時(shí),請(qǐng)求MoveFirst或MoveLast將產(chǎn)生一個(gè)錯(cuò)誤。 2 MoveLast方法 作用是:將記錄指針移動(dòng)到記錄集中的最后一條記錄。它以最后一條記錄作為當(dāng)前記錄。 注意:當(dāng)記錄集為空時(shí),請(qǐng)求MoveFirst或MoveLast將產(chǎn)生一個(gè)錯(cuò)誤。 注意:如果記錄集對(duì)象不支持書簽或不能向后移動(dòng)指針,那么將產(chǎn)生錯(cuò)誤。 3 MoveNext方法 作用是:將記錄指針移動(dòng)到記錄集中的下一條記錄。它以下一條記錄作為當(dāng)前記錄。 注意:當(dāng)當(dāng)前記錄指針位于最后一條記錄時(shí),如果你請(qǐng)求這個(gè)方法,將產(chǎn)生錯(cuò)誤。 4 MovePrevious方法 作用是:將記錄指針移動(dòng)到記錄集中的上一條記錄。它以上一條記錄作為當(dāng)前記錄。 注意:如果記錄集對(duì)象不支持書簽或不能向后移動(dòng)指針,那么將產(chǎn)生錯(cuò)誤。. 注意:當(dāng)當(dāng)前記錄為記錄集中第一條記錄時(shí),如果你請(qǐng)求該方法,那么它將產(chǎn)生一個(gè)錯(cuò)誤。 由此我們還要判斷記錄集是否為首位還要判斷,這時(shí)是通過般需要通過Recordset對(duì)象的EOF屬性先進(jìn)行判斷游標(biāo)是否到了記錄尾。當(dāng)游標(biāo)到了記錄尾時(shí),EOF屬性會(huì)被設(shè)置為True。 同理可以通過Recordset對(duì)象的BOF屬性先進(jìn)行判斷游標(biāo)是否到了記錄首。當(dāng)游標(biāo)到了記錄首時(shí),BOF屬性會(huì)被設(shè)置為True。 二今日要講的代碼就是利用上面的方法達(dá)到精準(zhǔn)控制記錄集導(dǎo)出,如下面的數(shù)據(jù)庫的數(shù)據(jù),我們要導(dǎo)出部門為“一廠”的職工目錄,該如何做到呢? 代碼如下: Sub mynzRSCT() Dim cnADO, rsADO As Object Dim strPath, strSQL As String Dim i As Integer Set cnADO = CreateObject("ADODB.Connection") Set rsADO = CreateObject("ADODB.RecordSet") strPath = ThisWorkbook.Path & "\mydata2.accdb" cnADO.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="& strPath strSQL = "SELECT * FROM 員工信息 WHERE 部門='一廠'" rsADO.Open strSQL, cnADO, 1, 3 For i = 0 To rsADO.Fields.Count - 1 Sheets("Sheet1").Cells(1, i + 1) = rsADO.Fields(i).Name Next i For i = 1 To rsADO.RecordCount For j = 0 To rsADO.Fields.Count - 1 Sheets("Sheet1").Cells(i + 1, j + 1) = rsADO.Fields(j) Next j rsADO.MoveNext Next i rsADO.Close cnADO.Close Set rsADO = Nothing Set cnADO = Nothing End Sub 代碼截圖: 代碼解析: 1 SetcnADO = CreateObject("ADODB.Connection") Set rsADO = CreateObject("ADODB.RecordSet") strPath = ThisWorkbook.Path & "\mydata2.accdb" cnADO.Open"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strPath 上述代碼先建立ADO 和RS 對(duì)象并打開 2 strSQL= "SELECT * FROM 員工信息 WHERE 部門='一廠'" rsADO.OpenstrSQL, cnADO, 1, 3 上述語句,建立一個(gè)SQL語句并打開 3 For i = 0 To rsADO.Fields.Count - 1 Sheets("Sheet1").Cells(1, i + 1) = rsADO.Fields(i).Name Next i 表頭計(jì)入 4 Fori = 1 To rsADO.RecordCount For j = 0 To rsADO.Fields.Count - 1 Sheets("Sheet1").Cells(i + 1, j + 1) = rsADO.Fields(j) Next j rsADO.MoveNext Next i 數(shù)據(jù)內(nèi)容計(jì)入,這個(gè)是今日內(nèi)容的重點(diǎn),這種方法的操作數(shù)據(jù)是一個(gè)一個(gè)計(jì)入的。對(duì)于記錄集的指針轉(zhuǎn)到下一個(gè)記錄一定要用rsADO.MoveNext 移動(dòng)記錄。 5 rsADO.Close cnADO.Close Set rsADO = Nothing Set cnADO = Nothing 關(guān)閉連接,釋放內(nèi)存。 看下面的輸出結(jié)果: 通過記錄集的精準(zhǔn)控制,可以完成具體到每個(gè)數(shù)據(jù)的判斷,應(yīng)用是非常靈活的, 今日內(nèi)容回向: 1 MoveFirs,MoveLast,MoveNext,MovePrevious 方法的意義是否理解呢? 2 如何實(shí)現(xiàn)記錄的精確控制? |
|