注册 登录
编程论坛 ASP.NET技术论坛

求ASP.NET三层结构

caiyakang 发布于 2006-05-11 01:06, 5095 次点击

求ASP.NET三层结构说明

36 回复
#2
小笨笨2006-05-11 09:40

以下是转的:

典型的三层结构范例源码(数据层、商务层、表示层)
数据层:
数据层:
using System;
using System.Collections;
using System.Data;
using System.Data.SqlClient;

namespace YiPu.WebModules.Accounts.Data
{
/// <summary>
/// User 的摘要说明。
/// </summary>
public class User : YiPu.WebModules.Data.DbObject
{
public User(string newConnectionString): base(newConnectionString)
{ }

public bool Create(
string userID,
byte[] password,
string userName,
string company,
string department,
string office,
string duties,
bool sex,
DateTime birth,
string emailAddress,
string mobile,
DateTime registerTime,
DateTime invalidTime,
string question,
string answer,
string country,
string province,
string city,
string code,
string address,
bool isRejected)
{
int rowsAffected;
SqlParameter[]
parameters = {
new SqlParameter("@UserID", SqlDbType.VarChar, 18),
new SqlParameter("@Password", SqlDbType.Binary, 12),
new SqlParameter("@UserName", SqlDbType.VarChar, 8),
new SqlParameter("@Company", SqlDbType.VarChar, 50),
new SqlParameter("@Department", SqlDbType.VarChar, 10),
new SqlParameter("@Office", SqlDbType.VarChar, 10),
new SqlParameter("@Duties", SqlDbType.VarChar, 10),
new SqlParameter("@Sex", SqlDbType.Bit),
new SqlParameter("@Birth", SqlDbType.DateTime),
new SqlParameter("@EmailAddress", SqlDbType.VarChar, 50),
new SqlParameter("@Mobile", SqlDbType.VarChar, 10),
new SqlParameter("@RegisterTime", SqlDbType.DateTime),
new SqlParameter("@InvalidTime", SqlDbType.DateTime),
new SqlParameter("@Question", SqlDbType.VarChar, 50),
new SqlParameter("@Answer", SqlDbType.VarChar, 50),
new SqlParameter("@Country", SqlDbType.VarChar, 10),
new SqlParameter("@Province", SqlDbType.VarChar, 10),
new SqlParameter("@City", SqlDbType.VarChar, 10),
new SqlParameter("@Code", SqlDbType.VarChar, 6),
new SqlParameter("@Address", SqlDbType.VarChar, 50),
new SqlParameter("@IsRejected", SqlDbType.Bit)
};

parameters[0].Value = userID;
parameters[1].Value = password;
parameters[2].Value = userName;
parameters[3].Value = company;
parameters[4].Value = department;
parameters[5].Value = office;
parameters[6].Value = duties;
parameters[7].Value = sex;
parameters[8].Value = birth;
parameters[9].Value = emailAddress;
parameters[10].Value = mobile;
parameters[11].Value = registerTime;
parameters[12].Value = invalidTime;
parameters[13].Value = question;
parameters[14].Value = answer;
parameters[15].Value = country;
parameters[16].Value = province;
parameters[17].Value = city;
parameters[18].Value = code;
parameters[19].Value = address;
parameters[20].Value = isRejected;

RunProcedure("sp_Accounts_CreateUser", parameters, out rowsAffected);
return (rowsAffected == 1);
}

public DataRow Retrieve(string userID)
{
SqlParameter[] parameters = { new SqlParameter("@UserID", SqlDbType.VarChar,18) };
parameters[0].Value = userID;

using (DataSet users = RunProcedure( "sp_Accounts_GetUserDetails", parameters, "Users" ))
{
return users.Tables[0].Rows[0];
}
}

public bool Update(
string userID,
string userName,
byte[] password,
string company,
string department,
string office,
string duties,
bool sex,
DateTime birth,
string emailAddress,
string mobile,
DateTime registerTime,
DateTime invalidTime,
string question,
string answer,
string country,
string province,
string city,
string code,
string address,
bool isRejected)
{
int rowsAffected;
SqlParameter[] parameters = {
new SqlParameter("@UserID", SqlDbType.VarChar, 18),
new SqlParameter("@Password", SqlDbType.Binary, 20),
new SqlParameter("@UserName", SqlDbType.VarChar, 8),
new SqlParameter("@Company", SqlDbType.VarChar, 50),
new SqlParameter("@Department", SqlDbType.VarChar, 10),
new SqlParameter("@Office", SqlDbType.VarChar, 10),
new SqlParameter("@Duties", SqlDbType.VarChar, 10),
new SqlParameter("@Sex", SqlDbType.Bit),
new SqlParameter("@Birth", SqlDbType.DateTime),
new SqlParameter("@EmailAddress", SqlDbType.VarChar, 50),
new SqlParameter("@Mobile", SqlDbType.VarChar, 10),
new SqlParameter("@RegisterTime", SqlDbType.DateTime),
new SqlParameter("@InvalidTime", SqlDbType.DateTime),
new SqlParameter("@Question", SqlDbType.VarChar, 50),
new SqlParameter("@Answer", SqlDbType.VarChar, 50),
new SqlParameter("@Country", SqlDbType.VarChar, 10),
new SqlParameter("@Province", SqlDbType.VarChar, 10),
new SqlParameter("@City", SqlDbType.VarChar, 10),
new SqlParameter("@Code", SqlDbType.VarChar, 6),
new SqlParameter("@Address", SqlDbType.VarChar, 50),
new SqlParameter("@IsRejected", SqlDbType.Bit),
};

parameters[0].Value = userID;
parameters[1].Value = userName;
parameters[2].Value = password;
parameters[3].Value = company;
parameters[4].Value = department;
parameters[5].Value = office;
parameters[6].Value = duties;
parameters[7].Value = sex;
parameters[8].Value = birth;
parameters[9].Value = emailAddress;
parameters[11].Value = mobile;
parameters[12].Value = registerTime;
parameters[13].Value = invalidTime;
parameters[14].Value = question;
parameters[15].Value = answer;
parameters[16].Value = country;
parameters[17].Value = province;
parameters[18].Value = city;
parameters[19].Value = code;
parameters[20].Value = address;
parameters[21].Value = isRejected;

RunProcedure("sp_Accounts_UpdateUser", parameters, out rowsAffected);
return (rowsAffected == 1);
}

public bool Delete(string userID)
{
SqlParameter[] parameters = { new SqlParameter("@UserID", SqlDbType.VarChar,18) };
int rowsAffected;

parameters[0].Value = userID;

RunProcedure( "sp_Accounts_DeleteUser", parameters, out rowsAffected );
return (rowsAffected == 1);
}

public int ValidateLogin(string userID, byte[] encPassword)
{
int rowsAffected;
SqlParameter[] parameters =
{
new SqlParameter("@UserID", SqlDbType.VarChar, 18),
new SqlParameter("@EncryptedPassword", SqlDbType.Binary, 20)
};

parameters[0].Value = userID;
parameters[1].Value = encPassword;

return RunProcedure("sp_Accounts_ValidateLogin", parameters, out rowsAffected);
}

public int TestPassword(string userID, byte[] encPassword)
{
int rowsAffected;
SqlParameter[] parameters =
{
new SqlParameter("@UserID", SqlDbType.VarChar,18),
new SqlParameter("@EncryptedPassword", SqlDbType.Binary, 20)
};

parameters[0].Value = userID;
parameters[1].Value = encPassword;

return RunProcedure("sp_Accounts_TestPassword", parameters, out rowsAffected);
}

public ArrayList GetUserRoles( string userID )
{
ArrayList roles = new ArrayList();
SqlParameter[] parameters = { new SqlParameter("@UserID", SqlDbType.VarChar,18) };
parameters[0].Value = userID;

SqlDataReader tmpReader = RunProcedure("sp_Accounts_GetUserRoles", parameters);
while (tmpReader.Read())
{
roles.Add( tmpReader.GetString(1) );
}
Connection.Close();
return roles;
}

public ArrayList GetEffectivePermissionList( string userID )
{
ArrayList permissions = new ArrayList();
SqlParameter[] parameters = { new SqlParameter("@UserID", SqlDbType.VarChar,18) };
parameters[0].Value = userID;

SqlDataReader tmpReader = RunProcedure("sp_Accounts_GetEffectivePermissionList", parameters);
while (tmpReader.Read())
{
permissions.Add( tmpReader.GetInt32(0) );
}
Connection.Close();
return permissions;
}

public DataSet GetUserList()
{
return RunProcedure("sp_Accounts_GetUsers", new IDataParameter[]{}, "Users");
}

public bool AddRole(string userID, int roleID)
{
int rowsAffected;
SqlParameter[] parameters = {
new SqlParameter("@UserID", SqlDbType.VarChar, 18),
new SqlParameter("@RoleID", SqlDbType.Int, 4)
};
parameters[0].Value = userID;
parameters[1].Value = roleID;

RunProcedure("sp_Accounts_AddUserToRole", parameters, out rowsAffected);
return (rowsAffected == 1);
}

public bool RemoveRole(String userID, int roleID)
{
int rowsAffected;
SqlParameter[] parameters = {
new SqlParameter("@UserID", SqlDbType.VarChar,18),
new SqlParameter("@RoleID", SqlDbType.Int,4 )
};
parameters[0].Value = userID;
parameters[1].Value = roleID;

RunProcedure("sp_Accounts_RemoveUserFromRole", parameters, out rowsAffected);
return (rowsAffected == 1);
}

}
}

