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)