Asp classic VBScript类/对象问题

Asp classic VBScript类/对象问题,asp-classic,vbscript,ado,Asp Classic,Vbscript,Ado,我希望在许多页面上使用一个对象来包含它自己的连接和记录集变量,这样它们就不需要在每个希望直接访问记录集的页面上声明,而不需要与通常处理此操作的对象的函数交互 然而,记录集显然没有成为一个对象 <!-- METADATA TYPE="TypeLib" NAME="Microsoft ActiveX Data Objects 2.5 Library" UUID="{00000205-0000-0010-8000-00AA006D2EA4}" --> 及 尽量不要传递rs参数: Pu

我希望在许多页面上使用一个对象来包含它自己的连接和记录集变量,这样它们就不需要在每个希望直接访问记录集的页面上声明,而不需要与通常处理此操作的对象的函数交互

然而,记录集显然没有成为一个对象

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


尽量不要传递
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

这对我有用。请注意,调用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
您不必将对象传递给它自己的属性,它已经可以访问它们。

我的版本:-

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中使用绝对路径,从而消除了包含和特定文件夹的耦合
  • 闭合器现在是皮带和支架
  • 添加Terminate事件,以确保在使用代码无法调用Closer时记录集和连接已关闭
编辑


也许我应该详细说明一下“现在的闭门器、皮带和支架”,其实比这个要多一些。原始版本似乎试图确保
Close
在不必要或变量设置为nothing时不会被调用。不幸的是,设置为
Nothing
的变量的VarType仍然是
vbObject
,因此在原始代码中调用
closer
时,如果已经调用或从未调用过
OpenRS
将导致错误。

OpenRS过程创建连接和记录集,那你为什么要把它们作为论据来传递呢?尝试不传递连接或记录集,只传递sql、cursortype和locktype。
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)