#3
小笨笨2006-05-11 09:40

商务层:
using System;
using System.Data;

namespace YiPu.WebModules.Accounts.Business
{
/// <summary>
/// Users 的摘要说明。
/// </summary>
public class User : YiPu.WebModules.Business.BizObject
{
private Configuration.ModuleSettings moduleSettings;
private string userID;
private byte[] password;
private string userName;
private string company;
private string department;
private string office;
private string duties;
private bool sex;
private DateTime birth;
private string emailAddress;
private string mobile;
private DateTime registerTime;
private DateTime invalidTime;
private string question;
private string answer;
private string country;
private string province;
private string city;
private string code;
private string address;
private bool isRejected;

public User()
{
moduleSettings = Configuration.ModuleConfig.GetSettings();
}
private void LoadFromID()
{
Data.User dataUser=new Data.User(moduleSettings.ConnectionString);
DataRow userRow = dataUser.Retrieve( userID );
password=(byte[])userRow["Password"];
userName=userRow["UserName"].ToString();
company=userRow["Compandy"].ToString();
department=userRow["Department"].ToString();
office=userRow["Office"].ToString();
duties=userRow["Duties"].ToString();
sex=bool.Parse(userRow["Sex"].ToString());
birth=DateTime.Parse(userRow["Birth"].ToString());
emailAddress=userRow["emailAddress"].ToString();
mobile=userRow["Mobile"].ToString();
registerTime=DateTime.Parse(userRow["RegisterTime"].ToString());
invalidTime=DateTime.Parse(userRow["InvalidTime"].ToString());
question=userRow["Question"].ToString();
answer=userRow["Answer"].ToString();
country=userRow["Country"].ToString();
province=userRow["Province"].ToString();
city=userRow["City"].ToString();
code=userRow["Code"].ToString();
address=userRow["Address"].ToString();
isRejected=bool.Parse(userRow["IsRejected"].ToString());
}
public User( string existingUserID )
{
moduleSettings = Configuration.ModuleConfig.GetSettings();
userID = existingUserID;
LoadFromID();
}

public User( IESPrincipal existingPrincipal )
{
moduleSettings = Configuration.ModuleConfig.GetSettings();
userID = ((IESIdentity)existingPrincipal.Identity).UserID;
}

public bool Create()
{
Data.User dataUser=new Data.User(moduleSettings.ConnectionString);
return dataUser.Create(userID,password,userName,company,department,
office,duties,sex,birth,emailAddress,mobile,registerTime,invalidTime,
question,answer,country,province,city,code,address,isRejected);
}

public bool Update()
{
Data.User dataUser=new Data.User(moduleSettings.ConnectionString);
return dataUser.Update(userID,userName,password,company,department,
office,duties,sex,birth,emailAddress,mobile,registerTime,invalidTime,
question,answer,country,province,city,code,address,isRejected);
}

public bool Delete()
{
Data.User dataUser=new Data.User(moduleSettings.ConnectionString);
return dataUser.Delete(userID);
}

public bool AddToRole(int RoleID)
{
Data.User dataUser = new Data.User( moduleSettings.ConnectionString );
return dataUser.AddRole(UserID, RoleID);
}

public bool RemoveRole(int RoleID)
{
Data.User dataUser = new Data.User( moduleSettings.ConnectionString );
return dataUser.RemoveRole( UserID, RoleID );
}

public string UserID
{
get
{
return userID;
}
set
{
userID=value;
}
}

public byte[] Password
{
get
{
return password;
}
set
{
password=value;
}
}

public string UserName
{
get
{
return userName;
}
set
{
userName=value;
}
}
public string Company
{
get
{
return company;
}
set
{
company=value;
}
}
public string Department
{
get
{
return department;
}
set
{
department=value;
}
}
public string Office
{
get
{
return office;
}
set
{
office=value;
}
}
public string Duties
{
get
{
return duties;
}
set
{
duties=value;
}
}
public bool Sex
{
get
{
return sex;
}
set
{
sex=value;
}
}
public DateTime Birth
{
get
{
return birth;
}
set
{
birth=value;
}
}
public string EmailAddress
{
get
{
return emailAddress;
}
set
{
emailAddress=value;
}
}
public string Mobile
{
get
{
return mobile;
}
set
{
mobile=value;
}
}
public DateTime RegisterTime
{
get
{
return registerTime;
}
set
{
registerTime=value;
}
}
public DateTime InvalidTime
{
get
{
return invalidTime;
}
set
{
invalidTime=value;
}
}
public string Question
{
get
{
return question;
}
set
{
question=value;
}
}
public string Answer
{
get
{
return answer;
}
set
{
answer=value;
}
}
public string Country
{
get
{
return country;
}
set
{
country=value;
}
}
public string Province
{
get
{
return province;
}
set
{
province=value;
}
}
public string City
{
get
{
return city;
}
set
{
city=value;
}
}
public string Code
{
get
{
return code;
}
set
{
code=value;
}
}
public string Address
{
get
{
return address;
}
set
{
address=value;
}
}
public bool IsRejected
{
get
{
return isRejected;
}
set
{
isRejected=value;
}
}
}
}

