三层中如何返回实体

LuckyZhouStar
博客专家认证
2014-06-22 05:47:49

本人正在用三层做机房系统,D层是按数据库中的表来划分的,并且把所有的查询数据库的语句全部封装到了SQLHELPER中,但是现在出现个问题,因为三层是返回的是实体类,但是如果返回多条记录,比如说有一个关于学生上机记录的实体类,其中包含了学生卡号,上机时间等,如果要返回一个学生某段时间内上机记录的话,那么如何来返回实体呢?
又因为在sqlhelper中返回的是查出来的一张表datatable,怎么来改呢?有没有简单点的方法呢?可以商讨一下。
...全文
339 20 打赏 收藏 举报
写回复
20 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
moonwrite 2014-07-09
可以把datatable转换list<实体类> 不想一个一个敲代码的话,可以使用CodeSmith生成 如果刚刚起步,那么D可以使用EntityFramework返回的就是实体了
  • 打赏
  • 举报
回复
geyewei 2014-07-09
为什么说"因为返回的实体是不一样的。"这句话呀?
  • 打赏
  • 举报
回复
LuckyZhouStar 2014-07-08
引用 17 楼 geyewei 的回复:
避开你说的三层,仅仅讨论一下返回实体的事情,看看我对你的问题的理解有没有问题吧。 假设你的那个类是 class student 姓名 时间 其他东东 end class 那么在你的SQLHelper类里面加入 public function GiveMeMore(你的参数) as list(of student) dim retLst as new list(of student) 加入你的向retLst里面查数据处理 return retLst end function 这种方式是很好理解的吧。 当然了,你把 student 定义成类,结构体啥的,这都随你的需要了。 返回多条记录和返回一条记录都可以用这种方式,因为返回一条记录就是这个返回值里面只有一个元素,这样也可以说得通吧。 在处理返回值的地方,就用下面这种方式去接收吧 Class 另一个类 private sub 某个函数() dim helper = new sqlHelper() dim lst变量名称 = helper.GiveMeMore(参数。。。) end sub End Class 挺简单的吧。 如果你想再复杂一些,那么把返回值设计成XML文档结构吧,这样只要接收方知道XML结构,就可以解析了,至于加密解密啥的,这里就不讨论了。 我在实际开发中,有时候使用List,有时候使用自定义的DataTable,哪里需要什么就用什么呗。 顺便说一句,个人感觉,不使用SQLHelper的程序更舒服一些。
如果向你这么做的话,就不能够在用sqlhelper了,因为返回的实体是不一样的。
  • 打赏
  • 举报
回复
lovevb10 2014-07-07
利用DataSet设置结构后,通过读写属性ProPerty来操作就行。ProPerty属性是非常重要的工具。 它能全部读出来数据,然后,能够更改写入返回到当前DataSet中。 数据库只要Source属性来绑定DataSet就行, 这种方法就是高度集成化的方式。目的是以后能够快速掌握自己写的代码内容和易管理代码。 有时候自己写的庞大的代码,时间长了,无法短时间内识别和了解自己写的复杂代码程序,也面临付出抛弃代码重新要写的沉痛代价。 写一种程序有很多种优秀方式,所以,问题是要追求尽量集成化方法。
  • 打赏
  • 举报
回复
BrightFireOfCy 2014-07-07
引用 13 楼 ZHOUCHAOQIANG 的回复:
[quote=引用 12 楼 eaqpi 的回复:] 别用list了,用datatable吧。 简单的直接上个强类型的DATASET,多方便,连代码都不用写。
如果是那样的话,我就不在这里提问问题了,只不过是不想破坏三层架构 [/quote] 其实强类型的DATASET满好用的,把它作为各层之间数据传输的载体也不失为一个好办法
  • 打赏
  • 举报
