CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  .NET技术 >  ASP.NET

_________关于三层结构中的数据层设计

楼主vvf031(努力)2006-07-10 12:21:44 在 .NET技术 / ASP.NET 提问

我的系统想分为三层结构,在写逻辑层时,看到有的资料介绍是要把它设计成对数据库操作的  
  不可再分的原子结构。  
   
  所以我就想把对每张表的添加、删除、筛选、更新等都放在这里用方法实现,可是每张表的结构不同,每次操作的字段也不同,所以想请教各位前辈一下,您们的数据层是如何设计的,希望能给个例子,谢谢! 问题点数:70、回复次数:41Top

1 楼vvf031(努力)回复于 2006-07-10 13:01:51 得分 0

自己顶!Top

2 楼winner2050(winner)回复于 2006-07-10 13:10:39 得分 2

3层结构是概念而已。  
  它展示的是一个面向对象的编程风格而已。怎么做,你觉得方便就好。  
   
  每个表的结构不通,但都能统一在表TableName,   字段Field,   查询条件Condition,   排序字段OrderBy,排序类型,这几个对象模型里面。  
   
  就象每个人都不一样,但都能统一到手脚眼鼻等等里Top

3 楼LighBlade(菜鸟加加油!!!)回复于 2006-07-10 13:20:34 得分 2

哎,又一个教条主义的受害者Top

4 楼clmilan(咔咔)回复于 2006-07-10 13:22:06 得分 2

方法的话只是写个框架,具体里面要用到哪个表什么的,都是你在调用这个方法的时候,传进去的。Top

5 楼vvf031(努力)回复于 2006-07-10 13:32:51 得分 0

不是,我的意思是说,具体实现的时候,方法该如何写,  
  比如我有两张表:user,news,我需不需要为每张表都写四个方法实现添加、删除、筛选、更新,还是写个比较统一的方法然后参数里面加上表名;还有就是当操作字段不同时,等等。  
   
  希望前辈们,能给出个具体的数据层操作的方法的小例子给看看,写个意思就行,我自己也能写,但是想看看有经验的前辈的写得比较规范、合理的方法。  
   
  实在感谢!  
  Top

6 楼lih163(做自己喜欢的事)回复于 2006-07-10 13:36:44 得分 2

倒Top

7 楼doitnow2000(大海)回复于 2006-07-10 13:37:36 得分 2

把对表的删、添、查、改写成一个通用的接口  
  这样就可以适应不用的表操作,我也是这么做的,  
  Top

8 楼vvf031(努力)回复于 2006-07-10 13:40:43 得分 0

我现在也是这么写的,不过好像这样的话,逻辑层和数据层的联系好像显得太紧密,如果为每张表都作个方法的话,又显得太庞杂,所以很困惑,想听听前辈们的意思,谢谢。Top

9 楼sandsboy(竹子)回复于 2006-07-10 13:41:41 得分 2

可以弄成ORMTop

10 楼zhangxiaopin(zxp)回复于 2006-07-10 13:41:46 得分 10

//****数据层  
  [Serializable]  
  public   class   TBSystemUser:ObjectExtion  
  {  
        public   TBSystemUsert(){}  
         
        public   TBSystemUser(SerializationInfo   info,   StreamingContext   context)  
        {  
                  //****序列化处理  
                  Deserialize(info,   context);  
        }  
   
        public   string   UserCode  
        {  
              get{  
                      if(GetValue("UserCode")!=null   &&   GetValue("UserCode").ToString()!="")  
                      {return   GetValue("UserCode");}  
                      else{return   "";}  
                }  
            set{  
                    SetValue("UserCode",value);  
            }  
        }  
  }  
   
   
  //****数据处理层  
  publi   class   RuleArivateData  
  {  
        private   TBSystemUser   mItem;  
   
        public   RuleArivateData()  
        {  
              mItem=new   TBSystemUser   ();  
        }  
   
   
        public   TBSystemUser   Item  
        {get{return   mItem;}  
          set{mItem=value;}  
   
   
      public   DbParamter   SQLdbParamter(DbParamterEnumType   EnumType)  
      {  
              DbParamter   dbParamter=new   DbParamter();  
   
              switch(EnumType)  
              {  
                        case   DbParamterEnumType.Insert://新增  
                                  dbParamter.CommandText="Proc_SystemUser_Insert";  
                                  dbParmter.CommnadType=CommandType.SortProduct  
                                  dbParamter.ProcParamter="@UserCode,@UserName";  
                                  break;  
   
              }  
              dbParamter.add("UserCode",mItem.userCode,30);    
              dbParamter.add("UserName",mItem.UserName,50);  
              return   dbParamter;  
      }  
      }  
   
  //****数据传输层  
   
  //****表示层  
   
    }Top

