C# 通用存储过程ORMapping的实现 [基础篇]

 在[设想篇]中,提到的一些属性,在本篇中进行实现

[NXDataSet("SPName",SchemaFlag.IsStoredProcedure)]
NXDataSet为一个属性,标识存储过程的名称,SchemaFlag为枚举,可以你希望他还有IsTable,IsView这样的数据,用于其它结构的枚举
实现代码:

/// <summary>
    
/// 类表示实体的数据结构样式属性的标签
    
/// </summary>

    [AttributeUsage(AttributeTargets.Class)]
    
public   class  NXDataSetAttribute : System.Attribute
    
{
        
/// <summary>
        
/// 初始化[描述表或视图]属性类实例
        
/// </summary>
        
/// <param name="ClassName">类的名称</param>
        
/// <param name="schemaFlag">结构标识</param>

        public NXDataSetAttribute(string ClassName,SchemaFlag schemaFlag)
        
{
            
this.ClassName = ClassName;
            
this.Schema = schemaFlag;
        }


        
/// <summary>
        
/// 初始化[描述表]属性类实例
        
/// </summary>
        
/// <param name="ClassName">类的名称</param>

        public NXDataSetAttribute(string ClassName) : this(ClassName,SchemaFlag.IsTable){}

        
private string _ClassName;
        
/// <summary>
        
/// 类的名称 [表示为:表名,视图名,存储过程名称]
        
/// </summary>

        public string ClassName
        
{
            
get{return this._ClassName;}
            
set{this._ClassName =value;}
        }


        
private SchemaFlag _schemaFlag;
        
/// <summary>
        
/// 类的实体样式 [表,视图,存储过程]
        
/// </summary>

        public SchemaFlag Schema
        
{
            
get{return this._schemaFlag;}
            
set{this._schemaFlag = value;}
        }


    }

其中使用枚举SchemaFlag代码如下

     public   enum  SchemaFlag :  int
    
{
        
/// <summary>
        
/// 表
        
/// </summary>

        IsTable = 0,

        
/// <summary>
        
/// 视图
        
/// </summary>

        IsView = 1,

        
/// <summary>
        
/// 存储过程
        
/// </summary>

        IsStoredProcedure = 2
    }

 

[NXExectueReturn("ReturnValue","_ReturnValue",ReturnFlag.IsDouble)]
NXExectueReturn标识返回值,存储过程可以有多个返回值,比如RETURN前有SELECT语句,会返回结果集,同样RETURN的也会返回,而在ORACLE中会有CURSOR返回结果集
实现代码:

/// <summary>
    
/// 存储过程执行后的返回结果属性标签
    
/// </summary>

    [AttributeUsage(AttributeTargets.Constructor)]
    
public   class  NXExectueReturnAttribute : System.Attribute
    
{

        
/// <summary>
        
/// 初始化,存储过程执行后的返回结果属性标签
        
/// </summary>
        
/// <param name="PropertyInfoName">指定属性的名称,指示该属性中保存类存储执行的返回结果</param>
        
/// <param name="PrivateFieldName">返回结果对应的属性Get或Set方法中,对应的私有变量的值</param>
        
/// <param name="Flag">返回结果标志</param>

        public NXExectueReturnAttribute(string PropertyInfoName, string PrivateFieldName, ReturnFlag Flag)
        
{
            
this._Flag = Flag;
            
this._Name = PropertyInfoName;
            
this._PrivateFieldName = PrivateFieldName;

            
if (PropertyInfoName != string.Empty && Flag == ReturnFlag.IsNonResult)
                
throw new NxException("指定了属性名称后,ReturnFlag标识不能是[IsNonResult]...");
        }


        
/// <summary>
        
/// 初始化,存储过程执行后的返回结果属性标签,无参数的构造方法,表示无返回结果
        
/// </summary>

        public NXExectueReturnAttribute() : this(string.Empty, string.Empty, ReturnFlag.IsNonResult) { }


        
private string _Name = string.Empty;
        
/// <summary>
        
/// 指定属性的名称,指示该属性中保存执行存储的返回结果
        
/// </summary>

        public string Name
        
{
            
get return this._Name; }
            
set this._Name = value; }
        }


        
private string _PrivateFieldName;
        
/// <summary>
        
/// 返回结果,保存的私有变量中
        
/// </summary>

        public string PrivateFieldName
        
{
            
get return this._PrivateFieldName; }
            
set this._PrivateFieldName = value; }
        }


        
