敲執行個體4遇到問題的思考,多一個new大有學問。
在記憶體中分配空間的時間和執行個體化的時間不同:
對於Dim objRs as new RecordSet,當第一次使用objRs的時候,才在記憶體中分配空間和執行個體化。
對於Dim objRs as RecordSet,聲明objRs為RecordSet類類型變數,和聲明普通變數一樣,此時已經在記憶體中分配儲存空間了。當使用Set objRs=new RecordSet時,才被執行個體化。
雖然這兩種定義方式,在分配空間和執行個體化的時間上不同,但是有時卻不影響結果;然而有時也會相差甚遠。
結果相同的情況:
通常在表單的通用聲明段Dim objRs as new RecordSet,這和在表單的通用聲明段用Dim objRs as RecordSet,並且在Form_Load事件中用Set objRs=new RecordSet,得到的記錄集以及之後對記錄集做相應的處理,結果都是相同的。
Dim objRs As New Recordset, objCn As New Connection, intPage As Integer
和
Dim objRs As Recordset
Private Sub Form_Load()'在表單事件中執行個體化objRsSet objRs=New Recordset
當在Click事件中,操作objRs,結果都是相同的(假設objRs是已經開啟的遊標)
'使目前記錄的位置為下一條記錄的位置Private Sub cmdNext_Click() objRs.MoveNext If objRs.EOF Then objRs.MoveLastEnd Sub
結果不同的情況:
當Set objRs=new RecordSet這條語句放在允許被重複調用的過程中時,結果就會相差甚遠。
Dim objDataSource As New Recordset
定義在表單各事件程序中使用的公用變數
Set objRs=new RecordSet出現在下面這個過程中,這個過程作用是把objRs(假設objRs是開啟的記錄集)的當前頁寫入objDataSource這個對象中,以便在DataGrid中顯示。
Public Sub ShowData(ByVal intPage As Integer) '實現分頁顯示記錄功能 Dim intPageCount As Integer, intRecord As Integer Dim objDataSource As New Recordset '建立一個局部Recordset對象儲存objRs目前記錄頁資料 For intRecord = 0 To objRs.Fields.Count - 1 objDataSource.Fields.Append objRs.Fields(intRecord).Name, _ adVarChar, _ objRs.Fields(intRecord).DefinedSize Next objDataSource.Open '開啟局部Recordset對象 objRs.PageSize = Val(txtPageSize) '重新設定objRs每頁顯示的記錄條數 objRs.AbsolutePage = intPage '重新設定objRs的目前記錄頁 For intRecord = 1 To objRs.PageSize '將objRs目前記錄頁中資料寫入objDataSource objDataSource.AddNew objDataSource!使用者名稱 = objRs!使用者名稱 objDataSource!口令 = objRs!口令 objDataSource!身份 = objRs!身份 objRs.MoveNext If objRs.EOF Then Exit For Next Set DataGrid1.DataSource = objDataSource '將objDataSource設定為資料格的資料來源 txtPageMsg = intPage & "/" & objRs.PageCount '重新整理目前記錄頁資訊End Sub
每執行一次這個過程,Set objRs=new RecordSet就產生一個對象,當再次執行這個過程時,又會新產生一個對象,並且把原有的對象覆蓋掉。如果把這條語句換成在表單通用聲明段的Dim objRs as new RecordSet,則第二次調用這個過程時,就出錯,因為始終用的是一個對象。