自定义带结构的可序列化数据集DataSet

简介:
自己定义DataSet的列字段名称: 就是建立一个类,并让此类继承DataSet. 并预先给DataSet添加一些自定义的列. 有两个优点:

    1. 在引用时,直接引用: DataSet.Table[0].Row[0][Customer.Name]; 而不是: DataSet.Table[0].Row[0]["CustomerName"]; 这样,如果数据库字段名称变化时(将CustomerName改为CusName),则只需修改: Customer类的属性Name的值即可,没必要在整个程序中一个一个地搜索. 节省时间,易于维护.

    2. 经常用在 添加/新增 界面中,在添加之前没有从数据库获得数据给DataSet,即客户端 与数据库交互是单向的,即只从客户端往数据库发送数据. 这时,DataSet的内部结构没有定义. 就得用自定义DataSet结构了, 定义好结构 后就可以添加数据,最后送到数据库.

(一).说明
  在编程过程中有没有遇到这样的问题:  偶尔因为某种原因,数据库表需要改一字段名称。比如:将: Name改为: PersonName.
  接下来程序员就把所有涉及到的代码打开,找到类似: ds.Table[0].Row[n]["Name"]的语句,修改成: ds.Table[0].Row[n]["Name"].
  其实完全可以不用这么做,只加一个带结构的DataSet就OK了。  修改只修改本类代码文件中的一个属性就OK了,而且除本类代码文件
  之外的应用程式代码根本不用修改.
(二).代码:
 
using System;
using System.Data;
using System.Runtime.Serialization;

namespace SchemeDataSet
{
 /// <summary>
 /// 包含客户信息的自定义的可序列化的数据集(DataSet)

 /// </summary>
 [System.ComponentModel.DesignerCategory("Code")]
 [SerializableAttribute]
 public class Customers : DataSet    //继承DataSet,这样可以调用DataSet中的所有方法
 {
  #region 以下为常量的声明
  
  /// <summary>常量定义客户资料表 Customer 的表名称</summary>
  public const string CRMPSCUSTOMERS_TABLE = "Customer";

  /// <summary>该常量定义客户编号的栏位名</summary>
  public const string CUSNO_FIELD = "CUSNO";

  /// <summary>该常量定义客户名称的栏位名</summary>
  public const string CUSTOMERNAME_FIELD = "CustomerName";

  /// <summary>该常量定义客户地址的栏位名</summary>
  public const string ADDRESS_FIELD = "Address";
  
  #endregion 以下变量、常量、及对象的声明


  #region 以下为方法声明


  public Customers()
  {
      BuildDataTables();
  }

  /// <summary>
  ///     支持序列化的构造函数

  ///     <param name="info">对象的序列化信息</param>
  ///     <param name="context">关于被呼叫方法的上下文</param>
  /// </summary>
  private Customers(SerializationInfo info, StreamingContext context) : base(info, context)
  {}

  /// <summary>
  /// 创建带结构的表:Customer
  /// </summary>
  private void BuildDataTables()
  {
   //
   // 创建CRMPSCustomers的数据表
   //

   DataTable table = new DataTable(CRMPSCUSTOMERS_TABLE);
   DataColumnCollection columns = table.Columns;

   //定义结构
   columns.Add(CUSNO_FIELD,typeof(System.String));
   columns.Add(CUSTOMERNAME_FIELD,typeof(System.String));
   columns.Add(ADDRESS_FIELD,typeof(System.String));

   this.Tables.Add(table);
   Contact contact = new Contact();
   this.Merge(contact);   //合并
  }

  #endregion 以下为方法声明

 }
}


(三).使用
1.
  当定义了这样一个类后,在程式中应该这样使用: 
  ds.Table[Customers.CRMPSCUSTOMERS_TABLE].Row[n][Customers.CUSTOMERNAME_FIELD];
  这样就把所有的任务交给本类代码文件了。  当修改数据库时不用修改类似这些语句。 只修改一下结构类相关属性的值即可.
 2.
 定义此带结构的数据集,还有一种情况用到,就是在有些界面,UI层与数据库交互是单向的,即往数据库添加数据之前
 没有读取架构,则DataSet也就没有结构(没有结构不能存储数据),这时这个类就起作用了.

目录
相关文章
|
2月前
|
Java
LocalDateTime的全局自定义序列化
LocalDateTime的全局自定义序列化
|
1月前
|
消息中间件 存储 负载均衡
Kafka【付诸实践 01】生产者发送消息的过程描述及设计+创建生产者并发送消息(同步、异步)+自定义分区器+自定义序列化器+生产者其他属性说明(实例源码粘贴可用)【一篇学会使用Kafka生产者】
【2月更文挑战第21天】Kafka【付诸实践 01】生产者发送消息的过程描述及设计+创建生产者并发送消息(同步、异步)+自定义分区器+自定义序列化器+生产者其他属性说明(实例源码粘贴可用)【一篇学会使用Kafka生产者】
166 4
|
1月前
|
消息中间件 分布式计算 Kafka
硬核!Apache Hudi中自定义序列化和数据写入逻辑
硬核!Apache Hudi中自定义序列化和数据写入逻辑
33 1
|
2月前
open-feign自定义反序列化decoder
open-feign自定义反序列化decoder
55 0
|
4月前
open-feign自定义反序列化decoder
open-feign自定义反序列化decoder
130 0
|
7月前
|
缓存 NoSQL Java
SpringBoot自定义redisTemplate的key和value的序列化方式
SpringBoot自定义redisTemplate的key和value的序列化方式
103 0
|
9月前
|
Python
【Django学习】(九)自定义校验器_单字段_多字段校验_模型序列化器类
【Django学习】(九)自定义校验器_单字段_多字段校验_模型序列化器类
|
PHP
PHP:laravel日期序列化自定义默认日期格式
PHP:laravel日期序列化自定义默认日期格式
185 0
|
存储 算法 Java
java 序列化机制和自定义序列化
java 序列化机制和自定义序列化
|
JSON 前端开发 Java
SpringBoot2.x系列教程16--SpringBoot中自定义JSON序列化器和反序列化器
前言 在上一章节中,壹哥 给大家介绍了在SpringMVC框架中,我们可以使用HttpMessageConverter转换器类来转换HTTP请求和响应信息,并且可以实现对JSON信息的格式转换。我们知道,JSON是前后端信息传输的主要载体,我们大多数传递的参数都是利用JSON完成的,所以JSON是非常重要和常用的。而JSON信息本身也比较复杂,其中有些细节需要我们注意,比如JSON的序列化和反序列化。 一. 序列化与反序列化简介 1. 概述 HttpMessageConverter在转换http请求和响应的过程中,可以将对象转为JSON,这个过程我们可以称之为序列化;反过来也可以将JSON转为
1751 0

热门文章

最新文章