第三个类,是数据库连接类,这个可以看做是负责最底层的数据库访问的一个对象,并不属于数据层. 它只是一个工具,而不涉及到任何关于数据库内容的逻辑.
   
   
    再次重申一下,这三个类,只是在ASP三层架构中的三大基本对象,象这种对象,我在具体的业务中还有更多的扩展,例如对file操作对象,excel操作对象,mail对象,cookie对象...
    这些封装固然看起来没什么技术含量,而且也可以简单地用函数来实现,但是在代码管理方面,就显得零散,没有被有机地统一.
    同一类业务处理,放在同一组对象里面,对象如何实现具体的业务不用外面关心,外界只需要通过对象找到方法进行调用,这是面向对象的基础,也是本系列的三层架构的基础,希望大家能慢慢习惯这种风格.
    ASP的三层架构里面虽然做不到处处皆对象,例如在UI层里面仍然是结构化的设计,但是涉及到业务逻辑和数据操作,就不再用分散的function,sub,而是一个个对象了. 通过各种对象之间的关系,来实现三层架构.
    依靠对象来操作,是三层架构的基础,所以这些基础函数,在这个架构里的封装是必要的.
   
   
    另外这个系列会比较长比较啰嗦,因为天才只是很少部分,要想通过几篇文章就把三层架构了解清楚,对我们普通人显然是不可能的.只有通过大量的细节的处理示范,才能够有效率地建立起三层架构的习惯和基本思想.
    虽然这套三层架构看起来简单,但是在研究过程中确实走了非常多的弯路.从最初了解面向对象,到了解class的使用;从只借用class的封装功能,到摸索出三层架构;从简单的参数传递,到应用实体类来传值;从简单的单个文件的各层实现,到复合型稍严谨的三层架构,每一步的改变不光是眼界的改变,更多的是一种实践的磨练过程.
    学习的过程是需要耐心和渐进的,为了大多数asp程序员有效地建立起三层架构的思考和习惯,我决定细化地进行分解说明,还望各位高手海涵.
   
   
    言归正传,回头来说Con_Data类.
    Con_Data类实例化名为Data,方法列表:

Data.OpenConnection(ByVal vConnectString)   打开数据库连接
    Data.CloseConnection()                      关闭数据库连接
    Data.GetOne (ByVal vSql)                    执行vSql获取一个值
    Data.GetRS (ByVal vSql)                     执行vSql获取一个Recordset
    Data.GetArray (ByVal vSql)                  执行vSql获取一个array
    Data.GetString(ByVal vSql,ByVal vColumnTag,ByVal vRowTag)  执行vSql获取一个字符串. vColumnTag为列分割符,vRowTag为行分隔符.例如直接输出user的列表:data.GetString("select * from [user] ","</td><td>","</td></tr></tr><td>")


    Data.Execute (ByVal vSql)                   执行vSql,返回true/false表示执行是否成功
    Data.ListOption(ByVal vSql , ByVal vValueField , ByVal vTitleField , ByVal vDefaultValue)  执行vSql,获取一个<option value=vValueField>vTitleField</option>列表,vDefaultValue为默认值. 本来想直接生成整个<select>控件,后来发现<select>里面很容易被加入一些定制的脚本,或者插入一些其他初始化的<option>列表,索性只通过data获取<option>列表,这样<select>就容易直接定制了.
   
    另外输出一个属性:
    Data.Conn 数据库连接,取代普通的Conn.例如 rs.open "select * from [user]",Data.Conn,1,1
   
   
    在页面的起初,调用方法Data.OpenConnection(ByVal vConnectString),初始化数据库连接,页面中的所有操作,都通过Data进行.
    下一章,给大家看一些其他的比较实用的通用类,慢慢地让大家熟悉封装的操作和习惯.
   
    Con_Data代码如下:
   
   

