元件开发的步骤
步骤一:定义元件的函式签名
在这个范例中,我们将设计一个协助你存取资料的类别DataHelp,这个类别所属的命名空间为MyUtil。DataHelp类别中包含两个Method,EmpList,可回传pubs资料库employee资料表中的员工清单。另一个Method,SelectEmployee则可回传特定使用者的所有栏位资料。所以由图一,我们可以大概了解此元件的结构,从列表一看到EmpList的函式签名。
namespace MyUtil{
public class DataHelp {
public DataSet EmpList() {
}
public DataSet SelectEmployee(string empid) {
}
}
}
列表一:EmpList的函式签名。
步骤二:撰写元件程式码
接下来你可以使用Notepad.exe或任何文字处理软体编辑程式,在此将此类别的程式档案命名为DBHelp.cs。以下是DBHelp.cs程式码的完整列表。
//DBHelp.cs元件程式列表
using System;
using System.Data;
using System.Data.SQL;
namespace MyUtil {
public class DataHelp {
public DataSet EmpList() {
// 建立 Connection物件的复本
SQLConnection myConnection = new
SQLConnection("server=localhost;uid=sa;pwd=;database=pubs");
//建立Command物件的复本
SQLDataSetCommand myCommand = new
SQLDataSetCommand("select * from employee" , myConnection);
// 建立DataSet
DataSet myDataSet = new DataSet();
myCommand.FillDataSet(myDataSet, "EmpList");
// 回传 DataSet
return myDataSet;
}
public DataSet SelectEmployee(string empid) {
// 建立 Connection物件的复本
SQLConnection myConnection = new
SQLConnection("server=localhost;uid=sa;pwd=;database=pubs");
//建立Command物件的复本
SQLDataSetCommand myCommand = new
SQLDataSetCommand("select * from employee where emp_id ='" + empid + "'" , myConnection);
// 建立DataSet
DataSet myDataSet = new DataSet();
myCommand.FillDataSet(myDataSet, "MyEmp");
// 回传 DataSet
return myDataSet;
}
}
}
列表二:DBHelp.cs程式码的完整列表
我们深入地探讨一下DBHelp.CS程式码。程式一开始我们可以使用Using的宣告告诉编译器欲使用到系统提供的System类别。由於元件将透过ADO+存取资料库的资料,因此得再宣告使用DATA与DATA.SQL两个类别。
接下来,宣告一个类别(Class),名称为DataHelp,这个名称可以随你高兴自行设定。Public 代表的意义是所有的人都可以不受限制地存取这个class。
类别中包含程式将用来执行的资料与方法(method)定义。这个类别的名称不一定要和元件程式码的档案名称一致。类别的开始与结束则使用大括号来代表「{ }」。在这行程式中这个特定的类别并没有包含资料,不过它拥有两个方法(method),这两个方法定义了这个类别的行为(behavior),分别是EmpList与SelectEmployee。
我们先谈谈EmpList Method,在这个Method我们要透过ADO+连结到SQL Server的资料库,将Pubs资料库中的employee资料表所包含的资料查询出来。一开始先透过ADO+的SQLConnection物件建立一条到资料库的连线,连线的名称为myConnection:
SQLConnection myConnection = new
SQLConnection("server=localhost;uid=sa;pwd=;database=pubs");
连线字串每个部份分别为:
server:欲连结的资料库伺服器名称,localhost代表本机。
uid:资料库的使用者帐户名称。
pwd:密码。
database:欲连结的资料库名称,本范例使用SQL Server内建的资料库pubs。
欲存取资料库的资料,可使用ADO+的SQLDataSetCommand物件,在此命名为myCommand,并由上述开启的连线,使用T-SQL指令,指明欲进行的资料存取操作:
SQLDataSetCommand myCommand = new SQLDataSetCommand("select * from employee" , myConnection);
在此范例中,欲将employee资料表的所有资料查询出来,然後以表格列表之。我们希望资料能透过快取中的Dataset物件回传,所以透过下面的程式码,建立一个新的DataSet物件,命名为myDataSet,然後FillDataSet Method将资料库中的资料填入快取中的DataSet物件内,并为其取一个名称EmpList:
DataSet myDataSet = new DataSet();
myCommand.FillDataSet(myDataSet, "EmpList");
同理,第二个Method,SelectEmployee的主要目的是希望能够传入员工的代号,然後查询出此员工的所有资料。仔细观察此Method,它和EmpList的语法几乎没有太大的差别,唯一的不同处是在於这个Method会传入一个资料型态为字串的员工代号,因此传入了一个empid字串参数:
public DataSet SelectEmployee(string empid) { }
第二个不同点则是在下T-SQL查询指令时,透过字串连结组成真正要传送到後端资料库的查询指令:
select * from employee where emp_id ='" + empid + "'"
此类别的撰写工作已告完成,接下来就可以将此程式编译成DLL。为了方便说明起见,我将此程式的原始程式码存放在Inetpub\wwwroot目录之下,另外得要在此目录下建立一个子目录bin以存放元件档案。在执行时期,ASP+会自动搜寻位於bin目录下的DLL档案,然後载入一份此档案的复本执行。因此要进行编译之前,您要先确认上述两个要点都已经确切地完成了。
编译程式码
欲编译程式,可透过CSC.exe进行编译。在Command Prompt下达编译指定:
csc /out:./bin/DBHelp.dll /t:library /r:System.Data.dll DBHelp.cs
由於编译时常常要输入许多的参数,与引用的程式库资讯,建议各位可以建立一个 .BAT 档案,档案中则包含上述的编译指令,这样欲编译时只需要双击这个档案就行了,不需要重复地输入编译的参数资讯。
「/out:」指明要将编译出来的DBHelp.dll档案存放到下一层bin子目录中。「/t:」则告诉编译器编译後要建立一个程式库。「/r:」则告诉编译器此元件参考到系统提供的资料存取程式库。最後的部份则是欲编译的原始程式码档案名称。如果编译的过程中,没有发生任何问题,你可以在Inetpub\wwwroot\bin目录下找到DBHelp.dll这个档案。
如果在过去使用过元件物件模型(COM)的程式设计师们,或许会问一个问题,如果要将这个元件拿到别台机器上执行是否要进行注册的手续?在.NET Framework的世界中,你不必烦恼者个问题了,所有的元件都具备有自我描述的能力!在编译的时候,会将元件执行时所需的相关资讯,称metadata,编译在元件档案中。因此只要将此DLL档案直接复制到别台机器上就行了!应用程式部署的动作已大幅地简化。
开发ASP+网页
元件顺利开发完成後,便可以设ASP+网页以做为使用者介面,在Inetpub\wwwroot目录下建立一个callcomp.aspx网页。设计ASP+网页就和和HTML网页一样,都可以接受一般的HTML标注。在此网页中要将员工清单表列出,并为每一个员工的名称下加上超连结,以便取出此员工的明细资料。
接下来让我们谈谈ASP+网页使用者介面设计步骤:
步骤一:设计资料显示网页
在此网页的<BODY > </BODY >标签中内嵌一个Server Control,在此选用DataList控制项,将所有员工的资料列表。
<asp:DataList id="MyList" runat="server" >
</asp:DataList >
Server control是一个网页上的控制项,由Server端建立的。使用Server Control的好处是可以将HTML与程式码完全分开。注意控制项上的 "runat=server" 指令就是用来建立Server端控制项的语法。内建ASP+ 提供了所有与HTML控制项能力相当的server-side 控制项,外加许多其它的控制项以利网页的制作。总计 ASP+ 内含了45 个内建的server-side control。还有许多的厂商包含Software Artisans、VideoSoft等等已在开发许多支援控制项可供使用。
注意server-side的控制项并不是一个ActiveX控制项,或是Visual InterDev中的设计时期控制项(design-time control)。它们只存在於Server端,执行时将产生标准的HTML送到客户端显示。以此观之,它们是与客户端无关的,有许多的server control会根据客户端的不同而产生不同的内容。如使用IE浏览网页,就送给客户端标准的HTML,若使用手机浏览网页,就送给客户端看得懂的WML。因此程式只要撰写一次就可以在许多地方执行。
回到程式,你可以使用<template>来格式化DataList中项目的资料,<template>可以用来定义资料项目将来要显示时所展示的外观,由於要做到超连结的功能,因此在<template>中再嵌入一个<asp:HyperLink>控制项。<asp:HyperLink>控项中指定的参数如下:
id:指定HyperLink物件的识别名称。
Text:指定欲显示的文字。
NavigateUrl:指定超连结。
runat:指定程式码指定所在位置。
< template name="ItemTemplate" >
< asp:HyperLink
id=HyperLink1
Text='< %# DataBinder.Eval(Container.DataItem, "fname") % >'
NavigateUrl='< %# "employee.aspx?empid=" +
DataBinder.Eval(Container.DataItem, "emp_id") % >'
runat="server" / >
< /template >
ASP+ framework提供DataBinder.Eval()以存取资料并可进行资料型态转型。DataBinder.Eval()第一个参数用来指明资料项目所在的容器,第二个参数指明欲显示的资料库栏位名称。而DataList的资料容器永远都是Container.DataItem。所以从程式码中可以看出使用DataBinder.Eval(Container.DataItem, "fname")取出资料库中fname栏位的名称显示在画面上,超连结的查询字串将以emp_id栏位中的资料来代表。
步骤二:呼叫资料存取元件
您可以使用Visual Basic .NET或 C#来撰写ASP+程式码。接下来在这个网页中我们将使用C#来撰写呼叫元件的程式码,因此在网页中< HEAD >< /HEAD >标注之间插入使用语言的宣告:
< script language="C#" runat="server" >
< /script >
由於希望ASP+在伺服器端执行这段程式码,因此程式码区块中加入runat="server"。另外我们希望一载入网页时,便可以呼叫实作在DataHelp元件上的Method,由於网页一载入会自动地触发Page_Load事件,因此在Page_Load事件中撰写建立物件的程式码是很适当的。元件回传回来的DataSet其资料型态可以使用ICollection来接,所以程式一开始先宣告一个资料型态为ICollection的变数,名称为menuItems。接下来便建立名称为myemp的DataHelp物件复本。回顾前面所提,物件类别是定义在MyUtil命名空间之下,物件类别的名称为DataHelp,因此你可以使用这样的语法来建立一个新物件的复本:
MyUtil.DataHelp myemp = new MyUtil.DataHelp();
呼叫物件的Method只需要直接叫用就可以了! 然後透过下面的语法取出资料内容,放到menuItems变数中。
menuItems = myemp.EmpList().Tables[0].DefaultView;
最後设定DataGrid元件的DataSource属性为刚取回来的menuItems集合资料,再呼叫DataBind将资料与控制项系结在一起。
< HTML >
< HEAD >
< script language="C#" runat="server" >
void Page_Load(Object sender, EventArgs e) {
ICollection menuItems;
MyUtil.DataHelp myemp = new MyUtil.DataHelp();
menuItems = myemp.EmpList().Tables[0].DefaultView;
MyList.DataSource = menuItems;
MyList.DataBind();
}
< /script >
< /HEAD >
< B > Employee List :< B >
< BODY >
< asp:DataList id="MyList" runat="server" >
< template name="ItemTemplate" >
< asp:HyperLink
id=HyperLink1
Text='< %# DataBinder.Eval(Container.DataItem, "fname") % > '
NavigateUrl='< %# "employee.aspx?empid=" +
DataBinder.Eval(Container.DataItem, "emp_id") % > '
runat="server" / >
< /template >
< /asp:DataList >
< /BODY >
< /HTML >
列表三:CallComp.aspx程式码的完整列表
步骤三:测试
验证资料运作正确与否相当的简单,只要在浏览器中输入:
http://localhost/callcomp.aspx
你就可以看到图一的执行结果,列表出所有的员工名称,并加上超连结。
步骤四:设计个人资料网页
接下来我们再撰写另一个ASP+网页,以显示员工个人的资料,网页名称为employee.aspx。程式的结构基本上和CallComp.aspx没有什麽太大的差别。我们可以使用Request.Params["empid"]语法从 QueryString 取得员工代号。然後在呼叫SelectEmployee Method时,使用MyEmp.SelectEmployee(QryempId)语法传入参数。在这个网页中,使用另一个DataGrid Server Control来展示。
< HTML >
< HEAD >
< script language="C#" runat="server" >
void Page_Load(Object sender, EventArgs e) {
string QryempId = Request.Params["empid"];
MyUtil.DataHelp MyEmp = new MyUtil.DataHelp();
MyEmpGrid.DataSource =
MyEmp.SelectEmployee(QryempId).Tables[0].DefaultView;
MyEmpGrid.DataBind();
}
< /script >
< /HEAD >
< BODY >
< asp:DataGrid id="MyEmpGrid" runat="server" >
< /asp:DataGrid >
< /BODY >
< /HTML >
列表四:employee.aspx程式码的完整列表
你也可以修改DataGrid的属性来改变它的外观,如将
< asp:DataGrid id=" MyEmpGrid" runat="server" >
修改成: < asp:DataGrid id=" MyEmpGrid"
BackColor="#EDBE7B"
BorderColor="black"
runat="server" >
便可修改DataGrid的背景颜色与外框颜色。当你点选到图一任一个员工的超连结时,您看到的执行结果应该如下:
总结
.NET 已成为Microsoft企业级应用程式开发的新架构。下一代的新开发语言C#、Visual Basic .NET可以快速地协助你进行开发的动作。虽然.NET、C#、Visual Basic .NET、ASP+目前都尚在Beta阶段,但可想而见,使用新世代开发架构的抉择已不远了。不过一项好的技术绝对是值得深入探讨的!现在就开始行动吧!