2010-01-14 1 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

ответ

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 возвращает набор записей для convience
  • OpenRS использует абсолютный путь в MapPath, устраняя таким образом сцепление включаемого с определенной папкой.
  • CloseRS теперь пояса и скобки
  • Завершить мероприятие, чтобы гарантировать, что набор записей и соединение закрыты, если потребительский код не может вызвать CloseRS.

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

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

+0

+1 для однократного улучшения. – Tester101

 Смежные вопросы

  • Нет связанных вопросов^_^