基于数据字典的通用查询系统(四)实体类的设计 1

基于数据字典的通用查询系统(四)实体类的设计 1

 

我们分为两个部分对这个模块中的信息进行Class的抽象,一是从数据库结构进行抽像,一中是从查询的构造过程进行抽象。

在列出包含的类之前,有一点需要说明,就是,正如前面分析,我们要对每一个元素都有一个对数据库的表示,和对用户的表示,在这里,我把对数据库的表示统一为属性Exp,对用户的表示统一为Show

一.从数据库结构进行抽像。

1. 表示数据库中的表的类QueryTable

2. 表示数据库中的列的类QueryCol

3. 表示数据库中的连接的类JoinCondition

4. 表示数据类型的枚举ColShowType,就是我们在第二篇中分析的那四种数据类型(数值,日期,字符串,状态位)

5. 表示数据库中状态位的ColStateValue;

6. 为了操作方便,抽像出集合JoinCoditions,ColStateValues;

 

类图如下:


呵呵,介于园子里大侠比较多的原因,类的代码就不都贴在这里了,这里只把QueryCol的实现简单说一下。

我们前面说了,我们一共有四种数据类型,按照正常,也是最合乎情况的方式,应当对这四种类型抽像出一个统一的结口,然后实现四种对应的类。进行与QueryCol进行结合,但是在这里,为了处理方便,QueryCol采用了冗余设计的方式,即有些类似于C C++中的联合,在一些场合下,只用其特定的属性。

一个是用于处理在日期类型下使用的属性Format,因为如前文所说,日期可能是以datetime存储,也可以是以varchar存储,在这种情况下,当用户进行操作后,就有必要有一种方式将进转换成符合数据库中表的列的设计方式的。这时,我们的Format就起了作用。

另外就是处理在状态位时使用的属性ColStateValues属性,它是一个ColStateValue的集合,这样说可能不大好明白,举个列子,比如一个列,state, 当其为0时表示未处理,当其为1时表示已经处理。

那么这个列就有一个ColSateValues的属性,其中第一个元素的Show未处理”,Exp”0”,第二个元素的 Show已经处理”,Exp”1”;

在这里,为 了使以后的查询结果表示直观,我们还要为ColStateValues设计一个GetState的方法,也就是通过一个元素的exp查找这个元素的show的过程。
至于这些附加的信息存在哪,呵呵, 我们在数据库设计时不是有ColStateString吗?在不同的情况下做一下处理就行了。

为了更明白,最有效的方法,贴一下QueryCol的构造函数吧,嘿嘿

ContractedBlock.gif ExpandedBlockStart.gif Code
internal QueryCol(String exp, String show, QueryTable table,int type, String values)

        {

            Exp 
= exp;

            Show 
= show;

            DataTable 
= table;

            
this.ColShowType = (ColShowType)type;

            
if (ColShowType == ColShowType.State)

                ColStateValues 
= new ColStateValues(values);

            
else

                ColStateValues 
= null;

            
if (this.ColShowType == ColShowType.Date)

                Format 
= values;

        }

 啊,ColStateValues也不能忘了,呵呵,代码如下:

 

ContractedBlock.gif ExpandedBlockStart.gif Code
namespace SFTech.Query.Entity
{
    
public class ColStateValues : List<ColStateValue>
    {

        
private System.Collections.Hashtable _hash;
        
internal ColStateValues(String values)
            : 
base()
        {
            
string[] value = values.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries);
            
string show;
            
string _value;
            _hash 
= new System.Collections.Hashtable();
            
for (int i = 0; i < value.Length; i++)
            {
                
if (value[i].IndexOf('&'>= 0)
                {
                    show 
= value[i].Substring(0, value[i].IndexOf('&')).Trim();
                    _value 
= value[i].Substring( value[i].IndexOf('&')+1).Trim();
                }
                
else
                {
                    show 
= value[i].Trim();
                    _value 
= value[i].Trim();
                }

                _hash.Add(_value , show );
                
this.Add(new ColStateValue(show,_value));
            }

        }

        
public String GetState(string value)
        {
           
                
return _hash[value] as string ;
            
        }

    }
}

 

                这里已经考虑了用字符串等其他非数值信息做状态位的情况。。

 

各位看官别说看的头大啊,小的文笔有限,只能先写成这个样子了,呵呵。

明天该写最关键部分,查询部分类库的设计了,呵

 

系列文章连接

一。SQL语句的构成分析

二。数据库组成结构的分析。

三。数据库设计。

四。实体类设计

五。算法实现

posted @ 2008-12-18 23:41 葛云飞 阅读( ...) 评论( ...) 编辑 收藏
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值