#4
小笨笨2006-05-11 09:40

表示层
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using YiPu.WebModules.Accounts.Business;

namespace YiPu.Modules.Users
{
/// <summary>
/// Users 的摘要说明。
/// </summary>
public class Users : System.Web.UI.Page
{
protected System.Web.UI.WebControls.Button DeleteButton;
protected System.Web.UI.WebControls.DataGrid UsersGrid;

private void Page_Load(object sender, System.EventArgs e)
{
if(!this.IsPostBack)
{
BindUsersGrid();
}
}

#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
//
// CODEGEN:该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}

/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.DeleteButton.Click += new System.EventHandler(this.DeleteButton_Click);
this.UsersGrid.PageIndexChanged += new System.Web.UI.WebControls.DataGridPageChangedEventHandler(this.UsersGrid_PageIndexChanged);
this.Load += new System.EventHandler(this.Page_Load);

}
#endregion

private void BindUsersGrid()
{
DataView dv=AccountsTool.GetUserList().Tables["Users"].DefaultView;
UsersGrid.DataSource=dv;
UsersGrid.DataBind();
}

private void UsersGrid_PageIndexChanged(object source, System.Web.UI.WebControls.DataGridPageChangedEventArgs e)
{
UsersGrid.CurrentPageIndex=e.NewPageIndex;
BindUsersGrid();
}

private void DeleteButton_Click(object sender, System.EventArgs e)
{
for(int i=0;i<UsersGrid.Items.Count;i++)
{
HtmlInputCheckBox checkBox=(HtmlInputCheckBox)UsersGrid.Items[i].FindControl("CheckBox");
if(checkBox.Checked==true)
{
YiPu.WebModules.Accounts.Business.User deleteUser=new YiPu.WebModules.Accounts.Business.User();
deleteUser.UserID=checkBox.Value;
deleteUser.Delete();
}
}
BindUsersGrid();
}
}
}