11 楼vvf031(努力)回复于 2006-07-10 13:46:16 得分 0

把对表的删、添、查、改写成一个通用的接口  
  这样就可以适应不用的表操作,我也是这么做的,  
   
  -----------------------------------------------------  
   
  我现在也是这么写的,不过好像这样的话,逻辑层和数据层的联系好像显得太紧密,如果为每张表都作个方法的话,又显得太庞杂,所以很困惑,想听听前辈们的意思,谢谢。  
   
  Top

12 楼llzhifly(狼)回复于 2006-07-10 14:03:48 得分 5

建议把增、删、查、改作为一个公用的方法封装成一个数据底层类里,其它各层调用即可  
  以表名、字段、字段值、条件作为参数传进  
   
  具体怎么实现,lz根据自己的实际情况而定Top

13 楼vvf031(努力)回复于 2006-07-10 14:11:25 得分 0

比如操作更新数据的方法:  
  public   bool     updata(string   tablename,string   ps,string   values)  
      {  
        string   str="updata"   +   tablename   +   "set   ("   +   ps   +   ")   values   ("   +   values   +")";  
        SqlDataAdapter   da   =new   SqlDataAdapter(conn);  
        da.UpdateCommand.CommandText=str;  
        da.UpdateCommand.ExecuteNonQuery();      
        return   true;        
      }  
   
  调用时:  
  updata("user","name,psd,role","'lxw','123','admin'")  
   
  我不知道我这样写和不合理?谢谢前辈们!Top

14 楼winner2050(winner)回复于 2006-07-10 14:43:58 得分 2

虽然不是很好,但也算行了。  
   
  等以后水平提高了传递参数就用对象了。Top

15 楼winner2050(winner)回复于 2006-07-10 14:46:13 得分 5

假设ModelInfo   是对象模型  
  BaseClass   是基类  
  BLLAdminModelAdd是BLL层的类  
  DALAdminModelAdd是DAL层的类  
   
  流程这样比较漂亮,我认为而已  
   
  BLLAdminModelAdd类中  
  public   void   Add(ModelInfo   model)  
  {  
  using   (TopWin.Common.BaseClass   base1   =   new   TopWin.Common.BaseClass())  
  {  
  new   DALAdminModelAdd   ().Add(model,   base1);  
   
  CommonClass.MsBox("添加成功",   "Admin_Model.aspx");  
   
  }  
  }  
  DALAdminModelAdd类中  
  public   void   Add(ModelInfo   model,   BaseClass   MyBase)  
  {  
  MyBase.MyExecuteNonQuery("TopWinBBS_AdminModelEdit",arrParameter);  
  }  
   
   
  WebUI  
   
  ModelInfo   info1   =   new   ModelInfo();  
  info1.Name   =   Model_Name.Text;  
  info1.Top   =   Top.Text;  
  info1.Foot   =   Foot.Text;  
  info1.Index   =   Index.Text;  
  info1.Board   =   Board.Text;  
  new   BLLAdminModelAdd   ().Add(info1);  
   
  Top

