与DotNet数据对象结合的自定义数据对象设计(二) 数据集合与DataTable

在上篇Blog中介绍了如何定义一个与DataRow相结合的数据类,那么本篇将介绍如何定义一个与 DataTable对应的数据集合。

在DotNet中提供了一个CollectionBase作为我们定义强类型的数据集合的抽象类,在DotNet1.1中要定 义一个强类型的数据集合就必须为每一种数据类定义一个对应的数据集合,在2.0中增加了泛型的功能后 ,这个问题得到了解决。又由于在目前的Ibatisnet版本中还不支持泛型的功能,所以数据集合可以选择 从ArrayList或CollectionBase继承下来。但是不管是ArrayList还是CollectionBase都不支持序列化,也 是他们都有没有Serializable属性,那么实现的数据集合也将无法实现序列化,所以这边选择直接实现 IList接口,内部再实例化一个ArrayList做为数据容器。类的定义如下:

public class ObjectList : IList, ISerializable{}

还有一需要解决的问题是,数据类如何与DataTable对应起来呢?在数据类定义一个DataTable的属性 和内部变量,做为存储数据的容器。

1private DataTable m_dataTable = null;
2/**//// <summary>
3         /// Gets the data table form.
4        /// </summary>
5        /// <value>The data table form.</value>
6        public DataTable DataTableForm
7        {
8            get { return m_dataTable; }
9     }
10

因为前面有提到了,一个对象对应一个DataRow,当前一个对象单独存在时,它的数据存放在数据类的 数据容器里,而当中被加到一个集合里时,数据行就应该存放在数据集合对应的DataTable里了。那要怎 么转换呢?很简单,只需要把数据行从原来(数据类的数据容器)的表里面复制到ObjectList对应的 DataTable里,然后将原来的行删除就行了。这里复制一行数据也是有学问的,因为一个DataRow一旦创建 了,它就只能被加入到创建它的那个DataTable里,当它被加入到另外一个表里就会抛出它同时只能属于 一个表的异常,而如果是DataRow里的数据一列一列地复制到另一个DataRow,就会对性能造成非常大的影 响。最理想的办法就是数据不动,只改变DataRow记录的一个状态信息就行了。这里的改变行状态的办法 就是NewRow,而数据不动的办法就是将源Row的ItemArray属性赋值给目的的ItemArray。经过测试,这样 做可以减少1倍以上的时间成本(内存成本也一样)。

具体的添加方法如下:

1private void AddObjectRowToListTable(IDataObject p_dataObject)
2        {
3            if (m_dataTable == null)
4                m_dataTable = p_dataObject.DataContainer.Clone();
5            DataRow m_newRow = m_dataTable.NewRow();
6            m_newRow.ItemArray = p_dataObject.ObjectRow.ItemArray;
7            /**//***********************************************
8            * 使用上面代 码时间性能会比下面的高一倍
9            * for (int i = 0; i < p_dataObject.ObjectRow.ItemArray.Length; i++)
10               {
11                m_newRow[i] = p_dataObject.ObjectRow.ItemArray[i];
12                }
13            * ********************************************/
14
15            m_dataTable.Rows.Add(m_newRow);
16            p_dataObject.ObjectRow.Delete ();
17            p_dataObject.ObjectRow.Table.AcceptChanges();
18             p_dataObject.ObjectRow = m_newRow;
19        }
20

时间: 2024-09-09 10:28:54

与DotNet数据对象结合的自定义数据对象设计(二) 数据集合与DataTable的相关文章

DotNet数据对象结合的自定义数据对象设计(一) 数据对象与DataRow

用Dotnet做开发,不少程序员都在为是用DataSet,DataTable,DataRow(以下简用:DotNet数据对象) 作为项目的数据承载对象还是使用自定义的数据类和自定数据集合而犯难,社区中也有相关话题的不少讨 论.前者作为Ado.net标准的数据集对象,本身有非常强大的功能,但也存在不少的问题,如:弱类型, 非面向对象,数据类对象体积相对较大等.所以不少的设计人员选择了使用了自定义数据类和数据集作为 自己项目的数据承载对象,解决上面的问题的同时也出现了一些其它的问题,比如:数据类编写

socket-C#如何使用Socket自定义TCP/IP报文收发数据?