Class Con_Data
    ' ****** object
    Private Connection
    Private Recordset
    
    Private Sub Class_Initialize()
        Set Connection  = Server.CreateObject("ADODB.Connection")
        Set Recordset   = Server.CreateObject("ADODB.RecordSet")
    End Sub
    Private Sub Class_Terminate()
        me.CloseRecordset()
        Set Recordset = Nothing
        
        me.CloseConnection()
        Set Connection = Nothing
    End Sub
    
    
    Public Property Get Conn
        Set Conn = Connection
    end Property
    
    Public Property Get RS
        Set RS = Recordset
    end Property
    
' //
' basic operation 
' //
    Public Sub OpenConnection(ByVal vConnectString)
        if Connection.state=0 and trim(vConnectString)<>"" then
         Connection.open vConnectString
     end if
        
    End Sub
    
    Public Sub CloseConnection()
        If Connection.State <> 0 Then
            Connection.Close()
        End If
    End Sub    Public Sub CloseRecordset()
        If Recordset.State <> 0 Then
            Recordset.Close()
        End If
    End Sub
    
    
' //
' get value from db
' //
    ' **************************************************
    ' Get one value from a sql
    ' **************************************************
    Public Function GetOne (ByVal vSql)
        'e.debug vsql
        set Recordset = Connection.Execute (vSql)
        if Recordset.BOF and Recordset.EOF then
            GetOne = null
        else
            GetOne = Recordset(0)
        end if
    End Function
    
    
    ' **************************************************
    ' Get a recordset from a sql
    ' **************************************************
    Public Function GetRS (ByVal vSql)
        'e.w vSql
        set GetRS = Connection.Execute (vSql)
        'if Recordset.BOF and Recordset.EOF then
        '    GetRS = null
        'else
        '    set GetRS = Recordset
        'end if
    End Function
    
    
    
    
    
    ' **************************************************
    ' Get a array from a sql , if need set rows ,please use GetRS directly
    ' **************************************************
    Public Function GetArray (ByVal vSql)
        set Recordset = Connection.Execute (vSql)
        if Recordset.BOF and Recordset.EOF then
            GetArray = null
        else
            GetArray = Recordset.GetRows 
        end if
    End Function
    
    
    ' ***********************************
 ' Get Strings from recordset
 ' StringFormat
 ' NumRows
    ' ColumnDelimiter 
    ' RowDelimiter
    ' NullExpr  
    ' ***********************************
    Public Function GetString (ByVal vSql,ByVal vColumnTag,ByVal vRowTag)
        set Recordset = Connection.Execute (vSql)
        if Recordset.BOF and Recordset.EOF then
            GetString = ""
        else
            GetString = Recordset.GetString (,,vColumnTag,vRowTag,"")
        end if
    End Function
    
    
    
    
    ' **************************************************
    ' Execute a sql, return value = boolean
    ' **************************************************
    Public Function Execute (ByVal vSql)
        On Error Resume Next
        Connection.Execute (vSql)
        if err.number = 0 then
            Execute = true
        else
            Execute = false
        end if
        err.Clear 
    End Function
    
    
    ' //
'                   UI / SELECT options
' //  
    ' **************************************************
    ' Execute a sql, return value = boolean
    ' **************************************************
    Public Function ListOption (ByVal vSql , ByVal vValueField , ByVal vTitleField , ByVal vDefaultValue)
        dim strOption,rsOption
        set rsOption = Connection.Execute(vSql)
        if rsOption.State=0 then
            ListOption = ""
        else
            do while not rsOption.eof
                strOption = strOption & "<option value='"& rsOption(Convert.ToLng(vValueField)) &"'" 
                if rsOption(Convert.ToLng(vValueField)) = vDefaultValue then
                        strOption = strOption & " selected "
                    end if
                strOption = strOption & " >"& rsOption(Convert.ToLng(vTitleField)) &"</option>"
                rsOption.movenext
            loop
            ListOption = strOption
        end if
        set rsOption = nothing
        
    End Function


   
   
   
End Class