在Asp中使用断开式数据库连接

众所周知,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上测试通过。欢迎提出您的批评和建议

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值