问题描述 C#如何使用Socket自定义TCP/IP报文收发数据? 小弟刚刚工作,第一个项目用到了Socket,但客户给的文档我没懂,文档截图如下: 请问报文结构应该怎样设计?应该自定义结构体再通过Marshal对象转换成byte[]发送吗?那么用户名和密码的数据结构应该怎样设计呢?CRC16要怎样生成呢? 解决方案 构成byte数组,然后发送 sockdet中都是byte结构 解决方案二: 这种协议性的东东最好是去问客户,或者先按简单的结构体实现出来,再与客户进行联调. 联调是最直接的方法,C

数据表设计-数据库设计:数据表的对象的属性

问题描述 数据库设计:数据表的对象的属性 问题比较简单, 在某个地区有A1.B.C.D.E等区域District,每个区域中又分几个小区域Region(如东西南北),在程序设计中,每个Region中都有两个属性(一个是工作完成的日期,一个是此Region所属的District),然后此Region中就是它每一天所对应的工作数据, 另一方面,每个District对象中也有一些属性值,这此"属性"下都只有一个值. 我想问一下,这样的结构应该怎样来设计数据库? District和Region

javaweb-通过request获取表单数据,但封装不到对象中,求大神解答!

问题描述 通过request获取表单数据,但封装不到对象中,求大神解答! # User类有username和password两个属性,封装的时候只能封装进去password,输出map的值的时候,里面是有的-- 以下是封装语句: User form = CommonUtils.toBean(request.getParameterMap(),User.class); 以下是CommonUtils类的toBean()方法:(不允许使用尖括号,泛型就用圆括号代替了-) public static (

数据爆炸时代云计算厂商的对象存储“勇担当”

对象存储在企业级存储领域的应用处于早期阶段,但增长的趋势十分明显.IDC预测在2017年到2021年期间,全球软件定义存储市场的复合年增长率将达到13.5%,到2021年收入接近162亿美元. 自从20世纪90年代中期首次提出概念,对象存储已经成为最大规模应用的数据存储方法之一.在软件定义存储市场中,下一代云数据中心的要求正在有力地推动对象存储的发展. 毋庸置疑,我们现在处于一个数据爆炸的年代,特别是非结构化数据(图片.视频.归档以及企业级备份等各种数据)成为企业数据的重要组成部分.这种海量数据

中科云网定增对象换血 25亿投资新媒体大数据

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 中科云网定增对象换血 25亿投资新媒体大数据 见习记者 蒙湘林 中科云网(002306)今日发布复牌公告,同时公布了新的非公开发行股票预案,计划以不低于6.18元/股的价格发行不超过4亿股.与此前不同,此次非公开发行的对象为天晟鼎合.中金达合.中金宇合.新余宏兴成.新余顺兴隆.新余顺全隆和波巴贸易7名特定对象,所有发行对象均以现金方式认购,限

前端传来的json格式的数据在Action中赋给对象的属性报转换错误,如何转换

问题描述 前端传来的json格式的数据在Action中赋给对象的属性报转换错误,如何转换 解决方案 TYPE不是JSON格式把?贴出来JSON 解决方案二: Json格式对象转换为XML 解决方案三: 这些数据为什么都有","?这明显不是json格式的!

阿里云正考虑在欧洲建设数据中心,德国是考虑对象之一

摘要: 据新浪科技,阿里云正考虑在欧洲建设数据中心,德国是考虑对象之一,阿里云与德国电信(Deutsche Telekom)的相关合作正在洽谈当中. 昨天在德国汉诺威的 CeBIT 上,马省长刚刚在德国的 据新浪科技,阿里云正考虑在欧洲建设数据中心,德国是考虑对象之一,阿里云与德国电信(Deutsche Telekom)的相关合作正在洽谈当中. 昨天在德国汉诺威的 CeBIT 上,马省长刚刚在德国的默克尔总理与中国的马(凯)总理面前刷脸买了张邮票.按照过去中国官方代表团到哪投哪的惯例,除了数据中

R语言如何实现输出数据框里的特定值对象 急求大家帮助,万分感谢!

问题描述 R语言如何实现输出数据框里的特定值对象 急求大家帮助,万分感谢! 5C 对于一个数据框X,其有三个属性{abc}如下:a b c1 2 22 3 34 2 55 5 62 1 76 2 73 6 8如何实现把属性b=2的全部对象输出:a b c1 2 24 2 56 2 7急求大家帮助,万分感谢! 解决方案 不知道你的数据源是什么,这里用矩阵试了一下: 参考:<R语言入门>矩阵元素定义及筛选