private ReturnFlag _Flag = ReturnFlag.IsNonResult;
        
/// <summary>
        
/// 执行存储过程后的返回结果标志
        
/// </summary>

        public ReturnFlag Flag
        
{
            
get return this._Flag; }
            
set this._Flag = value; }
        }



    }

其中使用枚举ReturnFlag代码如下

public   enum  ReturnFlag :  int
    
{
        
/// <summary>
        
/// 返回DataSet对象
        
/// </summary>

        IsDataSet = 1,

        
/// <summary>
        
/// 返回值
        
/// </summary>

        IsValue = 2,

        
/// <summary>
        
/// 无任何返回值
        
/// </summary>

        IsNonResult = 3,

        
/// <summary>
        
/// 即返回DataSet对象,又有Return的返回值,DataSet在作为方法执行的返回结果,Return的返回值则保存在指定的属性中
        
/// </summary>

        IsDouble = 4
    }

 

[NXVar("parameter1","sIn","System.Int32","int",VarIOFlag.IsOutput)]
NXVar是标识存储过程的参数信息
实现代码:

     /// <summary>
    
/// 存储过程的参数变量属性标签
    
/// </summary>

    [AttributeUsage(AttributeTargets.Property)]
    
public   class  NXVarAttribute : System.Attribute
    
{
        
/// <summary>
        
/// 初始化,存储过程的参数变量
        
/// </summary>
        
/// <param name="Name">参数变量名称</param>
        
/// <param name="PrivateFieldName">参数变量Get或Set方法中对应的私有变量的值</param>
        
/// <param name="CSharpTypeName">参数变量名称[CSharp中的类型]</param>
        
/// <param name="DataTypeName">参数变量的源数据类型[数据类型]</param>
        
/// <param name="Flag">参数变量,输入输出标志</param>

        public NXVarAttribute(string Name,string PrivateFieldName,string CSharpTypeName,string DataTypeName,VarIOFlag Flag)
        
{
            
this._Name = Name;
            
this._PrivateFieldName = PrivateFieldName;
            
this._CSharpTypeName = CSharpTypeName;
            
this._DataTypeName = DataTypeName;
            
this._Flag = Flag;
        }



        
private string _Name;
        
/// <summary>
        
/// 参数变量名称
        
/// </summary>

        public string Name
        
{
            
get{return this._Name;}
            
set{this._Name=value;}
        }


        
private string _PrivateFieldName;
        
/// <summary>
        
/// 参数变量对应的私有变量的名称
        
/// </summary>

        public string PrivateFieldName
        
{
            
get{return this._PrivateFieldName;}
            
set{this._PrivateFieldName=value;}
        }


        
private string _CSharpTypeName;
        
/// <summary>
        
/// 参数变量名称[CSharp中的类型]
        
/// </summary>

        public string CSharpTypeName
        
{
            
get{return this._CSharpTypeName;}
            
set{this._CSharpTypeName=value;}
        }


        
private string _DataTypeName;
        
/// <summary>
        
/// 参数变量的源数据类型[数据类型]
        
/// </summary>

        public string DataTypeName
        
{
            
get{return this._DataTypeName;}
            
set{this._DataTypeName=value;}
        }


        
private VarIOFlag _Flag = VarIOFlag.IsInput;
        
/// <summary>
        
/// 参数变量,输入输出标志
        
/// </summary>

        public VarIOFlag Flag
        
{
            
get{return this._Flag;}
            
set{this._Flag=value;}
        }


        
        
private object _Value;
        
/// <summary>
        
/// 参数变量的值,用于 NxStoredProcedure 类(真正实现执行存储的类)
        
/// </summary>

        internal object Value
        
{
            
get return this._Value; }
            
set this._Value = value; }
        }

    }

其中使用枚举VarIOFlag代码如下

     /// <summary>
    
/// 存储过程的参数变量输入输出标志的枚举
    
/// </summary>

     public   enum  VarIOFlag :  int
    
{
        
/// <summary>
        
/// 输入参数
        
/// </summary>

        IsInput  = 1,

        
/// <summary>
        
/// 输出参数
        
/// </summary>

        IsOutput = 2,

        
/// <summary>
        
/// 即是输入参数,又是输出参数
        
/// </summary>

        IsDouble = 3
    }

以上这些定义的属性,将在真正实现存储的类中进行反射,取得存储执行时的必要信息

如需转载,请表明出处
anthor:zerodj@163.com/javasuki@hotmail.com

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值