16 楼Cassava(车超)回复于 2006-07-10 15:25:18 得分 2

为每个表都生成添加、删除、筛选、更新的方法也可以,但不要手工写,否则会累死你,可以使用一些代码生成工具如:动软.Net代码自动生成器,CodeSmith,等,他们可以为每个表都生成添加、删除、更新等方法,并为每个字段都生成了属性等Top

17 楼dapanda()回复于 2006-07-10 15:33:05 得分 2

nhibernateTop

18 楼yuanweixiang()回复于 2006-07-10 15:39:30 得分 2

喜欢   Nhibernate    
  Top

19 楼huhong81312(小楼一夜听春雨)回复于 2006-07-10 15:58:20 得分 2

根据表结构不同写出对应的数据映射类,比如user表为2个字段username,password  
  则写成:  
  public   userData{  
        private   string   m_username;  
        public   string   UserName{  
                get{.....}  
   
        }  
  }Top

20 楼menuvb(戏子,白日做梦)回复于 2006-07-10 15:58:25 得分 1

逻辑三层。做成物理三层才强呢。呵Top

21 楼huhong81312(小楼一夜听春雨)回复于 2006-07-10 16:00:33 得分 2

然后使用类的反射机制来生成sql语句,和sql参数,如果用存储过程的话可以在头部定一类属性指定这个映射类采用那个存储过程来进行相应操作。Top

