分享
 
 
 

使用属性和反射过渡从数据存取层到业务物件

王朝other·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

简介

当然,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)]

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有