#5
guobinxian2006-05-11 14:07
简单的来说就是:
数据访问层,商业规则层或是实体层,表示层
#6
jhy2006-05-11 14:54
钱途无量啊
#7
梦幻情缘2006-05-12 17:50
不错,给予支持!
#8
caiyakang2006-05-25 09:59
我觉得他数据层,数据重复太多

更新,删除,插入我们完全可以用一个来实现的,就是无返回值操作.


以下是我自已通用的:
#region 无返回操作,执行如删除,更新,插入
public bool ExecuteNonQuery(bool IsPro,string CmdText)
{
try
{
con=new SqlConnection(GetConnStr());
con.Open();
cmd.Connection=con;
if(IsPro)
{
cmd.CommandType=CommandType.StoredProcedure;
}
else
{
cmd.CommandType=CommandType.Text;
}
cmd.CommandText=CmdText;
cmd.ExecuteNonQuery();
con.Close();
return true;
}
catch
{
return false;
}
}
#endregion
可为存储过程,也可是是SQL语句
#9
recycled2006-06-03 15:36
      
#10
下山的和尚2006-07-01 09:40
谢谢版主
#11
gelinqu2006-07-01 14:04

支持支持﹗

#12
艾伦2006-07-03 11:09
我做项目一直喜欢petshop的那一套!

他的数据库连接层非常好用!
#13
飞鱼2006-07-26 16:05
顶!不过学起来不是那么的简单啊!!支持!!
#14
betty2006-11-11 16:10
以下是引用艾伦在2006-7-3 11:09:20的发言:
我做项目一直喜欢petshop的那一套!

他的数据库连接层非常好用!

有petshop4.0的系统的详细讲解的资料吗?

#15
メ冰枫ぱ雪2006-11-11 20:33
各个层做各个层的事,就和我们去饭店吃东西一样!!
#16
tel19822006-11-16 08:05
谢谢小笨笨。
#17
linfeng3322006-11-16 09:37

这么说我还没完全掌握三层结构哦...

#18
飞飞1852006-11-16 14:59

不错

#19
cyyu_ryh2006-11-18 15:37

很好,就是看起头晕

#20
学技术2006-11-18 23:26
那四层的捏~怎么分~
#21
caiyakang2006-11-19 12:15
想要多少层都可以,依个人决定
#22
ww4052007-03-05 18:03
高手很多啊!!
#23
yms1232007-03-07 10:01

个人觉得.NET的数据访问层应该可以更独立,也就是更佳的通用。而且一般都是三层结构,执行顺序是。
比如最简单的登陆来说。
从界面用户输入用户名密码,
界面层做输入正确性验证(检查是否为空,是否长度不符),
界面层调用业务层,
业务层调用数据访问层验证用户名密码是否正确。
正确则业务层继续执行登陆操作,
调用数据层读取用户数据,
调用后向界面层传送登陆成功的数据。
界面层将登陆成功的数据显示在界面上。
如果用户名密码不正确
则业务层向界面层发出错误消息,
界面层接收错误消息并显示让用户重试。

