关闭

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

697人阅读 评论(0) 收藏 举报

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

[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
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:43983次
    • 积分:839
    • 等级:
    • 排名:千里之外
    • 原创:35篇
    • 转载:0篇
    • 译文:0篇
    • 评论:11条
    最新评论