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