#24
dogdays2007-04-03 16:49

谢谢
班主

#25
jflin2007-04-05 11:41
真厉害
#26
dianameis2007-05-01 06:59
还要努力学习呀!
#27
章伟业2007-05-19 19:10
偶是个初学者.看得迷迷糊糊的...晕..
#28
rainic2007-05-20 12:37
像小笨笨给出的代码那样话,要写多少个数据层啊?
好像没多大意义吧

不过那只是个例子
#29
foshan2007-05-21 10:20

这几天也在研究这方面的知识,数据访问层不是用 类型化的 DataSet 来搞的吗?

#30
foshan2007-07-03 17:01
#31
垃圾的沉默2007-07-03 19:08
是不是可以这样理解
界面--应用程序--数据库
#32
wuhongyao32007-11-12 15:06
呵呵,正在找,看看能看懂不?
#33
yms1232007-11-12 17:34

using System;
using System.Data;
using System.Data.SqlClient;
namespace DataAccess
{
/// <summary>
/// SQL Server 数据库的访问类
/// </summary>
public class SqlAccess
{
private SqlConnection SqlCon;
private SqlDataAdapter SqlAdp;
private SqlCommand SqlCmd;
private SqlCommandBuilder SqlCmdB;

public SqlAccess()
{
//
// TODO: 在此处添加构造函数逻辑
//
}

protected SqlConnection getConnection()
{
if(this.SqlCon==null)
{
this.SqlCon=new SqlConnection(this.ConStr);
this.SqlCon.Open();
}
return this.SqlCon;
}

protected SqlDataAdapter getDataAdapter()
{
this.SqlCon=(SqlConnection)this.getConnection();
this.SqlAdp=new SqlDataAdapter(this.SqlStr,this.SqlCon);
return this.SqlAdp;
}

protected SqlCommand getCommand()
{
this.SqlCon=(SqlConnection)this.getConnection();
this.SqlCmd=new SqlCommand(this.SqlStr,this.SqlCon);
return this.SqlCmd;
}

protected SqlCommandBuilder getCommandBuilder()
{
this.SqlAdp=(SqlDataAdapter)this.getDataAdapter();
this.SqlCmdB=new SqlCommandBuilder(this.SqlAdp);
return this.SqlCmdB;
}

protected DataSet getDataSet()
{
this.SqlAdp=(SqlDataAdapter)this.getDataAdapter();
this.ObjDs=new DataSet();
this.SqlAdp.Fill(this.ObjDs,this.TBName);
return this.ObjDs;
}

protected void SetActionCommand()
{
switch(this.ActionMode)
{
case "Insert":
this.SqlAdp.InsertCommand=this.SqlCmdB.GetInsertCommand();
break;
case "Update":
this.SqlAdp.UpdateCommand=this.SqlCmdB.GetUpdateCommand();
break;
case "Delete":
this.SqlAdp.DeleteCommand=this.SqlCmdB.GetDeleteCommand();
break;
}
}

public DataTable getDataTable()
{
this.ObjDs=this.getDataSet();
return this.ObjDs.Tables[this.TBName];
}

public void SaveTable(DataSet srcDts)
{
this.SqlAdp=(SqlDataAdapter)this.getDataAdapter();
this.SqlCmdB=(SqlCommandBuilder)this.getCommandBuilder();
this.SetActionCommand();
this.SqlAdp.Update(srcDts,this.TBName);
}

}
}
个人的数据层常用代码,这个类的优点在于,只用一个函数就可以直接得到DataTable,个人觉得.NET里Connection对象可以用单例模式来做。

#34
cook1111112007-11-13 11:09
学习了~~
#35
zmfttkl2007-11-14 19:01

支持!

#36
simpson2007-11-14 21:26
果然 有思想

#37
枯牛2007-11-15 14:48
8楼的方法是不错,但如果我要执行的结果呢,例如select * from 表名 这个查询结果呢,你还可以用那个方法吗?
各有利弊而已
1