ASP.NET高级应用(2)

三层结构及其应用
  
  
  概念及环境
  
  
  ASP.NET中的三层结果开发方法,其实其思想跟Java的一样。Java中的三层架构为前端的htmlJspServlet,中间层为JavaBeanEJB,后面为数据库服务器。而在ASP.NET中,前段为htmlaspaspx等,中间层为有.vb.cs等文件编译而成的.dll控件,后面为数据库服务器。
  
  
  在我们的三层架构中,我们的数据库层通过中间层来连接以及操作,前端给中间层传递参数,并接受中间层的参数。在我们的ASP.NET中,我们主要关注的是我们的中间层与前端的数据交互。
  
  
  我们一般统称中间层为组件,组件可以用.vb编译而成,也可以用.cs文件编译而成。中间层一般为.dll文件。微软的.NET技术在这个方面比他的以前的任何版本都要来的简单,这也是它的一打好处之一。以前我们要注册一个.dll文件,有是注册有是重启动,而在.net上,我们的.dll文件拿来就用,不用再考虑注册的问题。
  
  
  在没有Visual stutio.net之前,我们用写成的.bat文件来把.vb.cs文件编译成.dll文件,在.bat文件里,我们写入编译的文件名称、相关联的名字空间、要编译成的文件名以及对应的命令名称,然后运行就行了。听起来很复杂,这也是很多初学者在编译第一个.dll文件时所害怕的事情。但是做起来很简单的。下面我们举一个例子来说明.bat文件的写法,假设我们有一个文件名为:saidy.vb的文件,我们要把它编译成saidy.dll的文件,其中用到SystemSystem.DataSystem.Data.SQL名字空间,我们可以创建一个dblink.bat文件,内容如下:
  
  
  vbc /out:..\bin\saidy.dll /t:library /r:system.dll /r:system.data.dll / r:system.data.sql.dll
  
  
  dblink.vb
  
  
  这是编译.vb程序的命令,如果是编译.cs文件,则命令会是不一样,我们假定有一个saidy.cs的文件,按照上面的要求,我们编译如下:
  
  
  cs /out:..\bin\saidy.dll /t:library /r:system.dll /r:system.data.dll / r:system.data.sql.dll
  dblink.cs
  
  
  我们可以看出来,大部分是一样的。
  
  
  当然,如果我们有微软公司的vs.net编程环境,则我们不用这么麻烦,我们可以象编译vb或者vc程序一样方便的编译.dll文件。微软公司的vs.net是一个集大成者,把各种语言整合起来,在这个环境下都可以写出不同语言的程序。具体的应用我们会在专门的章节上介绍的。
  
  
  一个基于三层架构的例子
  
  
  我们通过具体的例子来说明三层架构的应用,我们建一个小项目来说明这个问题。有时为了安全性,我们通常把与数据库的连接用一个动态连接库文件封装起来,这样我们就要把写数据库连接的.vb或者.cs文件编译成动态连接库.dll文件。甚至我们把对数据库的相关操作页编译成.dll文件。
  
  
  下面是我们的与数据库连接以及操作的文件dblink.vb的主要部分,对数据库的连接:
  
  
   Dim dbl As SQLConnection
  
  
  对数据库的操作,我们把它写在一个方法里面,在返回相应值:
  Function getdata() as DataView
  Dim sComm as SQLDataSetCommand
  Dim sDS as DataSet
  Dim sStr as String
  dbl = New SQLConnection("server=localhost;uid=sa;password=;database=howff")
  sStr = "select * from color"
  sComm = new SQLDataSetCommand(sStr,dbl)
  sDS = new DataSet()
  sComm.FillDataSet(sDS,"color")
  Return sDS.Table["color"].DefaultView
  End Function
  
  
  
  
  我们第六个语句就用到上面的与数据库的连接变量,我们这个函数的功能是从表"color"中选出所有的元素,并返回表结构的形式。完整的代码如下:
  
  
  Imports System
  Imports System.Data
  Imports System.Data.SQL
  '
创建名字空间
  Namespace db
  '
创建一个类
  Public Class dblink
  '
建立数据库的连接
  Dim dbl As SQLConnection
  '
方法
  Public Function getdata() As DataView
  Dim sComm As SQLDataSetCommand
  Dim sDS As DataSet
  dbl = New SQLConnection("server=localhost;uid=sa;password=;database=howff")
  Dim sStr As String
  sStr = "select * from color"
  sComm = New SQLDataSetCommand(sStr, dbl)
  '
填充数据
  sDS = New DataSet()
  sComm.FillDataSet(sDS, "color")
  '
返回
  Return sDS.Tables("color").DefaultView
  End Function
  End Class
  End Namespace
  
我们再写一个前端掉用页面saidy.aspx,我们首先要引入我们创建的名字空间:
  
  
%@ Import Namespace="db" %
  
  
在页面装入的时候,我们用此方法:
  Sub Page_Load(Sender As Object, E As EventArgs)
  '
建立一个新的对象
  Dim newdb As dblink
  newdb = new dblink()
  '
数据来源
  Products.DataSource = newdb.getdata()
  '
数据绑定
  Products.DataBind()
  End Sub
  
下面看看我们完整的代码(advanceapp\dblink.aspx)
  
%@ Import Namespace="db" %
  
html
  
script language="VB" runat="server"
  Sub Page_Load(Sender As Object, E As EventArgs)
  '
建立一个新的对象
  Dim newdb As dblink
  newdb = new dblink()
  '
数据来源
  Products.DataSource = newdb.getdata()
  '
数据绑定
  Products.DataBind()
  End Sub
  
/script
  
body style="font: 10pt verdana" bgcolor="CCCCFF"
  
BR><BR><BR
  
CENTER
  
h3.NET->三层架构!</h3
  
/CENTER
  
BR><BR
  
CENTER
  
ASP:DataList id="Products" ShowHeader=false ShowFooter=false RepeatColumns="2" RepeatDirection="horizontal" BorderWidth=0 runat="server"
  
template name="itemtemplate"
  
table
  
tr
  
td width="150" style="text-align:center; font-size:8pt; vertical-align:top;
  height:50"

  
p
  
%# DataBinder.Eval(Container.DataItem, "id") % br
  
%# DataBinder.Eval(Container.DataItem, "name", "{0:C}").ToString() %
  
/td
  
/tr
  
/table
  
/template
  
/ASP:DataList
  
/CENTER
  
/body
  
/html
  
  
  我们看到,在这个页面当中,没有出现与数据库交互的语句,这样我们就很好的把数据操作封装起来了