VBScript Класс / Объектная Проблема - PullRequest
1 голос
/ 14 января 2010

Мне бы хотелось, чтобы объект, который используется на многих страницах, содержал свои собственные переменные соединения и набора записей, чтобы их не нужно было объявлять на каждой странице, которая хочет иметь прямой доступ к набору записей, а не взаимодействовать с функциями объект, который обычно обрабатывает это.

Однако набор записей, по-видимому, не становится объектом.

<!--
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)
%>

Ответы [ 3 ]

2 голосов
/ 14 января 2010

Моя версия: -

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.

Редактировать

Может быть, мне стоит остановиться на "CloseRS теперь ремни и брекеты", на самом деле это немного больше. Похоже, что оригинал пытается гарантировать, что Close не будет вызвано, когда в этом нет необходимости или когда для переменной задано нулевое значение. К сожалению, VarType переменной, установленной на Nothing, по-прежнему vbObject, следовательно, в исходном коде, вызывающем CloseRS, когда он уже был вызван или OpenRS никогда не вызывался, приведет к ошибке.

0 голосов
/ 14 января 2010

Это работает для меня. Обратите внимание, что я не передаю соединение или набор записей при вызове 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

Вам не нужно передавать объекту его собственные свойства, он уже имеет к ним доступ.

0 голосов
/ 14 января 2010

Постарайтесь не передавать этот 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
...