22 楼porsche616("︶.︶メ)海洋微風專用( ̄ε ̄メ)回复于 2006-07-10 16:13:51 得分 2

增删改查都用d存储过程写得~~Top

23 楼comerliang(天地良心)(性欲被自己倒分倒没了,以后再也不敢倒分了,想倒分的兄弟看看我的下场吧,男人没了性欲真不爽)回复于 2006-07-11 08:06:01 得分 0

根据表结构不同写出对应的数据映射类,比如user表为2个字段username,password  
  则写成:  
  public   userData{  
        private   string   m_username;  
        public   string   UserName{  
                get{.....}  
   
        }  
  }  
   
  哪不是要有多少表写多少个类?  
   
   
  Top

24 楼ls212(鲁四)回复于 2006-07-11 08:26:23 得分 1

把增加\删除\更新写成存储过程,写一个通用调用存储过程的类.Top

25 楼myminimouse(坚决不用baidu)回复于 2006-07-11 10:27:11 得分 1

upTop

26 楼nayc(不是牛太老,而是草太嫩)回复于 2006-07-11 10:48:20 得分 2

不是有多少个表就写多少个类,是写实体类Top

27 楼net205(人不可以无耻到这种地步)回复于 2006-07-11 12:46:30 得分 1

本人想听反射相关知识,愿介绍一二,谢谢Top

28 楼kgdiwss(∮明天去要饭)回复于 2006-07-11 13:10:00 得分 5

你看一下petshop就知道该怎么做了,其实就是把数据操作集中放在数据库中,逻辑层和表现层都不和数据库直接打交道,这样要改的话直接上数据层改,思路比较清晰,而在数据层中,你可以用一个类来实现直接对数据库的添加,删除等操作,其它类则调用这个类来实现具体的操作,这样就行了的.Top

29 楼kgdiwss(∮明天去要饭)回复于 2006-07-11 13:11:25 得分 0

三层只是为了方便以后的维护,使代码更清晰罢了,不能死套,你看petshop它还没用存储过程呢,难道说它就是个差项目吗?灵活运用就好了.Top

30 楼huhong81312(小楼一夜听春雨)回复于 2006-07-11 13:14:19 得分 0

comerliang:我以前自己做了个工具可以自己根据表结构生成实体类,非常爽的,人家做3小时我10分钟搞定了。  
  net205(向MVP学习!)   :http://blog.csdn.net/huhong81312/archive/2005/07/17/427618.aspx这里有个反射的例子,不过和这个问题中的我说的反射不同,但是总的来说都是大同小意。Top

31 楼vvf031(努力)回复于 2006-07-11 16:04:42 得分 0

谢谢大家,再放着讨论一下,谢谢Top

32 楼xiahouwen(武眉博<活靶子.NET>)回复于 2006-07-11 16:12:06 得分 2

http://blog.joycode.com/saucer/articles/77807.aspxTop

33 楼zhangshenghua(张胜华)回复于 2006-07-11 17:35:56 得分 2

目的在于实现数据层与逻辑层的编程的独立性,而不是设计的独立性,在设计上数据层还是不要脱离业务逻辑。搞清楚这一点很重要。  
  因此不建议数据层以表为对象,而要以紧密相关的若干表为对象,当然相关性切割应该由你来做决策,这是你的工作,我不知道答案。  
   
  仅供参考。Top

34 楼zhangshenghua(张胜华)回复于 2006-07-11 17:39:15 得分 0

nayc(骑白马的不一定是王子,他可能是唐僧。)   (   )   信誉:100     2006-07-11   10:48:00     得分:   0      
     
        不是有多少个表就写多少个类,是写实体类  
       
     
  ——这位兄弟说得言简意赅,跟我要表达的意思相似,支持。Top

35 楼jiangshaofen(网事无忧)回复于 2006-07-11 19:46:30 得分 2

可以使用SQLHELP的吗.把表写成对应的类.四个操作用存储过程.本人目前正在写一保险续期项目.asp.net2.0就是这样来写的.可以私下交流下QQ54154114Top

36 楼liusujian02(刘阿建)回复于 2006-07-12 16:57:58 得分 1

顶Top

37 楼fsdi0254qingyun()回复于 2006-07-12 17:52:08 得分 2

深深的祝福大家,早退休几年哇,我们菜鸟们也好减轻点压力!!!Top

38 楼lizhengjun555(李正军)回复于 2006-07-13 09:13:06 得分 2

三层结构只是参照,并不一定每个应用程序都得划分得这么清楚。我们在架构一个系统的时候,主要还是关注如何实现需求,以及如何更好的给用户提供好的界面和方便的操作方式,其次是软件代码如何才能够更加稳定,复用率更高。  
   
  我目前开发的几个系统都是采用微软的企业类库作为基础构件,里面有一般应用程序所常用到的基础功能,都不用自己开发了,只需要配置一下就OK,而我现在的系统用这个企业类库后,业务处理分摊到两块地方,一块是存储过程中,另外一块是窗体或者自定义用户控件中,我不再分出业务处理层或者数据访问层。Top

39 楼DTWUJP(建平.net)回复于 2006-07-13 15:25:38 得分 1

MARKTop

40 楼cbo5()回复于 2006-07-14 14:29:31 得分 1

1、为每一张表都生成增,删,改的方法,太繁琐,所以各式各样的代码自动生成器出现了  
  2、采用通用的一套架构,有现成的开源的,也可以自己做,难度要大一些。Top

41 楼vvf031(努力)回复于 2006-07-17 12:19:24 得分 0

谢谢各位前辈!!受益菲浅,谢谢!Top

相关问题

关键词

得分解答快速导航

  • 帖主:vvf031
  • winner2050
  • LighBlade
  • clmilan
  • lih163
  • doitnow2000
  • sandsboy
  • zhangxiaopin
  • llzhifly
  • winner2050
  • winner2050
  • Cassava
  • dapanda
  • yuanweixiang
  • huhong81312
  • menuvb
  • huhong81312
  • porsche616
  • ls212
  • myminimouse
  • nayc
  • net205
  • kgdiwss
  • xiahouwen
  • zhangshenghua
  • jiangshaofen
  • liusujian02
  • fsdi0254qingyun
  • lizhengjun555
  • DTWUJP
  • cbo5

相关链接

  • CSDN .NET频道
  • .NET类图书
  • C#类图书
  • .NET类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo