对于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();
  }
  }
  }
  }
  }
}


 

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; }
  }
  }
}


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;
  }
   
  }
  }
}


 

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;
  }
  }
  }
}


 

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>


 

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;
  }
  }
}


 其他的数据绑定控件(DetailsView,FormView,GridView),代码大同小异,他们都可以自动完成增删改查的功能,所以再这里就不写了。