对于B/S架构的三层架构的开发,可能很多的人都已经了解的是比较清楚的。哪么我在这里用的是最简单的三层架构。ui+bll+dal+dbsqlhelp+model.从05出来以后由于功能明显比03夸张了很多,所以在开发的时候也就很方便。其中以数据的显示最为明显。通过sqldatasource可以几乎一行代码都不需要写,就能在GridView中显示出来数据,并且进行增删查改的操作,但是我个人总感觉这样做是有问题的。因为使用sqldatasource,就明显的破坏了3层架构的基本改变。哪么微软在05当中,很重点的推出了objectdatasource这个东西,就是专门用来结合三层架构开发的一个数据源绑定控件。 在层次之间传递的也是object,这样相对来说就比较好一些。
代码在具体的下边,其实主要就是DataList稍微麻烦一点,别的几个控件都可以自动 实现增删查改的功能,所以基本没什么写太多的代码。!
在这里主要是DataList的代码,以操作Jobs表为示例。
DbSqlHelp
using
System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;
namespace DbSqlHelp
... {
public abstract class DbSqlHelp
...{
static string StrConn = @"User ID=sa;Password=perishryu;Initial Catalog=pubs;Data Source=OATHRYUSQL2005";
static SqlDataAdapter da;
static SqlCommand cmd;
static SqlConnection conn;
static DataSet ds;
public static DataSet Search(string sql)
...{
using (da = new SqlDataAdapter(sql, StrConn))
...{
using (ds = new DataSet())
...{
da.Fill(ds);
return ds;
}
}
}
public static bool Make(string sql)
...{
using (conn = new SqlConnection(StrConn))
...{
using (cmd = new SqlCommand(sql, conn))
...{
if (conn.State != ConnectionState.Closed)
...{
conn.Close();
}
try
...{
conn.Open();
cmd.ExecuteNonQuery();
return false;
}
catch(System.Exception ex)
...{
throw ex;
}
finally
...{
conn.Close();
}
}
}
}
}
}
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;
namespace DbSqlHelp
... {
public abstract class DbSqlHelp
...{
static string StrConn = @"User ID=sa;Password=perishryu;Initial Catalog=pubs;Data Source=OATHRYUSQL2005";
static SqlDataAdapter da;
static SqlCommand cmd;
static SqlConnection conn;
static DataSet ds;
public static DataSet Search(string sql)
...{
using (da = new SqlDataAdapter(sql, StrConn))
...{
using (ds = new DataSet())
...{
da.Fill(ds);
return ds;
}
}
}
public static bool Make(string sql)
...{
using (conn = new SqlConnection(StrConn))
...{
using (cmd = new SqlCommand(sql, conn))
...{
if (conn.State != ConnectionState.Closed)
...{
conn.Close();
}
try
...{
conn.Open();
cmd.ExecuteNonQuery();
return false;
}
catch(System.Exception ex)
...{
throw ex;
}
finally
...{
conn.Close();
}
}
}
}
}
}
Model
using
System;
using System.Collections.Generic;
using System.Text;
namespace Model
... {
public class Job_Model
...{
public Job_Model()
...{
}
public Job_Model(int id, string desc, int min, int max)
...{
this.job_desc = desc;
this.job_id = id;
this.min_lvl = min;
this.max_lvl = max;
}
int job_id;
public int Job_id
...{
get ...{ return job_id; }
set ...{ job_id = value; }
}
string job_desc;
public string Job_desc
...{
get ...{ return job_desc; }
set ...{ job_desc = value; }
}
int min_lvl;
public int Min_lvl
...{
get ...{ return min_lvl; }
set ...{ min_lvl = value; }
}
int max_lvl;
public int Max_lvl
...{
get ...{ return max_lvl; }
set ...{ max_lvl = value; }
}
}
}
using System.Collections.Generic;
using System.Text;
namespace Model
... {
public class Job_Model
...{
public Job_Model()
...{
}
public Job_Model(int id, string desc, int min, int max)
...{
this.job_desc = desc;
this.job_id = id;
this.min_lvl = min;
this.max_lvl = max;
}
int job_id;
public int Job_id
...{
get ...{ return job_id; }
set ...{ job_id = value; }
}
string job_desc;
public string Job_desc
...{
get ...{ return job_desc; }
set ...{ job_desc = value; }
}
int min_lvl;
public int Min_lvl
...{
get ...{ return min_lvl; }
set ...{ min_lvl = value; }
}
int max_lvl;
public int Max_lvl
...{
get ...{ return max_lvl; }
set ...{ max_lvl = value; }
}
}
}
DAL
using
System;
using System.Collections.Generic;
using System.Text;
using System.Data;
namespace DAL
... {
public class Job_DAL
...{
string sql;
public DataSet Select_Job_Dal(string jobid)
...{
sql = "select * from jobs where job_id='" +jobid + "'";
return DbSqlHelp.DbSqlHelp.Search(sql);
}
public DataSet Select_Job_Dal()
...{
sql = "select * from jobs";
return DbSqlHelp.DbSqlHelp.Search(sql);
}
public bool Update_Job_Dal(Model.Job_Model job)
...{
sql = "update jobs set job_desc='" + job.Job_desc + "',min_lvl='" + job.Min_lvl + "',max_lvl='" + job.Max_lvl + "' where job_id='" + job.Job_id + "'";
try
...{
return DbSqlHelp.DbSqlHelp.Make(sql);
}
catch(System.Exception ex)
...{
throw ex;
}
}
public bool Insert_Job_Dal(Model.Job_Model job)
...{
sql = "insert into jobs values('" + job.Job_desc + "','" + job.Min_lvl + "','" + job.Max_lvl + "')";
try
...{
return DbSqlHelp.DbSqlHelp.Make(sql);
}
catch (System.Exception ex)
...{
throw ex;
}
}
public bool Delete_Job_Dal(Model.Job_Model job)
...{
sql = "delete from jobs where job_id='" + job.Job_id + "'";
try
...{
return DbSqlHelp.DbSqlHelp.Make(sql);
}
catch (System.Exception ex)
...{
throw ex;
}
}
}
}
using System.Collections.Generic;
using System.Text;
using System.Data;
namespace DAL
... {
public class Job_DAL
...{
string sql;
public DataSet Select_Job_Dal(string jobid)
...{
sql = "select * from jobs where job_id='" +jobid + "'";
return DbSqlHelp.DbSqlHelp.Search(sql);
}
public DataSet Select_Job_Dal()
...{
sql = "select * from jobs";
return DbSqlHelp.DbSqlHelp.Search(sql);
}
public bool Update_Job_Dal(Model.Job_Model job)
...{
sql = "update jobs set job_desc='" + job.Job_desc + "',min_lvl='" + job.Min_lvl + "',max_lvl='" + job.Max_lvl + "' where job_id='" + job.Job_id + "'";
try
...{
return DbSqlHelp.DbSqlHelp.Make(sql);
}
catch(System.Exception ex)
...{
throw ex;
}
}
public bool Insert_Job_Dal(Model.Job_Model job)
...{
sql = "insert into jobs values('" + job.Job_desc + "','" + job.Min_lvl + "','" + job.Max_lvl + "')";
try
...{
return DbSqlHelp.DbSqlHelp.Make(sql);
}
catch (System.Exception ex)
...{
throw ex;
}
}
public bool Delete_Job_Dal(Model.Job_Model job)
...{
sql = "delete from jobs where job_id='" + job.Job_id + "'";
try
...{
return DbSqlHelp.DbSqlHelp.Make(sql);
}
catch (System.Exception ex)
...{
throw ex;
}
}
}
}
BLL
using
System;
using System.Collections.Generic;
using System.Text;
using System.Data;
namespace BLL
... {
public class Job_BLL
...{
DAL.Job_DAL jobdal;
public DataSet Select_BLL()
...{
jobdal = new DAL.Job_DAL();
...{
return jobdal.Select_Job_Dal();
}
}
public DataSet Select_BLL(string jobid)
...{
jobdal = new DAL.Job_DAL();
...{
return jobdal.Select_Job_Dal(jobid);
}
}
public bool Update_BLL(Model.Job_Model job)
...{
jobdal = new DAL.Job_DAL();
try
...{
return jobdal.Update_Job_Dal(job);
}
catch (System.Exception ex)
...{
throw ex;
}
}
public bool Insert_BLL(Model.Job_Model job)
...{
jobdal = new DAL.Job_DAL();
try
...{
return jobdal.Insert_Job_Dal(job);
}
catch(System.Exception ex)
...{
throw ex;
}
}
public bool Delete_BLL(Model.Job_Model job)
...{
jobdal = new DAL.Job_DAL();
try
...{
return jobdal.Delete_Job_Dal(job);
}
catch(System.Exception ex)
...{
throw ex;
}
}
}
}
using System.Collections.Generic;
using System.Text;
using System.Data;
namespace BLL
... {
public class Job_BLL
...{
DAL.Job_DAL jobdal;
public DataSet Select_BLL()
...{
jobdal = new DAL.Job_DAL();
...{
return jobdal.Select_Job_Dal();
}
}
public DataSet Select_BLL(string jobid)
...{
jobdal = new DAL.Job_DAL();
...{
return jobdal.Select_Job_Dal(jobid);
}
}
public bool Update_BLL(Model.Job_Model job)
...{
jobdal = new DAL.Job_DAL();
try
...{
return jobdal.Update_Job_Dal(job);
}
catch (System.Exception ex)
...{
throw ex;
}
}
public bool Insert_BLL(Model.Job_Model job)
...{
jobdal = new DAL.Job_DAL();
try
...{
return jobdal.Insert_Job_Dal(job);
}
catch(System.Exception ex)
...{
throw ex;
}
}
public bool Delete_BLL(Model.Job_Model job)
...{
jobdal = new DAL.Job_DAL();
try
...{
return jobdal.Delete_Job_Dal(job);
}
catch(System.Exception ex)
...{
throw ex;
}
}
}
}
UI aspx页面
<%
@ Page Language
=
"
C#
"
AutoEventWireup
=
"
true
"
CodeFile
=
"
DataListDemo.aspx.cs
"
Inherits
=
"
DataListDemo
"
%>
<! DOCTYPE html PUBLIC " -//W3C//DTD XHTML 1.0 Transitional//EN " " http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd " >
< html xmlns = " http://www.w3.org/1999/xhtml " >
< head runat = " server " >
< title > 无标题页 </ title >
</ head >
< body >
< form id = " form1 " runat = " server " >
< div >
< asp:DataList ID = " DataList1 " runat = " server " DataSourceID = " ObjectDataSource1 " RepeatColumns = " 4 " RepeatDirection = " Horizontal " Width = " 720px " DataKeyField = " job_id " OnCancelCommand = " DataList1_CancelCommand " OnEditCommand = " DataList1_EditCommand " OnUpdateCommand = " DataList1_UpdateCommand " OnDeleteCommand = " DataList1_DeleteCommand " >
< ItemTemplate >
job_id: < asp:Literal ID = " Literal1 " runat = " server " Text = ' <%#Eval("job_id") %> ' ></ asp:Literal >< br />
job_desc: < asp:Literal ID = " Literal2 " runat = " server " Text = ' <%#Eval("job_desc") %> ' ></ asp:Literal >< br />
min_lvl: < asp:Literal ID = " Literal3 " runat = " server " Text = ' <%#Eval("min_lvl") %> ' ></ asp:Literal >< br />
max_lvl: < asp:Literal ID = " Literal4 " runat = " server " Text = ' <%#Eval("max_lvl") %> ' ></ asp:Literal >< br />
< asp:LinkButton ID = " LinkButton1 " runat = " server " CommandName = " Edit " > 编辑 </ asp:LinkButton >& nbsp; & nbsp; & nbsp; & nbsp;
< asp:LinkButton ID = " LinkButton2 " runat = " server " CommandName = " delete " > 删除 </ asp:LinkButton >
</ ItemTemplate >
< EditItemTemplate >
job_id: < asp:Literal ID = " Literal1 " runat = " server " Text = ' <%#Eval("job_id") %> ' ></ asp:Literal >< br />
job_desc: < asp:TextBox ID = " TextBox1 " runat = " server " Text = ' <%#Bind("job_desc") %> ' ></ asp:TextBox >< br />
min_lvl: < asp:TextBox ID = " TextBox2 " runat = " server " Text = ' <%#Bind("min_lvl") %> ' ></ asp:TextBox >< br />
max_lvl: < asp:TextBox ID = " TextBox3 " runat = " server " Text = ' <%#Bind("max_lvl") %> ' ></ asp:TextBox >< br />
< asp:LinkButton ID = " LinkButton3 " runat = " server " CommandName = " update " > 更新 </ asp:LinkButton >
< asp:LinkButton ID = " LinkButton4 " runat = " server " CommandName = " cancel " > 取消 </ asp:LinkButton >
</ EditItemTemplate >
</ asp:DataList >< asp:ObjectDataSource ID = " ObjectDataSource1 " runat = " server " DataObjectTypeName = " Model.Job_Model "
DeleteMethod = " Delete_BLL " InsertMethod = " Insert_BLL " SelectMethod = " Select_BLL "
TypeName = " BLL.Job_BLL " UpdateMethod = " Update_BLL " OnUpdating = " ObjectDataSource1_Updating " OnDeleting = " ObjectDataSource1_Deleting " OnUpdated = " ObjectDataSource1_Updated " ></ asp:ObjectDataSource >
< asp:Label ID = " Label1 " runat = " server " Text = " Label " Width = " 280px " ></ asp:Label >
& nbsp; & nbsp;
</ div >
</ form >
</ body >
</ html >
<! DOCTYPE html PUBLIC " -//W3C//DTD XHTML 1.0 Transitional//EN " " http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd " >
< html xmlns = " http://www.w3.org/1999/xhtml " >
< head runat = " server " >
< title > 无标题页 </ title >
</ head >
< body >
< form id = " form1 " runat = " server " >
< div >
< asp:DataList ID = " DataList1 " runat = " server " DataSourceID = " ObjectDataSource1 " RepeatColumns = " 4 " RepeatDirection = " Horizontal " Width = " 720px " DataKeyField = " job_id " OnCancelCommand = " DataList1_CancelCommand " OnEditCommand = " DataList1_EditCommand " OnUpdateCommand = " DataList1_UpdateCommand " OnDeleteCommand = " DataList1_DeleteCommand " >
< ItemTemplate >
job_id: < asp:Literal ID = " Literal1 " runat = " server " Text = ' <%#Eval("job_id") %> ' ></ asp:Literal >< br />
job_desc: < asp:Literal ID = " Literal2 " runat = " server " Text = ' <%#Eval("job_desc") %> ' ></ asp:Literal >< br />
min_lvl: < asp:Literal ID = " Literal3 " runat = " server " Text = ' <%#Eval("min_lvl") %> ' ></ asp:Literal >< br />
max_lvl: < asp:Literal ID = " Literal4 " runat = " server " Text = ' <%#Eval("max_lvl") %> ' ></ asp:Literal >< br />
< asp:LinkButton ID = " LinkButton1 " runat = " server " CommandName = " Edit " > 编辑 </ asp:LinkButton >& nbsp; & nbsp; & nbsp; & nbsp;
< asp:LinkButton ID = " LinkButton2 " runat = " server " CommandName = " delete " > 删除 </ asp:LinkButton >
</ ItemTemplate >
< EditItemTemplate >
job_id: < asp:Literal ID = " Literal1 " runat = " server " Text = ' <%#Eval("job_id") %> ' ></ asp:Literal >< br />
job_desc: < asp:TextBox ID = " TextBox1 " runat = " server " Text = ' <%#Bind("job_desc") %> ' ></ asp:TextBox >< br />
min_lvl: < asp:TextBox ID = " TextBox2 " runat = " server " Text = ' <%#Bind("min_lvl") %> ' ></ asp:TextBox >< br />
max_lvl: < asp:TextBox ID = " TextBox3 " runat = " server " Text = ' <%#Bind("max_lvl") %> ' ></ asp:TextBox >< br />
< asp:LinkButton ID = " LinkButton3 " runat = " server " CommandName = " update " > 更新 </ asp:LinkButton >
< asp:LinkButton ID = " LinkButton4 " runat = " server " CommandName = " cancel " > 取消 </ asp:LinkButton >
</ EditItemTemplate >
</ asp:DataList >< asp:ObjectDataSource ID = " ObjectDataSource1 " runat = " server " DataObjectTypeName = " Model.Job_Model "
DeleteMethod = " Delete_BLL " InsertMethod = " Insert_BLL " SelectMethod = " Select_BLL "
TypeName = " BLL.Job_BLL " UpdateMethod = " Update_BLL " OnUpdating = " ObjectDataSource1_Updating " OnDeleting = " ObjectDataSource1_Deleting " OnUpdated = " ObjectDataSource1_Updated " ></ asp:ObjectDataSource >
< asp:Label ID = " Label1 " runat = " server " Text = " Label " Width = " 280px " ></ asp:Label >
& nbsp; & nbsp;
</ div >
</ form >
</ body >
</ html >
UI CS代码
using
System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.ComponentModel;
public partial class DataListDemo : System.Web.UI.Page
... {
protected void Page_Load(object sender, EventArgs e)
...{
}
protected void DataList1_EditCommand(object source, DataListCommandEventArgs e)
...{
this.DataList1.EditItemIndex = e.Item.ItemIndex;
DataBind();
}
protected void DataList1_CancelCommand(object source, DataListCommandEventArgs e)
...{
this.DataList1.EditItemIndex = -1;
DataBind();
}
protected void ObjectDataSource1_Updating(object sender, ObjectDataSourceMethodEventArgs e)
...{
((Model.Job_Model)(e.InputParameters[0])).Job_id = job.Job_id;
((Model.Job_Model)(e.InputParameters[0])).Job_desc = job.Job_desc;
((Model.Job_Model)(e.InputParameters[0])).Min_lvl = job.Min_lvl;
((Model.Job_Model)(e.InputParameters[0])).Max_lvl = job.Max_lvl;
this.DataList1.EditItemIndex = -1;
DataBind();
}
Model.Job_Model job;
protected void DataList1_UpdateCommand(object source, DataListCommandEventArgs e)
...{
job = new Model.Job_Model();
job.Job_id = Convert.ToInt32(((Literal)(this.DataList1.Items[e.Item.ItemIndex].FindControl("Literal1"))).Text);
job.Job_desc = ((TextBox)(this.DataList1.Items[e.Item.ItemIndex].FindControl("TextBox1"))).Text;
job.Min_lvl = Convert.ToInt32(((TextBox)(this.DataList1.Items[e.Item.ItemIndex].FindControl("TextBox2"))).Text);
job.Max_lvl = Convert.ToInt32(((TextBox)(this.DataList1.Items[e.Item.ItemIndex].FindControl("TextBox3"))).Text);
ObjectDataSource1.Update();
}
protected void DataList1_DeleteCommand(object source, DataListCommandEventArgs e)
...{
job = new Model.Job_Model();
job.Job_id = Convert.ToInt32(((Literal)(this.DataList1.Items[e.Item.ItemIndex].FindControl("Literal1"))).Text);
ObjectDataSource1.Delete();
}
protected void ObjectDataSource1_Deleting(object sender, ObjectDataSourceMethodEventArgs e)
...{
((Model.Job_Model)(e.InputParameters[0])).Job_id = job.Job_id;
DataBind();
}
protected void ObjectDataSource1_Updated(object sender, ObjectDataSourceStatusEventArgs e)
...{
if (e.Exception != null)
...{
e.ExceptionHandled = true;
this.Label1.Text = e.Exception.Message;
}
}
}
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.ComponentModel;
public partial class DataListDemo : System.Web.UI.Page
... {
protected void Page_Load(object sender, EventArgs e)
...{
}
protected void DataList1_EditCommand(object source, DataListCommandEventArgs e)
...{
this.DataList1.EditItemIndex = e.Item.ItemIndex;
DataBind();
}
protected void DataList1_CancelCommand(object source, DataListCommandEventArgs e)
...{
this.DataList1.EditItemIndex = -1;
DataBind();
}
protected void ObjectDataSource1_Updating(object sender, ObjectDataSourceMethodEventArgs e)
...{
((Model.Job_Model)(e.InputParameters[0])).Job_id = job.Job_id;
((Model.Job_Model)(e.InputParameters[0])).Job_desc = job.Job_desc;
((Model.Job_Model)(e.InputParameters[0])).Min_lvl = job.Min_lvl;
((Model.Job_Model)(e.InputParameters[0])).Max_lvl = job.Max_lvl;
this.DataList1.EditItemIndex = -1;
DataBind();
}
Model.Job_Model job;
protected void DataList1_UpdateCommand(object source, DataListCommandEventArgs e)
...{
job = new Model.Job_Model();
job.Job_id = Convert.ToInt32(((Literal)(this.DataList1.Items[e.Item.ItemIndex].FindControl("Literal1"))).Text);
job.Job_desc = ((TextBox)(this.DataList1.Items[e.Item.ItemIndex].FindControl("TextBox1"))).Text;
job.Min_lvl = Convert.ToInt32(((TextBox)(this.DataList1.Items[e.Item.ItemIndex].FindControl("TextBox2"))).Text);
job.Max_lvl = Convert.ToInt32(((TextBox)(this.DataList1.Items[e.Item.ItemIndex].FindControl("TextBox3"))).Text);
ObjectDataSource1.Update();
}
protected void DataList1_DeleteCommand(object source, DataListCommandEventArgs e)
...{
job = new Model.Job_Model();
job.Job_id = Convert.ToInt32(((Literal)(this.DataList1.Items[e.Item.ItemIndex].FindControl("Literal1"))).Text);
ObjectDataSource1.Delete();
}
protected void ObjectDataSource1_Deleting(object sender, ObjectDataSourceMethodEventArgs e)
...{
((Model.Job_Model)(e.InputParameters[0])).Job_id = job.Job_id;
DataBind();
}
protected void ObjectDataSource1_Updated(object sender, ObjectDataSourceStatusEventArgs e)
...{
if (e.Exception != null)
...{
e.ExceptionHandled = true;
this.Label1.Text = e.Exception.Message;
}
}
}
其他的数据绑定控件(DetailsView,FormView,GridView),代码大同小异,他们都可以自动完成增删改查的功能,所以再这里就不写了。如果有朋友有更好的办法或者建议,可以留言交流一下。需要完整代码的朋友,可以留下EMAIL。