最近刚学习了三层架构 ,在网上找了一个范例学习,在项目应用中遇到两个问题向大家请教:
我参考的范例:http://www.cnblogs.com/cresuccess/archive/2008/12/10/1351675.html1. 通用查询问题
    如何实现通用的查询,针对各数据库表,不同的字段,不同的查询条件。
如:
select * from tab where name='张三' and sex='男' and birthday between date1 and date2 or .....2. 表与表的关联
     表与表之间多数是通过ID进行关联的,如何能快速取得另一个表中的信息。
如:table1:  bid,name
table2:  sid,bid,name在操作table2的model时,如何更快捷地取得table1的name,只操作一个model.不知道有没表达清楚我的意思,最好能提供相应的案例,谢谢。

解决方案 »

  1.   

    你所说的跟三层架构没有直接关系。不管你从哪里个“范例”学个DAL写法,都是纠结于数据库表操作。而三层架构的含义,就是让你在设计表现层时不要去纠结于数据库表,根本不用去翻来覆去地纠缠什么DAL,而是抓住更重要的BLL层,仅仅设计表现层和业务逻辑层而不要纠缠DAL的写法。你真的学明白了三层架构了么?就算你使用最原始的ADO.NET的Sql语句,又有什么关系?仍然可能是非常清晰、通用、高效的三层架构。虽然操作数据库方面可以有很多方式,包括面向对象数据库方式(而非关系数据库方式),但是这些都是局限在DAL里边。跟三层架构美欧直接关系。你所看到的所谓“范例”假设只是告诉你如何操作关系数据库表,那么它就好象是用发霉了的烂茶叶冒充新采摘的龙井茶一样,欺负你不会喝茶。
      

  2.   

      架构是死的,人是活得,完全按照框架做出的程序,恐怕只能在内存里组织“连对象查询”了,这对性能的影响很大,但这种查询量并不大,可以先用框架凑合出结果,后期在改进时在底层的数据层增加专用的连表查询方法,对业务层进行很小的改动即可,界面层不需要任何调整。
      而如果在业务层写死sql语句方式,虽然“性能可以保持很高”,但初期编程很容易发生数据架构的变更,系统一大,往往把各个模块的程序员整的手忙脚乱,难免出差错。
      

  3.   

    如果你明知道数据库是sql server,那么写一个sql语句调用它就行了。别人爱用什么EF之类的就让别人去用好了。这对什么三层架构毫无影响!
      

  4.   

    2. 表与表的关联
      表与表之间多数是通过ID进行关联的,如何能快速取得另一个表中的信息。
    这完全属于sql的知识,和三层架构没什么关系
      

  5.   

    你说的第一个问题是SQL多条件查询?我可以选择多个条件查询 也可以选择一个查询?是这个意思?
    拼接一下SQL就可以了 参考
        /// <summary>
            /// 根据日期,资源名称,资源描述查询资源信息
            /// </summary>
            /// <returns></returns>
            public DataSet FN_SerchByDateAndType(Guid FolderId, NRModel.File model, string createdate, string endate)
            {
                string strSql = "select * from t_File where 1 =1 and FolderId=@FolderId";
                string strWhere = "";
                if (!string.IsNullOrEmpty(model.FileNam))
                {
                    strWhere += " and FileNam like @FileNam";
                }
                //if (!string.IsNullOrEmpty(model.Decription)k)
                //{
                //    strWhere += " and Decription like @Decription";
                //}
                if (!string.IsNullOrEmpty(createdate) || !string.IsNullOrEmpty(endate))
                {
                    strWhere += " and CreateOn between @createdate and @endate order by ModefyOn desc";
                }
                strSql += strWhere;
                SqlParameter[] parameters = {
                                    new SqlParameter("@FolderId", SqlDbType.UniqueIdentifier),
                                    new SqlParameter("@FileNam", SqlDbType.NVarChar, 256),
                                    new SqlParameter("@createdate", SqlDbType.NVarChar),
                                    new SqlParameter("@endate", SqlDbType.NVarChar)
                            };
                parameters[0].Value = FolderId;
                parameters[1].Value = "%" + model.FileNam + "%";
                //parameters[1].Value = "%" + model.Decription + "%";
                parameters[2].Value = createdate;
                parameters[3].Value = endate;
                return DbHelperSQL.Query(strSql, parameters);
                //SqlParameter[] parameters = new SqlParameter[4];
                //parameters[0] = new SqlParameter("@FileNam", model.FileNam);
                //parameters[1] = new SqlParameter("@stardate", createdate);
                //parameters[2] = new SqlParameter("@enddate", endate);
                ////执行存储过程
                //return DbHelperSQL.RunProcedure("P_UserSerch", parameters, "t_File");
            }第2个问题属于SQL问题在DAL层拼接好SQL语句就可以了.select 表1.字段,表2.字段from 表1,表2 where 表1.ID=表2.ID 差不多就是这个意思