2010-01-14 38 views
1

我想要在很多頁面上使用的對象包含自己的連接和記錄集變量,以便它們不需要在每個想要直接訪問記錄集的頁面上聲明,而不需要進行交互與通常處理這個對象的功能。VBScript類/對象問題

但是,記錄集顯然不成爲對象。

<!-- 
METADATA 
TYPE="TypeLib" 
NAME="Microsoft ActiveX Data Objects 2.5 Library" 
UUID="{00000205-0000-0010-8000-00AA006D2EA4}" 
--> 

而且

<% 
Option Explicit 
Class cls 
Public conn 
Public rs 

Public Sub OpenRS(ByRef conn, ByRef rs, ByRef sql, ByRef Mode, 
        ByRef CursorType, ByRef LockType) 
    Set conn = Server.CreateObject("ADODB.Connection") 
    conn.Provider = "Microsoft.Jet.OLEDB.4.0" 
    conn.Mode = Mode 
    conn.Open = Server.MapPath(".") & "\mb\testdb.mdb" 
    Set rs = Server.CreateObject("ADODB.Recordset") 
    rs.CursorType = CursorType 
    rs.LockType = LockType 
    rs.ActiveConnection = conn 
    rs.Open sql 
End Sub 
Public Sub CloseRS(ByRef conn, ByRef rs) 
    If VarType(rs) = vbObject Then rs.Close 
    Set rs = Nothing 
    If VarType(conn) = vbObject Then conn.Close 
    Set conn = Nothing 
End Sub 
Private Sub Class_Initialize() 
    Set conn = Nothing 
    Set rs = Nothing 
End Sub 
End Class 

Dim a: Set a = New cls 
a.OpenRS a.conn,a.rs, "SELECT * FROM emp", 
     adModeRead, adOpenForwardOnly, adLockPessimistic 
Response.Write(a.rs.EOF) 
%> 
+0

OpenRS過程創建連接和記錄集,那麼爲什麼你將它們作爲參數傳遞?嘗試不傳遞連接或記錄集,只傳遞sql,cursortype和locktype。 – Tester101 2010-01-14 14:52:16

回答

0

儘量不傳遞rs參數:

Public Sub OpenRS(ByRef conn, ByRef sql, ByRef Mode, 
        ByRef CursorType, ByRef LockType) 
    Set conn = Server.CreateObject("ADODB.Connection") 
    conn.Provider = "Microsoft.Jet.OLEDB.4.0" 
    conn.Mode = Mode 
    conn.Open = Server.MapPath(".") & "\mb\testdb.mdb" 
    '' // will set public property, not that old parameter 
    Set rs = Server.CreateObject("ADODB.Recordset") 
    rs.CursorType = CursorType 
    rs.LockType = LockType 
    rs.ActiveConnection = conn 
    rs.Open sql 
End Sub 

像這樣

a.OpenRS a.conn, "SELECT * FROM emp", 
     adModeRead, adOpenForwardOnly, adLockPessimistic 
0

這對我的作品的使用。注意在調用OpenRS時,我沒有傳遞連接或記錄集。

Class cls 
    Public conn 
    Public rs 

    Public Sub OpenRS(ByRef sql, ByRef Mode, ByRef CursorType, ByRef LockType) 
     Set conn = Server.CreateObject("ADODB.Connection") 
     conn.Provider = "Microsoft.Jet.OLEDB.4.0" 
     conn.Mode = Mode 
     conn.Open = Server.MapPath(".") & "\mb\testdb.mdb" 
     Set rs = Server.CreateObject("ADODB.Recordset") 
     rs.CursorType = CursorType 
     rs.LockType = LockType 
     rs.ActiveConnection = conn 
     rs.Open sql 
    End Sub 

    Public Sub CloseRS(ByRef conn, ByRef rs) 
     If VarType(rs) = vbObject Then rs.Close 
     Set rs = Nothing 
     If VarType(conn) = vbObject Then conn.Close 
     Set conn = Nothing 
    End Sub 

    Private Sub Class_Initialize() 
     Set conn = Nothing 
     Set rs = Nothing 
    End Sub 
End Class 


Set a = New cls 
a.OpenRS "SELECT * FROM emp", adModeRead, adOpenForwardOnly, adLockPessimistic 

您不必傳遞它自己的屬性的對象,它已經有權訪問它們。

2

我的版本: -

Option Explicit 
Class RSManager 
    Private conn 
    Private rs 

    Public Property Get RecordSet() 
    Set RecordSet = rs 
    End Property 

    Public Function OpenRS(ByVal sql, ByVal Mode, 
        ByVal CursorType, ByVal LockType) 
    Set conn = Server.CreateObject("ADODB.Connection") 
    conn.Provider = "Microsoft.Jet.OLEDB.4.0" 
    conn.Mode = Mode 
    conn.Open = Server.MapPath("/App_Data") & "\mb\testdb.mdb" 

    Set rs = Server.CreateObject("ADODB.Recordset") 
    rs.CursorType = CursorType 
    rs.LockType = LockType 
    rs.ActiveConnection = conn 
    rs.Open sql 
    Set OpenRS = rs 
    End Sub 

    Public Sub CloseRS() 
    If Not rs Is Nothing Then 
     If rs.State = adStateOpen Then rs.Close 
     Set rs = Nothing 
    End If 
    If Not conn Is Nothing Then 
     If conn.State = adStateOpen Then conn.Close 
     Set conn = Nothing 
    End If 
    End Sub 

    Private Sub Class_Initialize() 
    Set conn = Nothing 
    Set rs = Nothing 
    End Sub 

    Private Sub Class_Terminate() 
    CloseRS 
    End Sub 
End Class 

Dim RSMEmp: Set RSMEmp = New RSManager 
Dim rs : Set rs = RSMEMp.OpenRS "SELECT * FROM emp", 
    adModeRead, adOpenForwardOnly, adLockPessimistic 

Response.Write(rs.EOF) 

注: -

  • 連接現在是私人和訪問內部記錄是隻讀的。
  • OpenRS不依賴於呼叫者在其自身的成員通過用於分配
  • OpenRS返回便於學習記錄
  • OpenRS使用絕對路徑中的MapPath,從而消除了與特定的文件夾中包括的耦合。
  • CloseRS現在腰帶和大括號
  • 終止事件添加,以確保記錄集和連接關閉,如果消費代碼未能調用CloseRS。

編輯

也許我應該詳細說明「閉門現在腰帶和揹帶」比其更實際一點。原始似乎試圖確保Close不必在不必要時或當變量設置爲無。不幸的是,設置爲Nothing的變量的VarType仍然是vbObject,因此在調用時原始代碼已被調用,或者從未調用過OpenRS會導致錯誤。

+0

+1爲單挑戰。 – Tester101 2010-01-14 16:02:04