数据表中的数据实体类

这个博客介绍了数据项类`DataItem`和与数据库表紧密相关的实体类`DataTableObject`,它们用于封装数据库字段和值,支持SQL语句中的值表示。实体类提供了数据的获取、设置和数据库操作(如加载、插入、更新、删除)。同时,博客还展示了数据库工厂接口`IDatabaseFactory`及其实现`OracleFactory`,用于创建数据库连接、命令和适配器。
摘要由CSDN通过智能技术生成
在写基于数据库的程序中发现,通常关系数据库中一个表可以抽象为一个类,数据表中的每条数据都可以看做是该类的一个实例。
例如用户表Users有三个字段:id(varchar2),name(Varchar2),age(number)。用户理所当然要抽象成一个类(当然,这里谈的是面向对象设计),而该类的数据成员应该是Users表中的三个字段。至于用户类的方法,总少不了增删改查这些操作,例如添加新用户,修改用户信息,查询用户等等。
问题来了,如果我们有N个表,要对这N个表进行操作,写N个类,他们的数据成员(其实就是数据表字段)不一样,却有着一些相同的方法(增删改查),是不是要给每一个类一一地写这些实现呢?如果N>10,你是否感觉很累呢?以后如果还有类似的项目,你又要重新再写N个类,买噶的,我都要疯了,不知道你有何感想?
我们是程序员,但不能傻傻的闷声写程序,那样键盘敲破了都不会有进步。写程序之前,想一想,我的代码怎么样才能设计的更加精巧更加容易复用呢?
我在前面的博客中好像写过利用抽象工厂模式实现不同数据库的自由切换(?时间太长,不大记得了)。这里再写一个抽象的数据表数据实体类作为基类,为他的每个子类实现增删改查这些数据库操作,子类只要向基类传入表名和列名就可以了。这样,以后每个项目你都不用再染指关于数据库的东西了。

首先是一个数据项类,该类把列名和数据绑定起来,方便操作。
  1. /// <summary>
  2.     /// 数据项类 包括数据库字段名称和值
  3.     /// </summary>
  4.     public class DataItem
  5.     {
  6.         private static IDatabaseFactory m_fac = SqlHelper.CreateDatabaseFactory(); //这个数据库抽象工厂,会在后面列出来
  7.         private readonly string m_name;
  8.         private object m_value;
  9.         /// <summary>
  10.         /// 构造 数据项实例
  11.         /// </summary>
  12.         /// <param name="name">数据库字段名称</param>
  13.         public DataItem(string name)
  14.         {
  15.             this.m_name = name;
  16.         }
  17.         /// <summary>
  18.         /// 获取 数据库字段名称
  19.         /// </summary>
  20.         public string Name
  21.         {
  22.             get { return m_name; }
  23.         }
  24.         /// <summary>
  25.         /// 获取或设置 字段对应的值
  26.         /// </summary>
  27.         public object Value
  28.         {
  29.             get { return m_value; }
  30.             set { m_value = value; }
  31.         }
  32.         /// <summary>
  33.         /// 获取 值在SQL语句中的字符串表示
  34.         /// </summary>
  35.         public string ValueSqlString
  36.         {
  37.             get
  38.             {
  39.                 if (m_value == null)
  40.                 {
  41.                     return "null";
  42.                 }
  43.                 else if (m_value.GetType() == typeof(string))
  44.                 {
  45.                     return "'" + m_value.ToString().Replace("'","''") + "'";
  46.                 }
  47.                 else if (m_value.GetType() == typeof(int))
  48.                 {
  49.                     return m_value.ToString();
  50.                 }
  51.                 else if (m_value.GetType() == typeof(DateTime))
  52.                 {
  53.                     return m_fac.ToDBTimeString(Convert.ToDateTime(m_value));
  54.                 }
  55.                 else
  56.                 {
  57.                     return "null";
  58.                 }
  59.             }
  60.         }
  61.         public override string ToString()
  62.         {
  63.             return m_name + "="+ValueSqlString;
  64.         }
  65.     }
然后是本文的核心,数据表实体对象类,比较长,呵呵
  1. /// <summary>
  2.     /// 与数据库表紧密相关 的 实体类
  3.     /// </summary>
  4.     public class DataTableObject
  5.     {
  6.         protected readonly string m_tableName;
  7.         protected DataItem m_key;
  8.         protected IList<DataItem> m_col;
  9.         /// <summary>
  10.         /// 构造 一个数据表实体类
  11.         /// </summary>
  12.         /// <param name="tableName">表名</param>
  13.         /// <param name="keyName">主键名</param>
  14.         /// <param name="colN
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值