最近刚学三层结构,我划分了表示层(winform 公司项目要求),逻辑层,数据访问层,然后加了一个封装数据库表的实体类(不太清楚概念)。
但是我觉得在逻辑层中,几乎是空的,除了创建数据访问层中某个实例,没有其他的操作,然后我在各层之间用DataTable来传递数据,但是我在数据访问层中获得的table是与数据库对应的,这样的话,我在表示层上要怎么处理?比如说,我要隐藏这个数据中的某一个列。需不需要在表示层上定义一个固定的表,然后再用从数据库中获得的数据去填充数据?还是直接将返回的数据设置为datagrid的数据源?

解决方案 »

  1.   

    呵呵,偶也不看不惯逻辑层,不想白养它就把CUT掉了,其实少许的逻辑可以放UI或DAL里的,这样就成了两层半,i like it!
      

  2.   

    1.表模式
    2.数据模式
    3.对象模式你用的表模式(NET中用的比较多 应为有DataSet等),实体类在对象模式中用的较多
    就是把数据表对象化~ ,其实实体类对你来说没什么意义~
    逻辑层 还是有用的~ UI层 和Access 层的逻辑 尽量移到 逻辑层中~ 小项目体现不出 ,业务较多的比较明显(不过大家好像都习惯把逻辑放在存储过程中 呵呵~)
      

  3.   

    谢谢楼上各位的解释
    但我不太明白的是,比如说我在数据访问层中做增加、删除、修改和查询操作,对数据库进行操作是使用存储过程的,然后返回datatable给逻辑层,这样的话,我在表现层上是直接显示这个datatable的数据,还是要进行设置呢?比如说我直接设置datagrid的datasource属性为从逻辑层返回的datatable数据,如果这样的话,我要设置这个数据中的某一个列不可见要怎么实现呢?(web中好像datagrid对每个列可以设置可见和不可见,但是我不知道在winform中,datagrid中对每个列的可见性如何设置?)
      

  4.   

    但我不太明白的是,比如说我在数据访问层中做增加、删除、修改和查询操作,对数据库进行操作是使用存储过程的,然后返回datatable给逻辑层,这样的话,我在表现层上是直接显示这个datatable的数据,还是要进行设置呢?比如说我直接设置datagrid的datasource属性为从逻辑层返回的datatable数据,如果这样的话,我要设置这个数据中的某一个列不可见要怎么实现呢?(web中好像datagrid对每个列可以设置可见和不可见,但是我不知道在winform中,datagrid中对每个列的可见性如何设置?)
    ----------------------
    你的意思是把facade做到UI里,不设model,然后把其他的bll都扔到dal里面?这样做性能倒是没问题,不过维护和扩展会很难......
      

  5.   

    我有设置了一个entity层,用来封装对数据库表中每个属性值的获取和设置?
    然后在表现层、逻辑层和数据层都引用这个entity层
    不知道和您说的model是不是一回事?土问一句:这样的话,是不是查询返回结果时是返回一个对象集合,然后通过IList来绑数据?
      

  6.   

    我有设置了一个entity层,用来封装对数据库表中每个属性值的获取和设置?
    然后在表现层、逻辑层和数据层都引用这个entity层
    不知道和您说的model是不是一回事?土问一句:这样的话,是不是查询返回结果时是返回一个对象集合,然后通过IList来绑数据?
    ------------------------------------------
    两个差不多是同一个东西.如果抛弃掉逻辑层,可以考虑直接用DataSet了,开发会更快,如果定义了entity class,应该是用的datareader吧,速度会快些,但扩展性的优势因为没有bll化为乌有。如果你用实体类,那么返回的结果是对象集合。
      

  7.   

    DataGrid 有Mappyingname 的,可以根据这个匹配的,如果不存在匹配就不会显示的。
    可以根据这个来是否现实相关列!
      

  8.   

    举个例子吧,说的更清楚一点.Model:把数据事例化
    using System;
    namespace CodematicDemo.Model.Folder
    {
    /// <summary>
    /// 实体类cdcurr 。(属性说明自动提取数据库字段的描述信息)
    /// </summary>
    public class cdcurr
    {
    public cdcurr()
    {}
    #region Model
    private string _curr;
    private string _name;
    private decimal _rate;
    private decimal _rate1;
    private string _ybitem;
    private string _yjitem;
    private string _ysitem;
    private string _yusitem;
    private string _yfitem;
    /// <summary>
    /// 
    /// </summary>
    public string curr
    {
    set{ _curr=value;}
    get{return _curr;}
    }
    /// <summary>
    /// 
    /// </summary>
    public string name
    {
    set{ _name=value;}
    get{return _name;}
    }
    /// <summary>
    /// 
    /// </summary>
    public decimal rate
    {
    set{ _rate=value;}
    get{return _rate;}
    }
    /// <summary>
    /// 
    /// </summary>
    public decimal rate1
    {
    set{ _rate1=value;}
    get{return _rate1;}
    }
    /// <summary>
    /// 
    /// </summary>
    public string ybitem
    {
    set{ _ybitem=value;}
    get{return _ybitem;}
    }
    /// <summary>
    /// 
    /// </summary>
    public string yjitem
    {
    set{ _yjitem=value;}
    get{return _yjitem;}
    }
    /// <summary>
    /// 
    /// </summary>
    public string ysitem
    {
    set{ _ysitem=value;}
    get{return _ysitem;}
    }
    /// <summary>
    /// 
    /// </summary>
    public string yusitem
    {
    set{ _yusitem=value;}
    get{return _yusitem;}
    }
    /// <summary>
    /// 
    /// </summary>
    public string yfitem
    {
    set{ _yfitem=value;}
    get{return _yfitem;}
    }
    #endregion Model }
    }
      

  9.   


    //生成和数据库的操作using System;
    using System.Data;
    using System.Text;
    using System.Data.SqlClient;
    using Maticsoft.DBUtility;//请先添加引用
    namespace CodematicDemo.DAL.Folder
    {
    /// <summary>
    /// 数据访问类cdcurr。
    /// </summary>
    public class cdcurr
    {
    public cdcurr()
    {}
    #region  成员方法 /// <summary>
    /// 得到最大ID
    /// </summary>
    public int GetMaxId()
    {
    return DbHelperSQL.GetMaxID("curr", "cdcurr"); 
    } /// <summary>
    /// 是否存在该记录
    /// </summary>
    public bool Exists(string curr)
    {
    StringBuilder strSql=new StringBuilder();
    strSql.Append("select count(1) from cdcurr where curr='"+curr+"'");
    return DbHelperSQL.Exists(strSql.ToString());
    } /// <summary>
    /// 增加一条数据
    /// </summary>
    public string Add(CodematicDemo.Model.Folder.cdcurr model)
    {
    //model.curr=GetMaxId();
    StringBuilder strSql=new StringBuilder();
    strSql.Append("insert into cdcurr(");
    strSql.Append("curr,name,rate,rate1,ybitem,yjitem,ysitem,yusitem,yfitem");
    strSql.Append(")");
    strSql.Append(" values (");
    strSql.Append("'"+model.curr+"',");
    strSql.Append("'"+model.name+"',");
    strSql.Append(""+model.rate+",");
    strSql.Append(""+model.rate1+",");
    strSql.Append("'"+model.ybitem+"',");
    strSql.Append("'"+model.yjitem+"',");
    strSql.Append("'"+model.ysitem+"',");
    strSql.Append("'"+model.yusitem+"',");
    strSql.Append("'"+model.yfitem+"'");
    strSql.Append(")");
    DbHelperSQL.ExecuteSql(strSql.ToString());
    return model.curr;
    } /// <summary>
    /// 更新一条数据
    /// </summary>
    public void Update(CodematicDemo.Model.Folder.cdcurr model)
    {
    StringBuilder strSql=new StringBuilder();
    strSql.Append("update cdcurr set ");
    strSql.Append("name='"+model.name+"',");
    strSql.Append("rate="+model.rate+",");
    strSql.Append("rate1="+model.rate1+",");
    strSql.Append("ybitem='"+model.ybitem+"',");
    strSql.Append("yjitem='"+model.yjitem+"',");
    strSql.Append("ysitem='"+model.ysitem+"',");
    strSql.Append("yusitem='"+model.yusitem+"',");
    strSql.Append("yfitem='"+model.yfitem+"'");
    strSql.Append(" where curr='"+model.curr+"'");
    DbHelperSQL.ExecuteSql(strSql.ToString());
    } /// <summary>
    /// 删除一条数据
    /// </summary>
    public void Delete(string curr)
    {
    StringBuilder strSql=new StringBuilder();
    strSql.Append("delete cdcurr ");
    strSql.Append(" where curr='"+curr+"'");
    DbHelperSQL.ExecuteSql(strSql.ToString());
    } /// <summary>
    /// 得到一个对象实体
    /// </summary>
    public CodematicDemo.Model.Folder.cdcurr GetModel(string curr)
    {
    StringBuilder strSql=new StringBuilder();
    strSql.Append("select  ");
    strSql.Append(" [curr],[name],[rate],[rate1],[ybitem],[yjitem],[ysitem],[yusitem],[yfitem] ");
    strSql.Append(" from cdcurr ");
    strSql.Append(" where curr='"+curr+"'");
    CodematicDemo.Model.Folder.cdcurr model=new CodematicDemo.Model.Folder.cdcurr();
    DataSet ds=DbHelperSQL.Query(strSql.ToString());
    model.curr=curr;
    if(ds.Tables[0].Rows.Count>0)
    {
    model.name=ds.Tables[0].Rows[0]["name"].ToString();
    if(ds.Tables[0].Rows[0]["rate"].ToString()!="")
    {
    model.rate=decimal.Parse(ds.Tables[0].Rows[0]["rate"].ToString());
    }
    if(ds.Tables[0].Rows[0]["rate1"].ToString()!="")
    {
    model.rate1=decimal.Parse(ds.Tables[0].Rows[0]["rate1"].ToString());
    }
    model.ybitem=ds.Tables[0].Rows[0]["ybitem"].ToString();
    model.yjitem=ds.Tables[0].Rows[0]["yjitem"].ToString();
    model.ysitem=ds.Tables[0].Rows[0]["ysitem"].ToString();
    model.yusitem=ds.Tables[0].Rows[0]["yusitem"].ToString();
    model.yfitem=ds.Tables[0].Rows[0]["yfitem"].ToString();
    return model;
    }
    else
    {
    return null;
    }
    }
    /// <summary>
    /// 获得数据列表
    /// </summary>
    public DataSet GetList(string strWhere)
    {
    StringBuilder strSql=new StringBuilder();
    strSql.Append("select [curr],[name],[rate],[rate1],[ybitem],[yjitem],[ysitem],[yusitem],[yfitem] ");
    strSql.Append(" FROM cdcurr ");
    if(strWhere.Trim()!="")
    { strSql.Append(" where "+strWhere);
    }
    return DbHelperSQL.Query(strSql.ToString());
    } /*
    /// <summary>
    /// 分页获取数据列表
    /// </summary>
    public DataSet GetList(int PageSize,int PageIndex,string strWhere)
    {
    SqlParameter[] parameters = {
    new SqlParameter("@tblName", SqlDbType.VarChar, 255),
    new SqlParameter("@fldName", SqlDbType.VarChar, 255),
    new SqlParameter("@PageSize", SqlDbType.Int),
    new SqlParameter("@PageIndex", SqlDbType.Int),
    new SqlParameter("@IsReCount", SqlDbType.Bit),
    new SqlParameter("@OrderType", SqlDbType.Bit),
    new SqlParameter("@strWhere", SqlDbType.VarChar,1000),
    };
    parameters[0].Value = "cdcurr";
    parameters[1].Value = "curr";
    parameters[2].Value = PageSize;
    parameters[3].Value = PageIndex;
    parameters[4].Value = 0;
    parameters[5].Value = 0;
    parameters[6].Value = strWhere;
    return DbHelperSQL.RunProcedure("UP_GetRecordByPage",parameters,"ds");
    }*/ #endregion  成员方法
    }}
    //bll给前台用
    using System;
    using System.Data;
    using CodematicDemo.Model.Folder;
    namespace CodematicDemo.BLL.Folder
    {
    /// <summary>
    /// 业务逻辑类cdcurr 的摘要说明。
    /// </summary>
    public class cdcurr
    {
    private readonly CodematicDemo.DAL.Folder.cdcurr dal=new CodematicDemo.DAL.Folder.cdcurr();
    public cdcurr()
    {}
    #region  成员方法 /// <summary>
    /// 得到最大ID
    /// </summary>
    public int GetMaxId()
    {
    return dal.GetMaxId();
    } /// <summary>
    /// 是否存在该记录
    /// </summary>
    public bool Exists(char curr)
    {
    return dal.Exists(curr);
    } /// <summary>
    /// 增加一条数据
    /// </summary>
    public string Add(CodematicDemo.Model.Folder.cdcurr model)
    {
    return dal.Add(model);
    } /// <summary>
    /// 更新一条数据
    /// </summary>
    public void Update(CodematicDemo.Model.Folder.cdcurr model)
    {
    dal.Update(model);
    } /// <summary>
    /// 删除一条数据
    /// </summary>
    public void Delete(char curr)
    {
    dal.Delete(curr);
    } /// <summary>
    /// 得到一个对象实体
    /// </summary>
    public CodematicDemo.Model.Folder.cdcurr GetModel(char curr)
    {
    return dal.GetModel(curr);
    } /// <summary>
    /// 获得数据列表
    /// </summary>
    public DataSet GetList(string strWhere)
    {
    return dal.GetList(strWhere);
    } /// <summary>
    /// 获得数据列表
    /// </summary>
    public DataSet GetAllList()
    {
    return dal.GetList("");
    } /// <summary>
    /// 获得数据列表
    /// </summary>
    //public DataSet GetList(int PageSize,int PageIndex,string strWhere)
    //{
    //return dal.GetList(PageSize,PageIndex,strWhere);
    //} #endregion  成员方法
    }
    }
      

  10.   

    学些学习 感谢感谢。只是我发现很多项目中  都用GetMaxId方法  这个到底是做什么的?我也是初学!