2010-01-14 2 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를 호출 할 때 연결 또는 레코드 세트를 전달하지 않습니다.

개체를 전달할 필요가 없으므로 개체 속성에 이미 액세스 할 수 있습니다.

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 now 벨트 및 중괄호
  • 소비 코드가 CloseRS를 호출하지 못하면 레코드 세트 및 연결을 보장하기 위해 종료 이벤트를 종료합니다.

편집

아마도 내가보다 그 사실 조금 더 "지금 벨트와 중괄호 클로저"에 자세히 설명한다. 원래는 Close이 불필요하거나 변수가 아무것도 설정되지 않았을 때 호출되지 않도록하려는 것 같습니다. 불행히도 Nothing으로 설정된 변수의 VarType은 여전히 ​​vbObject이므로 원래 코드에서 CloseRS이 이미 호출되었거나 OpenRS이 호출 된 적이 없다면 오류가 발생합니다.

+0

+1 한 장력에 +1. – Tester101