众所周知,Ado.net 中的断开式数据库连接是 Ado.ne t的一大特色,连接数据库,读取数据,断开数据库连接,使用数据。而在Ado中,通常是连接数据库,获取记录集,在记录集中循环中使用数据,断开数据库连接。这种两种方式的差异,和优劣,想必大家都明白,我就不浪费口舌了。
本文试图在 Asp 中简单地实现类似 Ado.net 的数据连接模式,连接数据,读取数据,断开数据库,使用数据。
模拟Ado.net, 本文使用 VBScript 简单实现DataAdapter, DataTable,DataRow,DataRowCollection,DataColumn,DataColumnCollection,DataCell,DataCellCollection 几个类。当然,功能不会像Ado.net那么强大和完善,但在概念上基本保持一致,并确实可以工作。
首先是 数据表——DataTable.
两个属性:数据表中的行集合——Rows
数据表中的列集合——Columns
一个方法:创建此数据表实例的新数据行——NewRow()
<%
''---------------------------------------------------------
'' ASP 数据表
''--------------------------------------------------------
Class DataTable
Public Name
private dataRows
private dataColumns
'构造函数
Private Sub Class_initialize
Set dataRows = new DataRowCollection
Set dataColumns = new DataColumnCollection
End Sub
'解析函数
Private Sub Class_terminate
End Sub
Public Property Get Rows
Set Rows = dataRows
End Property
Public Property Get Columns
Set Columns = dataColumns
End Property
''---------------------------新数据行-------------------
Public Function NewRow()
dim myRow
set myRow = new DataRow ''创建新行
For i=1 To dataColumns.Count ''为新行添加列
dim myCell
Set myCell = new dataCell
myCell.Name = dataColumns.Item(i).Name
myRow.Cells.Add(myCell)
Next
dataRows.Add(myRow) ''将新行添加到行集合中
Set NewRow = myRow
End Function
End Class
%>
其次是数据行——DataRow
只有一个属性:此数据行中的数据单元集合——Cells。
<%
''-------------------------------------------------------------
'' ASP 数据行
''--------------------------------------------------------------
Class DataRow
'构造函数
Private dataCells
Private Sub Class_initialize
Set dataCells = new DataCellCollection
End Sub
'解析函数
Private Sub Class_terminate
End Sub
Public Property Get Cells
Set Cells = dataCells
End Property
End Class
%>
然后是数据行集合——DataRowCollection
两个属性:行数,表示此集合中有多少行数据
<%
''---------------------------------------------
'' ASP 数据行集合
''----------------------------------------------
Class DataRowCollection
Private arrayRow()
'构造函数
Private Sub Class_initialize
Redim arrayRow(0)
End Sub
'解析函数
Private Sub Class_terminate
End Sub
Public Property Get Count
Count = UBound(arrayRow)
End Property
Public Default Property Get Item(index)
Set Item = arrayRow(index)
End Property
Public Function Add(aDataRow)
Redim Preserve arrayRow(UBound(arrayRow)+1) ''扩展数组
Set arrayRow(UBound(arrayRow)) = aDataRow ''加入数据行
Set Add = aDataRow
End Function
End Class
%>
接下来是数据列——DataColumn
只有一个字段:列名——Name
<%
''----------------------------------------------------
'' ASP 数据列
''----------------------------------------------------
Class DataColumn
'构造函数
Public Name
Private Sub Class_initialize
End Sub
'解析函数
Private Sub Class_terminate
End Sub
End Class
%>
下面是数据列集合——DataColumnCollection
一个属性:列数——Count
一个索引器: 集合中的项——Item
一个方法:添加列——Add
<%
''---------------------------------------------------
'' ASP 数据列集合
''----------------------------------------------------
Class DataColumnCollection
private arrayColumn()
'构造函数
Private Sub Class_initialize
Redim arrayColumn(0)
End Sub
'解析函数
Private Sub Class_terminate
End Sub
public Property Get Count
Count = (UBound(arrayColumn))
End Property
Public Default Property Get Item(index)
Set Item = arrayColumn(index)
End Property
Public Function Add(aDataColumn)
Redim Preserve arrayColumn(UBound(arrayColumn)+1) ''扩展数组
Set arrayColumn(UBound(arrayColumn)) = aDataColumn ''加入数据行
Set Add = aDataColumn
End Function
End Class
%>
下面是数据单元格——DataCell
只有两个字段:名称——Name,即列名
值——Value
<%
''---------------------------------------------------
'' ASP数据单元格
''-------------------------------------------------------
Class DataCell
'构造函数
Public Name
Public Value
End Class
%>
单元格集合——DataCellCollection
一个属性:数目——Count
一个索引器: 集合中的项——Item
一个方法:添加列——Add
<%
''-----------------------------------------------------------
'' ASP数据单元格集合
''
''------------------------------------------------------------
Class DataCellCollection
private arrayCell()
'构造函数
Private Sub Class_initialize
Redim arrayCell(0)
End Sub
'解析函数
Private Sub Class_terminate
End Sub
Public Default Property Get Item(indexORkey)
Dim index
If IsNumeric(indexORkey) Then
index = indexORkey
Else
For i=1 To UBound(arrayCell)
if arrayCell(i).Name = indexORkey Then
index = i
Exit For
End If
Next
End IF
Set Item = arrayCell(index)
End Property
Public Property Get Count
Count = UBound(arrayCell)
End Property
Public Function Add(aCell)
Redim Preserve arrayCell(UBound(arrayCell)+1) ''扩展数组
Set arrayCell(UBound(arrayCell)) = aCell ''加入数据行
Set Add = aCell
End Function
End Class
%>
最后是数据适配器——DataAdapter
一个字段:数据库连接字符串——ConnectString
两个方法:执行返回数据表的Sql命令——ExecuteSelect
返回受影响的行数的Sql命令——ExecuteCommand
执行返回数据表的存储过程——ExecuteProcedure
创建命令参数——CreateSqlParameter
<%
''-----------------------------------------------------------
'' ASP数据数据适配器
''
''------------------------------------------------------------
Class DataAdapter
Public ConnectString
''---------------------------------------------------------------
'' 执行返回数据表的选择命令
''---------------------------------------------------------------
Public Function ExecuteSelect(CommandText)
Dim myRecordSet
Dim myDataTable
Set myRecordSet = Server.CreateObject("ADODB.Recordset")
myRecordSet.ActiveConnection = ConnectString
myRecordSet.Source = CommandText
myRecordSet.CursorType = 0
myRecordSet.CursorLocation = 2
myRecordSet.LockType = 1
myRecordSet.Open()
Set myDataTable = FillTable(myRecordSet)
myRecordSet.Close()
Set myRecordSet = Nothing
Set ExecuteSelect = myDataTable
End Function
''--------------------------------------------------------------
'' 执行返回受影响的行数的数据库命令
''--------------------------------------------------------------
Public Function ExecuteCommand(CommandText)
Dim rowAffected
Set myCmd = Server.CreateObject("ADODB.Command")
myCmd.ActiveConnection = ConnectString
myCmd.CommandText = CommandText
myCmd.CommandType = 1
myCmd.Execute rowAffected
myCmd.ActiveConnection.Close
ExecuteCommand = rowAffected
End Function
''-------------------------------------------------------------
'' 执行存储过程
''-------------------------------------------------------------
Public Function ExecuteProcedure(ProcedureName, ParameterArray, TableName)
Dim myCmd
Set myCmd = Server.CreateObject("ADODB.Command")
myCmd.ActiveConnection = ConnectString
myCmd.CommandText = ProcedureName
myCmd.CommandType = 4
If null<>ParameterArray Then
For i=1 To ParameterArray.Count
myCmd.Parameters.Append myPara
Next
End If
Dim myDataTable
Dim myRecordSet
Set myRecordSet = myCmd.Execute
Set myDataTable = FillTable(myRecordSet)
myCmd.ActiveConnection.Close
Set ExecuteProcedure = myDataTable
End Function
Public Function CreateSqlParameter(name, type, direction, size, value)
Dim myCom
Dim myParam
Set myCom = Server.CreateObject("ADODB.Command")
Set myParam = myCom.CreateParameter(name, type, direction, size, value)
Set CreateSqlParameter = myParam
End Function
Private Function FillTable(myRecordSet)
''创建数据表
Dim myDataTable
Set myDataTable = new DataTable
''根据数据集的列集合创建数据表的集合
For i=0 To myRecordSet.Fields.Count-1
dim newColumn
Set newColumn = new DataColumn
newColumn.Name = myRecordSet.Fields(i).Name
myDataTable.Columns.Add(newColumn)
Next
''使用数据集的行填充数据表
myRecordSet.MoveFirst
If Not(myRecordSet.BOF OR myRecordSet.EOF) then
Do While Not myRecordSet.EOF
Dim newRow
Set newRow = myDataTable.NewRow()
For i=1 To newRow.Cells.Count
newRow.Cells.Item(i).Value=myRecordSet(newRow.Cells.Item(i).Name).Value
Next
myRecordSet.MoveNext
Loop
End If
Set FillTable = myDataTable
End Function
End Class
%>
以上是最简单的断开式数据连接实现。下面给出一个使用例子,也可以说是测试用例吧。
注意,测试的时候请修改您的数据库连接字符串。
将以上代码保存为文件AspAdo.asp
< %@LANGUAGE="VBScript" CODEPAGE="936"%>
<!--#include file="AspAdo.asp" -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>ASP数据集和适配器测试页</title>
</head>
<body>
<h4>ASP数据集和适配器测试页</h4>
<hr><br>
<%
''创建适配器
Dim myAdapter
Set myAdapter = New DataAdapter
''设置适配器数据库连接
myAdapter.ConnectString = Application("ConnStr") ''测试的时候请修改您的数据库连接字符串
''创建数据表
Dim myDataTable
''使用数据适配器执行SQL命令
Set myDataTable = myAdapter.ExecuteSelect("select top 5 p_id As ProductID,p_name As ProductName, p_pic As ProductPic from p_info order by p_id")
Call ShowDataTable(myDataTable)
Response.Write("<br>")
''创建数据表
Dim myDataTable2
''使用数据适配器执行SQL命令
Set myDataTable2 = myAdapter.ExecuteSelect("select * from news")
Call ShowDataTable(myDataTable2)
Response.Write("<br>")
''创建数据表
Dim myDataTable3
''使用数据适配器执行SQL命令
Set myDataTable3 = myAdapter.ExecuteSelect("select * from Soft")
''显示数据
Call ShowDataTable(myDataTable3)
''使用数据适配器执行SQL命令
myAdapter.ExecuteCommand("Update Shippers Set CompanyName='Federal Shipping' Where ShipperID=3")
''Response.Write("<br>")
''使用数据适配器执行SQL命令
Set myDataTable3 = myAdapter.ExecuteSelect("select * from Shippers")
''显示数据
Call ShowDataTable(myDataTable3)
''使用适配器执行存储过程
dim myParas
Set myParas = new Array(1)
Set myParas[1] = CreateSqlParameter("@ShipperID", 3, 1, 4, 2)
Set myDataTable3 = myAdapter.ExecuteProcedure("prShippersSelectAll", myParas, "ShipperTable")
''显示数据''
Response.Write("<br>")
Call ShowDataTable(myDataTable3)
%>
<%
Sub ShowDataTable(myDataTable)
Response.Write "<table cellspacing='1' cellpadding='4' bgcolor='#DDDDDD' style='font-size:12px'><tr>"
For i=1 To myDataTable.Columns.Count
Response.Write "<td bgcolor='#EEEEEE'>"
Response.Write myDataTable.Columns.Item(i).Name
Response.Write "</td>"
Next
Response.Write "</tr>"
For i=1 To myDataTable.Rows.Count
Response.Write "<tr>"
dim myRow
Set myRow = myDataTable.Rows.Item(i)
For j=1 To myRow.Cells.Count
Response.Write "<td bgcolor='#FFFFFF'>"
Response.Write myRow.Cells.Item(j).Value
Response.Write "</td>"
Next
Response.Write "</tr>"
Next
Response.Write "</table>"
End Sub
%>
</body>
</html>
以上代码在Windows Xp, IIS5.0上测试通过。欢迎提出您的批评和建议