注册 登录
编程论坛 ASP技术论坛

有个问题请高手解释一下!

ordosit 发布于 2008-10-04 16:12, 617 次点击
在写我的网站时遇到这样一个情况
就是我想统计数据库读取次数,而且呢当数据库有错误时进行详细提示,且简化代码,因为总是记不住set rs=???????
呵呵,于是想到了Function

与是在我自己写的类里面集成了这个Function

程序代码:
Public Function Open(rsName,sqlName,a,b)

         If Not IsObject(Conn) Then OpenConn
        IF CE_Clng(a) = 0 or CE_Clng(b) = 0 Then
        ErrMsg = "记录集打开参数错误"
        Call WriteErrMsg(0,-1,"")
        End IF
        IF sqlName = "" or IsNull(sqlName) Then
        ErrMsg = "所需打开记录集为空"
        Call WriteErrMsg(0,-1,"")
        End IF
        On Error Resume Next
        Set rsName = Server.CreateObject("Adodb.Recordset")
        rsName.Open sqlName,Conn,a,b
        If Err Then
            Set rsName = Nothing
            Conn.Close : Set Conn = Nothing
            Response.Write "<span style='font-size:14px;'>执行查询代码时发现错误。<br />"&sqlName&"</span>"
            ExecuteErr            
        Else
        SqlQueryNum=SqlQueryNum+1
        End IF

 End Function


然后我在测试时是这样
Set CE               = New CE_Cache  '这个是调入类的
Dim rs,sql
sql = "selec * from config"
CE.Open rs,sql,1,1
response.write rs(0)
测试后尽然通过
但是百思不得其解的是我在过程里截断看rsName是否有值时确看到是空值
但是语名是没问题,我就是不明白这里的rs如何传到函数内的!是直接将rsname替换为rs?
盼高手说原理
4 回复
#2
yms1232008-10-04 17:17
Set rsName = Server.CreateObject("Adodb.Recordset")
        rsName.Open sqlName,Conn,a,b
rs在执行到这句之前肯定是Nothing的空值。
#3
yms1232008-10-04 17:24
这里rsName和rs是引用关系,原因在于用普通类型的变量作参数时是传递副本到函数内,而用rs这类复合类型变量作参数传递到函数内的是引用。
比如
<script language="vbscript">
Class A
   Public Test
End Class
Function VarA(A)
   A=A+1
   MsgBox A
End Function
Function ClsA(A)
   A.Test=A.Test+1
   MsgBox A.Test
End Function
Dim VA,CA
VA=0
VarA VA
MsgBox VA
ClsA CA
MsgBox CA.Test
</script>
#4
ordosit2008-10-05 10:31
还是有点不明白,因为这个东西测试通过了,只是不知道为什么会成功
#5
multiple19022008-10-05 12:23
引用,就是说运行时函数里面的rsName跟输入的rs是一个东西,完全占一样的内存空间的东西。
你看你传进去的rs是什么,是一个新定义的空变量。于是刚刚传进去的rsName也是一个Nothing,于是在你Set rsName之前,rsName都是Nothing。
1