閱讀248 返回首頁    go 阿裏雲 go 技術社區[雲棲]


自定義帶結構的可序列化數據集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也就沒有結構(沒有結構不能存儲數據),這時這個類就起作用了.

最後更新:2017-04-02 00:06:38

  上一篇:go 當前時間的中文顯示
  下一篇:go javascript中函數(function)的用法