一步一步实现数据库到类的自动化映射(二) 类层次的设计 类的实现

本文介绍了如何设计一个框架,根据数据库表结构自动生成类代码,以简化数据库到类的映射。作者通过示例展示了如何使用自定义属性SqlFieldAttribute来描述类属性与数据库字段的映射关系,并提供了基类SqlDbRecordAbstract的实现,该基类包含保存和查询方法。此外,还讨论了事务操作的实现,以及如何通过工具类DbClassTool进行批量保存。
摘要由CSDN通过智能技术生成

一步一步实现数据库到类的自动化映射(一) 类层次的设计 类的实现

上一篇讲了很多废话,结果才讲到了工具类。实在是有点浪费大家的时间。这次我就不多说了。马上来看看设计思路:我的目标是设计完成后。这个框架要可以使用工具来根据数据库表的结构自动生成类的代码,以便减少工作量。因此,我打算把类设计成只包含表的字段的所需信息。其它保存、和查询的操作都在基类里实现(好像是废话,人人都是这样设计类的-_-!)。

因此,我要有一个Attribute类来说明类的属性对数据表之间的映射(NHibernate是用XML来说明的,我不想搞得那么麻烦、方便就好)。

以一段设计好的代码来说明一下问题。

/// <summary>

         ///字段  T_VarChar

         ///数据库里的数据类型 :VarChar ,SqlDbType :VarChar

         ///说明:  字段长度:60 字段小数位数0

         ///默认值:   是否允许为空:True

         /// </summary>

         public event EventHandler T_VarCharChanged;

         private string mT_VarChar=null;

         [SqlFieldAttribute(SqlDbType = System.Data.SqlDbType.VarChar,FieldName = "T_Name")]

         public string T_VarChar

         {

              get{ return mT_VarChar;}

              set

              {

                   mT_VarChar=value;

                   if (T_VarCharChanged!=null)

                       T_VarCharChanged(this,new EventArgs());

              }

         }

以上代码是一个类里的属性。他有一个自定义属性:

[SqlFieldAttribute(SqlDbType = System.Data.SqlDbType.VarChar,FieldName = "T_Namne")]

这个东西说明了以下信息:这个类的属性在数据库中将作为VarChar类型,它所映身到表的T_Name字段。

SqlFieldAttribute 类的定义如下:

public class SqlFieldAttribute : Attribute

     {

         public System.Data.SqlDbType SqlDbType = SqlDbType.VarChar;

         public string FieldName = "";

         public bool Saveable = true;

     }

子类还要重写(override) 基类的TableName方法,来获取这个类是映射哪一个表的。这个方法返回表名,如:

public override string TableName()

         {

              return "T_Test1";//这个类是对表T_Test1进行操作的。

         }

 

这样表和字段的映射关系都反映出来了,那么任何一个类都可以通过反射生成Sql语句来进行操作了。并且子类中就只包括了数据表的字段。这样将业要自动生成代码也是比较容易的。

 

重点来了:

本来InsertUpdate操作可以放在基类里实现在的。可是为了要实现“事务操作”(同时确保几个类的保存成功与失败)。还是要另外编写一个工具类来保存这些信息。

这里先不看工具类,先看看基类是怎么实现的。

using System;

using System.Data;

using YZPTool;

namespace YZPTool.Data

{

     /// <summary>

     /// SqlDbRecordAbstract 的摘要说明。

     /// </summary>

     public abstract class SqlDbRecordAbstract

     {

         private int m_id1 = 0;

         private int m_id2 = 0;

         public int ID

         {

              get{ return m_id1;}

         }

 

         public abstract string TableName();

 

         /// <summary>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值