一般来说,分层的应用程序构造方法有以下一些优点:有利于代码复用;方便程序改动;提高代码的健壮性;有利于分工。
下面以一个简单的获取用户信息的数据库应用为例,讲解一下四层结构的信息管理应用的构造方法:
1.数据库层
//比较而言,带参数的存储过程比代码中字符串加变量构造的SQL语句效率高出很多,
//所以建议将常用查询写成存储过程以供调用
CREATE TABLE dbo.users (
FID int NOT NULL ,
FName nvarchar (50) NOT NULL ,
FPassword nvarchar (50) NULL ,
FRemark ntext NULL
)
CREATE PROCEDURE dbo.sp_sel_user
@pid int
AS
select * from users where fid=@pid
2.数据组件层
//根据调用者提供的SQL语句、存储过程名称及参数等数据库对象信息返回一定格式的应用程序对象。
//数据组件需要数量相对较少,但使用面很广,一般需加入较全面的事务及异常处理,
//这里限于篇幅作了省略。
public class CDatabase
{
private string mConnectString = "Provider=SQLOLEDB.1;Data Source=mymachine;Initial Catalog=mydatabase;User ID=sa;Password=pwd;";
public bool RunProcedure(string sProcedureName, System.Data.OleDb.OleDbParameter[] oParams, out OleDbDataReader oReader)
{
OleDbConnection oConnection=new OleDbConnection(this.mConnectString);
OleDbCommand oCommand = new OleDbCommand(sProcedureName, oConnection);
oCommand.CommandType = CommandType.StoredProcedure;
if (oParams != null)
{
foreach (OleDbParameter oParam in oParams)
oCommand.Parameters.Add(oParam);
}
oReader = oCommand.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
return true;
}
public string ConnectString
{
get
{
return this.mConnectString;
}
set
{
this.mConnectString=value;
}
}
}
3.业务逻辑层
//根据调用者提供的用户ID号获取所有用户信息。
//业务层主要任务为构造业务对象和调用数据组件从数据库获取数据,
//这是实现起来最复杂的一个层面,需要熟悉数据库结构,
//并根据用户层需要设计业务对象及数据库对象。
public class CUser
{
private int mID;
private string mName;
private string mPassword;
private string mRemark;
public CUser(int pID)
{
CDatabase cdb=new CDatabase();
OleDbParameter oParam=new OleDbParameter();
oParam.ParameterName="@pid";
oParam.OleDbType=OleDbType.Integer;
oParam.Value=pID;
OleDbParameter[] oParams={oParam};
OleDbDataReader oReader;
cdb.RunProc("sp_sel_user",oParams,out oReader);
this.mID=pID;
this.mName=oReader["FName"];
this.mPassword=oReader["FPassword"];
this.mRemark=oReader["FRemark"];
}
public int ID
{
get
{
return mID;
}
set
{
mID=value;
}
}
public string Name
{
get
{
return mName;
}
set
{
mName=value;
}
}
public string Password
{
get
{
return mPassword;
}
set
{
mPassword=value;
}
}
public string Remark
{
get
{
return mRemark;
}
set
{
mRemark=value;
}
}
}
4.用户界面层
//根据输入的用户ID号获取用户详细信息并写入页面TextBox元素中。
//在页面层不需要再和数据库打交道,只需调用相应的业务组件即可,
//这样就算界面有大的改动也可从容自如
private void Button1_Click(object sender, System.EventArgs e)
{
CUser user=new CUser(this.txtID.Text);
this.txtName.Text=user.Name;
this.txtPassword.Text=user.Password;
this.txtRemark.Text=user.Remark;
}