回复
geyewei 2014-07-07
避开你说的三层,仅仅讨论一下返回实体的事情,看看我对你的问题的理解有没有问题吧。 假设你的那个类是 class student 姓名 时间 其他东东 end class 那么在你的SQLHelper类里面加入 public function GiveMeMore(你的参数) as list(of student) dim retLst as new list(of student) 加入你的向retLst里面查数据处理 return retLst end function 这种方式是很好理解的吧。 当然了,你把 student 定义成类,结构体啥的,这都随你的需要了。 返回多条记录和返回一条记录都可以用这种方式,因为返回一条记录就是这个返回值里面只有一个元素,这样也可以说得通吧。 在处理返回值的地方,就用下面这种方式去接收吧 Class 另一个类 private sub 某个函数() dim helper = new sqlHelper() dim lst变量名称 = helper.GiveMeMore(参数。。。) end sub End Class 挺简单的吧。 如果你想再复杂一些,那么把返回值设计成XML文档结构吧,这样只要接收方知道XML结构,就可以解析了,至于加密解密啥的,这里就不讨论了。 我在实际开发中,有时候使用List,有时候使用自定义的DataTable,哪里需要什么就用什么呗。 顺便说一句,个人感觉,不使用SQLHelper的程序更舒服一些。
  • 打赏
  • 举报
回复
LuckyZhouStar 2014-07-07
都能不能给个实例呢
  • 打赏
  • 举报
回复
LuckyZhouStar 2014-07-06
引用 12 楼 eaqpi 的回复:
别用list了,用datatable吧。 简单的直接上个强类型的DATASET,多方便,连代码都不用写。
如果是那样的话,我就不在这里提问问题了,只不过是不想破坏三层架构
  • 打赏
  • 举报
回复
eaqpi 2014-07-05
别用list了,用datatable吧。 简单的直接上个强类型的DATASET,多方便,连代码都不用写。
  • 打赏
  • 举报
回复
LuckyZhouStar 2014-07-04
引用 10 楼 BrightFireOfCy 的回复:
[quote=引用 8 楼 ZHOUCHAOQIANG 的回复:] [quote=引用 5 楼 sp1234 的回复:] 简单总结一下就是: 真正地面向“表现层、业务逻辑层”通讯而设计三层结构,你就应该扔掉那点“增删改查”的概念,学习真正的系统架构设计知识。
我不管BLL层的实体如何划分,我只是想知道,你在D层返回多条记录的时候怎么办?[/quote] lz,先想想看为啥3,4,5楼没有回答你这个问题。 你d层返回什么东西根本不重要,B层要啥数据你D层就返回啥数据,B层希望D层返回一个List你d层就返回list,要实体就返回实体。[/quote] 所有的东西都明白,可能当初理解错了把
  • 打赏
  • 举报
回复
BrightFireOfCy 2014-07-03
引用 8 楼 ZHOUCHAOQIANG 的回复:
[quote=引用 5 楼 sp1234 的回复:] 简单总结一下就是: 真正地面向“表现层、业务逻辑层”通讯而设计三层结构,你就应该扔掉那点“增删改查”的概念,学习真正的系统架构设计知识。
我不管BLL层的实体如何划分,我只是想知道,你在D层返回多条记录的时候怎么办?[/quote] lz,先想想看为啥3,4,5楼没有回答你这个问题。 你d层返回什么东西根本不重要,B层要啥数据你D层就返回啥数据,B层希望D层返回一个List你d层就返回list,要实体就返回实体。
  • 打赏
  • 举报
回复
吉普赛的歌 2014-06-24
引用 8 楼 ZHOUCHAOQIANG 的回复:
[quote=引用 5 楼 sp1234 的回复:] 简单总结一下就是: 真正地面向“表现层、业务逻辑层”通讯而设计三层结构,你就应该扔掉那点“增删改查”的概念,学习真正的系统架构设计知识。
我不管BLL层的实体如何划分,我只是想知道,你在D层返回多条记录的时候怎么办?[/quote]
引用 6 楼 liuchaolin 的回复:
List<T>是用来看的吗?
6楼就OK了, 不明白你想干什么
  • 打赏
  • 举报
回复
LuckyZhouStar 2014-06-23
引用 5 楼 sp1234 的回复:
简单总结一下就是: 真正地面向“表现层、业务逻辑层”通讯而设计三层结构,你就应该扔掉那点“增删改查”的概念,学习真正的系统架构设计知识。
我不管BLL层的实体如何划分,我只是想知道,你在D层返回多条记录的时候怎么办?
  • 打赏
  • 举报
回复
LuckyZhouStar 2014-06-23
引用 5 楼 sp1234 的回复:
简单总结一下就是: 真正地面向“表现层、业务逻辑层”通讯而设计三层结构,你就应该扔掉那点“增删改查”的概念,学习真正的系统架构设计知识。
求大神指点,有没有相关书籍推荐或者源码参考呢?谢谢了。
  • 打赏
  • 举报
