最近在学习三层架构,有些地方不是很明白,还请高手写个标准的三层结构的例子,DataGrid或者DataList的都可以,请把代码尽量写得标准写,马上散分了。

解决方案 »

  1.   

    斗胆贴一个(基于存储过程),刚好也请大家批批:
    一、公共基类:
    using System;
    using System.Data;
    using System.Data.SqlClient;namespace WuJian2005.DataAccess
    {
        ///<summary>
        ///只列出了完成DataGrid绑定所需的相关方法,其它略
        ///</summary>
        public abstract class DBAccess
    {
    private string connectionstring;
    private SqlConnection conn;
    private SqlCommand cmd = new SqlCommand();
    private SqlDataAdapter da = new SqlDataAdapter();
    private DataSet ds = new DataSet();
    private DataTable dt = new DataTable(); #region 构造函数
    public  DBAccess(string input_connectionstring)
    {
    connectionstring = input_connectionstring;
    conn = new SqlConnection(connectionstring);
    }
    #endregion #region 无参数存储过程创建SqlCommand对象
    public SqlCommand BuildSqlCommand (string procedure_name)
    {
    try
    {
    cmd = new SqlCommand(procedure_name , conn);
    cmd.CommandType = CommandType.StoredProcedure;
    return cmd;
    }
    catch (Exception error)
    {
    throw error;
    }
    }
    #endregion #region 运行无参数存储过程(SELECT查询),返回一个DataTable
    public DataTable RunProcedure (string procedure_name , string table_name)
    {
    try
    {
    if(conn.State == ConnectionState.Closed)
    {
    conn.Open();
    }
    cmd = this.BuildSqlCommand(procedure_name);
    da = new SqlDataAdapter(cmd);
    da.Fill(ds,table_name);
    return ds.Tables[table_name];
    }
    catch(Exception error)
    {
    throw error;
    }
    finally
    {
    conn.Close();
    }
    }
    #endregion #region 为DataTable增加序号列(true:递增,false:递减),返回新的DataTable
    public DataTable AddNumber(DataTable table_object_name,string column_name,bool direction)
    {
    try
    {
    dt = table_object_name;
    //增加列
    dt.Columns.Add(column_name,System.Type.GetType("System.Int32"));
    if(direction == true)
    {
    //递增赋值
    for(int i=0;i<dt.Rows.Count;i++)
    {
    dt.Rows[i][column_name] = dt.Rows.Count-i;
    }
    return dt;
    }
    else
    {
    //递减赋值
    for(int i=dt.Rows.Count;i>0;i--)
    {
    dt.Rows[i-1][column_name] = i;
    }
    return dt;
    }
    }
    catch(Exception error)
    {
    throw error;
    }
    }
    #endregion
    }
    }二、业务逻辑:
    using System;
    using System.Data;
    using System.Data.SqlClient;namespace WuJian2005.DataAccess
    {
    /// <summary>
    /// AddressList 的摘要说明。
    /// </summary>
    public class AddressList : WuJian2005.DataAccess.DBAccess
    {
    #region 构造函数
    public AddressList() : base(System.Configuration.ConfigurationSettings.AppSettings["ConnectionString"])
    {
    //
    }
    #endregion #region 获取DataTable以绑定DataGrid
    public DataTable GetAllLinkman ()
    {
    //返回一个增加了递增序列号的DataTable
    return AddNumber(RunProcedure("pro_get_all_linkman","address_list"),"number",true);
    }
    #endregion
        }
    }三、UI层:
    ......
    private WuJian2005.DataAccess.AddressList myA = new WuJian2005.DataAccess.AddressList();

    private void Page_Load(object sender, System.EventArgs e)
    {
    if(!IsPostBack)
    {
    bindgrid();
    }
    } private void bindgrid()
    {
    this.dgrdAddressList.DataSource = myA.GetAllLinkman();
    this.dgrdAddressList.DataBind();
    }
    ......
      

  2.   

    怕代码帖不完,只帖了一个查询存储过程与DataGrid绑定的简单示例,自己琢磨出来的,还请大家多多指教。
      

  3.   

    看看MS自带三层示例petshop或多层示例duwamish或采用三层结构的开源项目communityserver中相关的部分吧,都做的比较成熟了。
      

  4.   

    1.aspx.cs文件
     private void Page_Load(object sender, System.EventArgs e)
    {
    if(!IsPostBack)
    {
    yourDataGrid.DataSource = yourClass.获取需要的数据的函数;
    yourDataGrid.DataBind();
    }
    }
    2. .cs 文件 public DataTable 获取需要的数据的函数 ()
    {
    //返回一个某个特定的记录集
    return dal.RunStore(存储过程名);
    }3.执行存储过程或者查询语句的层public DataTable RunStore(string storeName)
    {
    方法重略
    }
      

  5.   

    看不太懂,能不能有一个完整的三层结构的DataGrid的例子
      

  6.   

    个人觉得jyk的好理解,学习中
      

  7.   

    我自己写的,大家帮忙指正下,不知道这么写规范不?谢谢:D
    1数据层
    using System;
    using System.Data;
    using System.Data.SqlClient;
    using System.Configuration;namespace DBProject.DataGridTest.DbBase
    {
    /// <summary>
    /// Base 的摘要说明。
    /// </summary>
    public class Base
    {
    protected static string strConn=ConfigurationSettings.AppSettings["strConnection"];
    protected static string strSQL; protected static DataSet ExecuteSql(string strSQL)
    {
    SqlConnection myCn=new SqlConnection(strConn);
    try
    {
    myCn.Open();
    SqlDataAdapter sda=new SqlDataAdapter(strSQL,myCn);
    DataSet ds=new DataSet();
    sda.Fill(ds);
    return ds;
    }
    catch(System.Data.SqlClient.SqlException ex)
    {
    throw new Exception(ex.Message);
    }
    finally
    {
    myCn.Close();
    }
    }
    }
    }
    2逻辑层
    using System;
    using System.Data;
    using System.Data.SqlClient;
    using DBProject.DataGridTest.DbBase;namespace DBProject
    {
    /// <summary>
    /// Logic 的摘要说明。
    /// </summary>
    public class Logic:Base
    {
    public DataSet BindGird()
    {
    strSQL="select * from authors";
    DataSet ds;
    ds=ExecuteSql(strSQL);
    try
    {
    return ds;
    }
    catch
    {
    throw new Exception("连接错误!");
    }
    }
    }
    }
    3表现层
    private void Page_Load(object sender, System.EventArgs e)
    {
    // 在此处放置用户代码以初始化页面
    if(!(Page.IsPostBack))
    {
    GridBind();
    }
    } private void GridBind()
    {
    DataSet myDs;
    myDs=myLog.BindGird();
    dg_Test.DataSource=myDs;
    dg_Test.DataBind();
    }
      

  8.   

    kqww() ( )
    你的表示层中写的SQL算不算数据访问????
    这样就不行了。
      

  9.   

    ————————————————————————————
    http://www.81M.Net网页设计超市,你的问题或许里面能找到
    Http://Free.81M.Net免费空间站