第三个类,是数据库连接类,这个可以看做是负责最底层的数据库访问的一个对象,并不属于数据层. 它只是一个工具,而不涉及到任何关于数据库内容的逻辑.
再次重申一下,这三个类,只是在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