国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

使用屬性和反射過渡從數據存取層到業務物件

2019-11-18 12:01:38
字體:
來源:轉載
供稿:網友

  簡介
  當然,ado.net比起ado和oledb來說要簡單多了.我所知道的是打開connection我可以通過dataset和datareader讀取數據庫.當然你也可以通過你的需要來恢復數據.
  
  我意識到dataset功能強大而且能節省我的時間,但是我還是愿意選擇自己的方式了處理數據庫程序.我喜歡用一個類來調用方法去更新數據. 因此當用數據庫中的一條記錄的時候我就會創建一個物件實例,設置它的屬性和調用的的更新方法,就是這么簡單.
  
  但是這樣以來我不得不寫老多的代碼,業務物件類,數據庫更新代碼和數據庫讀取代碼.開始的時候,我沒有使用存儲過程更新數據庫,因此我要對沒一個業務物件來寫sql語句.在我修改數據庫或業務物件的時候,這樣的工作就顯得非凡的乏味.
  
  我的方案
  我的方案是以創建簡單的類開始的,是我寫較少的代碼來更新物件. 所有我做得就是增加字段的名字,值和類,然后生成sql語句. 當我結束這一切的時候,我一周都沉醉在快樂之中…
  
  可是當我開始使用sqlServer代替access的時候,我的情緒變化了.我不能使用單純的sql語句來更新我的物件,我不得不用存儲過程.不幸又開始了…我不得不創建成打的sql語句來更新物件.枯燥的工作又開始了…
  
  我注重到我能寫簡單的類來生成參數,正如sql語句生成類一樣.盡管這個方案能使我寫少一點的代碼,但是無論何時我的方案要是有所改動的話,我仍然要去檢查我的更新代碼.
  
  接著我有了在數據庫中如何創建持續化類的想法.使用屬性來描述數據庫的表,這樣屬性就可以被映射到表中的字段了.這樣我就可以僅僅修改業務物件類了.
  
  為了你更輕易讀懂,我把這篇文章分成了三部分.第一部分展示使用屬性來描述一個業務類.第二部分展示我是如何采集信息,最后我將展示完整的方案.
  
  I - Attributes
  attributes是用來描述裝配件,類,屬性,方法和字段的.在.net 架構里已經有些地方使用了.但是你可以創建自己的屬性.
  
  我使用attributes來描述一個類是如何被存儲到數據庫中的.在一個類中,我將指出那些屬性應該被持續化,正如存儲過程是如何更新數據庫的.為了描述表里的列,我在類的屬性里面使用了attributes. 列可以是一個簡單的數據字段,唯一的鍵或外鍵.
  
  如何創建自己的attribute?
  相當輕易,你可以創建一個繼續于System.Attribute的類.至于命名習慣你可以加上個Attribut后綴.當你創建一個attribute,你要知道該attribute如何被用.是否應該被用在類?屬性,或多個定義是答應的?
  
  現在是來看些代碼的時候了.這些attributes被用來描述一個業務物件類:
  
  using System;
  
  using System.Data;
  
  namespace DAL
  
  {
  
  [AttributeUsage(AttributeTargets.PRoperty)]
  
  public class BaseFieldAttribute : Attribute
  
  {
  
  string columnName;
  
  public BaseFieldAttribute(string columnName)
  
  {
  
  this.columnName = columnName;
  
  }
  
  public string ColumnName
  
  {
  
  get { return columnName; }
  
  set { columnName = value; }
  
  }
  
  }
  
  [AttributeUsage(AttributeTargets.Property)]
  
  public class DataFieldAttribute : BaseFieldAttribute
  
  {
  
  DBType dbType = DbType.String;
  
  int  size  = 0;
  
  public DataFieldAttribute(string columnName) : base(columnName)
  
  {
  
  }
  
  public DbType Type
  
  {
  
  get { return dbType; }
  
  set { dbType = value; }
  
  }
  
  public int Size
  
  {
  
  get { return size; }
  
  set { size = value; }
  
  }
  
  };
  
  [AttributeUsage(AttributeTargets.Property)]
  
  public class KeyFieldAttribute : BaseFieldAttribute
  
  {
  
  public KeyFieldAttribute(string columnName) : base(columnName)
  
  {
  
  }
  
  };
  
  [AttributeUsage(AttributeTargets.Property)]
  
  public class ForeignKeyFieldAttribute : BaseFieldAttribute
  
  {
  
  public ForeignKeyFieldAttribute(string columnName) : base(columnName)
  
  {
  
  }
  
  };
  
  [AttributeUsage(AttributeTargets.Class AttributeTargets.StrUCt)]
  
  public class DataTableAttribute : Attribute
  
  {
  
  string tableName;
  
  string updateStoredProcedure  = "";
  
  public DataTableAttribute(string tableName)
  
  {
  
  this.tableName = tableName;
  
  }
  
  public string TableName
  
  {
  
  get { return tableName; }
  
  set { tableName = value; }
  
  }
  
  public string UpdateStoredProcedure
  
  {
  
  get { return updateStoredProcedure; }
  
  set { updateStoredProcedure = value; }
  
  }
  
  }
  
  }
  
  正如你看到的,每個類的上面有個attributeusage attribute.它是來指示attribute是如何被使用的.
  
  我是如何使用這些 attribute來描述一個類的呢?
  
  假設你有一個應用來保存用戶和聯系的信息.在OO設計中,我們以一個Person來開始,那么聯系信息就是一個person加上地址和信息.用戶就是聯系信息加上購買信息. 當然用戶和別人是有依靠關系的.假如我在別的文章使用這些當然是相當愚蠢的.^_^
  
  這個類的代碼如下:
  
  using System;
  
  using System.Data;
  
  using DAL;
  
  namespace TestApp
  
  {
  
  public class Person
  
  {
  
  string name = "";
  
  int age = 0;
  
  int id = 0;
  
  [KeyField("id")]
  
  public int Id
  
  {
  
  get { return id; }
  
  set { id = value; }
  
  }
  
  [DataField("name", Size=50)]
  
  public string Name
  
  {
  
  get { return name; }
  
  set { name = value; }
  
  }
  
  [DataField("age")]
  
  public int Age
  
  {
  
  get { return age; }
  
  set { age = value; }
  
  }
  
  public override string ToString()
  
  {
  
  return string.Format("{0}, {1} years old", Name, Age);
  
  }
  
  }
  
  [DataTable("contact", UpdateStoredProcedure="sp_UpdateContact")]
  
  public class Contact : Person
  
  {
  
  string phone = "";
  
  string email = "";
  
  string address = "";
  
  string address2 = "";
  
  string city = "";
  
  string postalCode = "";
  
  string state = "";
  
  string country = "";
  
  [DataField("phone", Size=20)]
  
  public string Phone
  
  {
  
  get { return phone; }
  
  set { phone = value; }
  
  }
  
  [DataField("email", Size=80)]
  
  public string Email
  
  {
  
  get { return email; }
  
  set { email = value; }
  
  }
  
  [DataField("address", Size=80)]
  
  public string Address
  
  {
  
  get { return address; }
  
  set { address = value; }
  
  }
  
  [DataField("address2", Size=80)]
  
  public string Address2
  
  {
  
  get { return address2; }
  
  set { address2 = value; }
  
  }
  
  [DataField("city", Size=50)]
  
  public string City
  
  {
  
  get { return city; }
  
  set { city = value; }
  
  }
  
  [DataField("postalCode", Size=20)]
  
  public string PostalCode
  
  {
  
  get { return postalCode; }
  
  set { postalCode = value; }
  
  }
  
  [DataField("state", Size=4)]
  
  public string State
  
  {
  
  get { return state; }
  
  set { state = value; }
  
  }
  
  [DataField("country", Size=50)]

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 赣榆县| 昌都县| 铁岭市| 峡江县| 桓台县| 马山县| 教育| 深圳市| 台北县| 宜兰县| 赤峰市| 蓬莱市| 古浪县| 五家渠市| 永康市| 开远市| 南康市| 安远县| 汉源县| 肇源县| 平谷区| 沛县| 民权县| 潮州市| 宣汉县| 玛沁县| 安图县| 乌恰县| 车险| 佛坪县| 浮山县| 顺义区| 夏河县| 凤冈县| 大足县| 杨浦区| 沙洋县| 中牟县| 衡东县| 松潘县| 磐安县|