回复
md5e 2014-06-22
List<T>是用来看的吗?
  • 打赏
  • 举报
回复
简单总结一下就是: 真正地面向“表现层、业务逻辑层”通讯而设计三层结构,你就应该扔掉那点“增删改查”的概念,学习真正的系统架构设计知识。
  • 打赏
  • 举报
回复
我没有贴出 tmPerson,也用不着贴出。这里已经用示例表明了,一个 Department 参数,需要牵涉到许多数据库表,而且还有许多用数据库表字段根本不能说明白的有创意的应用系统。但是这个BLL方法只有一个参数。 你刚学习什么“三层”,就满脑子只有数据表。实际上任何人学习信息系统编程,都非常数据数据库表增删改查,都会轻松使用什么DataTable、DataSet之类的。问题是,这太低级了。 BLL是业务逻辑层。设计BLL层的功能,根本就应该忘记你的什么“增删改查”,多了解点实事求是的系统设计。许多输入输出数据涉及许多个数据库、多个数据表,甚至真正大量实际的输入输出数据根本不是针对数据库的。
  • 打赏
  • 举报
回复
引用 楼主 ZHOUCHAOQIANG 的回复:
本人正在用三层做机房系统
晕死!你从哪里学习的“三层”。是看了一次坑爹的Petshop就模仿了?还是哪个培训班的资料呢?你的“三层”上的问题是病入膏肓了。 只要有BLL层,就是三层。而实体,就是BLL层的参数类型(包括输入参数、也包括输出参数)。 例如一个“设置某部门下的组织架构”的BLL服务,它的功能定义原型可能是这样的
public void SetUnit(Department dept);
而实体类型Department的定义则是
    public class Department
    {
        public Department()
        {
            this.branch = new ObservableCollection<Department>();
            this.staffs = new ObservableCollection<User.tmStaff>();
        }

        /// <summary>
        /// 部门名称(不允许重名)。
        /// </summary>
        public string BranchName { get; set; }

        /// <summary>
        /// 部门的显示名称(允许重名)。
        /// </summary>
        public string DisplayName { get; set; }

        /// <summary>
        /// 地址
        /// </summary>
        public string Address { get; set; }

        /// 下一级部门
        /// </summary>
        public ObservableCollection<Department> branch { get; set; }
        /// <summary>
        /// 用户列表
        /// </summary>
        public ObservableCollection<tmOrgMgr.User.tmStaff> staffs { get; set; }

    }

    public class tmStaff : tmPerson
    {
        ///<summary>
        ///角色
        ///</summary>
        public string[] Roles { get; set; }

        /// <summary>
        /// 当时用工作流即时通讯客户端时,是否启用语音朗读功能。
        /// </summary>
        public bool XLQQSpeechEnable { get; set; }

        /// <summary>
        /// 优先使用xlt模板。如果为false(默认),则优先使用xltx和xltm模板。
        /// </summary>
        public bool XltTemplatePriority { get; set; }

        /// <summary>
        /// 从客户端默认打开的Excel查询模板
        /// </summary>
        public string DefaultOpenQueryTemplates { get; set; }

        /// <summary>
        /// 绑定IP。这限制用户登录功能。
        /// </summary>
        public string[] BindIPs { get; set; }
    }
这里,虽然只是用 string[] 来表示每一个人所属的 Role 的集合,但是显然也会自动在 Role中添加新的定义,同时也单独为权限表增加记录。 于是这一个BLL方法,得到一个Department 参数,执行时它需要读写6个数据库表,而且还需要清理4个服务器缓存,还需要去更新之前5种档案信息(因为当BLL把这些人员数据保存之前,需要自动地先去处理人员调用问题)。 你敢说一个BLL就是处理一个数据库表? 你的那种“三层”概念,除了想到过数据库表的“增删改查”还有一点现实实用性吗?
  • 打赏
  • 举报
回复
LuckyZhouStar 2014-06-22
引用 1 楼 xiaobingking 的回复:
dim l as list(of SQLHELPER) 我是这么做的
能说明白点吗?我也想过用泛型列表
  • 打赏
  • 举报
回复
红衣老大 2014-06-22
dim l as list(of SQLHELPER) 我是这么做的
  • 打赏
  • 举报
回复
相关推荐
发帖
VB

1.6w+

社区成员

VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
帖子事件
创建了帖子
2014-06-22 05:47
社区公告
暂无公告