(一).說明
在編程過程中有沒有遇到這樣的問題: 偶爾因為某種原因,數據庫表需要改一字段名稱。比如:將: 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>
/// 創(chuàng)建帶結構的表:customer
/// </summary>
private void builddatatables()
{
//
// 創(chuàng)建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也就沒有結構(沒有結構不能存儲數據),這時這個類就起作用了.謝謝!
新聞熱點
疑難解答