zoukankan      html  css  js  c++  java
  • 运用泛型实现增删改

    最近在做项目时,频繁的使用增删改,把大量时间花费在写Sql语句和参数上,就想能不能写一个通用的方法省略掉写sql 和参数。想了一段时间,想到.net里面有Attitude类,可以自定义属性,这样就可以根据自定义属性获取sql字段和参数名,然后构造出sql语句和sqlParamertes ,要想根据不同表的增删改,可以用泛型实现。

    首先定义一个继承自Attribute的自定义类:Entry包括 数据库列名、参数名、参数长度、参数类型、是否包括改字段属性。

    代码如下:

    代码
     public class Entry:Attribute
      {
            
    private string columnName;

            
    /// <summary>
            
    /// 列名
            
    /// </summary>
            public string ColumnName
            {
                
    get { return columnName; }
                
    set { columnName = value; }
            }
            
    /// <summary>
            
    /// 参数名
            
    /// </summary>
            private string paramName;

            
    public string ParamName
            {
                
    get { return paramName; }
                
    set { paramName = value; }
            }
            
    /// <summary>
            
    /// 参数类型
            
    /// </summary>
            private SqlDbType paramType;

            
    public SqlDbType ParamType
            {
                
    get { return paramType; }
                
    set { paramType = value; }
            }
           
            
    /// <summary>
            
    /// 参数大小
            
    /// </summary>
            private int paramLength;

            
    public int ParamLength
            {
                
    get { return paramLength; }
                
    set { paramLength = value; }
            }
            
    /// <summary>
            
    /// 是否加入实体
            
    /// </summary>
            

            
    private bool show=true;

            
    public bool Show
            {
                
    get { return show; }
                
    set { show = value; }
            }
            
    public Entry() { }

            
    public Entry(string colName, SqlDbType paramType)
            {
                
    this.columnName = colName;
                
    this.paramType = paramType;
            }

            
    public Entry(string colName, string paramName, SqlDbType paramType)
            {
                
    this.columnName = colName;
                
    this.paramName = paramName;
                
    this.paramType = paramType;
            }

            
    public Entry(string colName, string paramName, SqlDbType paramType, int paramLength)
            {
                
    this.columnName = colName;
                
    this.paramName = paramName;
                
    this.paramType = paramType;
                
    this.ParamLength = paramLength;
            }

            
    public Entry(string colName, string paramName, SqlDbType paramType, int paramLength, bool show)
            {
                
    this.columnName = colName;
                
    this.paramName = paramName;
                
    this.paramType = paramType;
                
    this.ParamLength = paramLength;
                
    this.show = show;
            }
    }

    接下来就是根据自定类动态构造增加数据的方法。要想获取自定义属性,可以采用反射机制获取字段名,参数名,参数长度等信息。

    下面四泛型实现的添加数据的Add方法

    代码
    public static void Add<T>(T entity, string tableName) where T : classnew()
            {
              
                Type type
    =typeof (T);
             
                List
    <string> fields = new List<string>();
                List
    <string> paramNames = new List<string>();
                PropertyInfo[] propertys 
    = type.GetProperties();
                List
    <SqlParameter> parameters = new List<SqlParameter>();
                SqlParameter param 
    = null;

                
    foreach (PropertyInfo info in propertys) //Folder所有属性
                {
                    
    object[] attributes = info.GetCustomAttributes(true);
                   
                    
    foreach (object attribute in attributes)
                    {
                        
    if (attribute is Entry)
                        {
                            Entry entry 
    =attribute as Entry;

                            fields.Add(entry.ColumnName);
                            paramNames.Add(entry.ParamName);

                            param 
    = new SqlParameter(entry.ParamName, entry.ParamType, entry.ParamLength);
                            param.Value
    =info.GetValue (entity,null);
                            parameters.Add(param);
                           
                        }
                    }
                    
                }

                StringBuilder sBuilder 
    = new StringBuilder();
                
    string fieldSql = string.Empty;
                
    string paramSql = string.Empty;

                sBuilder.Append(
    "Insert into ");
                sBuilder.Append(tableName);
                sBuilder.Append(
    " (");

                
    foreach (string field in fields)
                {
                    fieldSql
    +=field + ","
                }

                fieldSql 
    = fieldSql.Substring(0, fieldSql.LastIndexOf(','));
                sBuilder.Append(fieldSql);
                sBuilder.Append(
    " ) values (");

                
    foreach (string pN in paramNames)
                {
                    paramSql 
    += "@" + pN + ",";
                }

                paramSql 
    = paramSql.Substring(0, paramSql.LastIndexOf(','));
                sBuilder.Append(paramSql);
                sBuilder.Append(
    " )");

                ExecuteSql(sBuilder.ToString(), parameters.ToArray ());
                
            }


    下面是一个具体例子:根据自定义属性配置参数名、参数类型等基本信息

    代码

        
    public class Folder
        {
            
    /// <summary>
            
    /// Folder Id  Guid 
            
    /// </summary>
            [Entry("Id","Id",SqlDbType.NVarChar,32)]
            
    public string Id { setget; }

            
    /// <summary>
            
    /// Folder Name
            
    /// </summary>
            [Entry("Name""Name", SqlDbType.NVarChar, 32)]
            
    public string Name { setget; }

            
    /// <summary>
            
    /// Folder Parent Id 
            
    /// </summary>
            [Entry("ParentId""ParentId", SqlDbType.NVarChar, 32)]
            
    public string ParentId { setget; }

            
    /// <summary>
            
    /// 
            
    /// </summary>
            [Entry("UserId""UserId", SqlDbType.NVarChar, 32)]
            
    public int UserId { setget; }

            
    /// <summary>
            
    ///Pengding type: add/update/delete 
            
    /// </summary>
            public string Type { setget; }

            [Entry(
    "CreateTime""CreateTime", SqlDbType.DateTime, 32)]
            
    public DateTime CreateTime { setget; }
        }

    同理,Delete、Update可以写出一个通用的方法来。不过,Update可能有点麻烦,很多时候只更新个别字段,这个时候就 不能把所有字段都更新。最近工作比较忙,这个问题以后有时间再去研究。

  • 相关阅读:
    [译]为什么你要学Go?
    类Lisp解释器JavaScript实现
    前端同学Windows中生存指北
    Virtualbox
    数据发布和上线日报&周报系统开发总结
    [Lab1]五分钟了解Makefile
    解决linux下解压来自windows的zip文件产生乱码的问题
    Arch使用过程中出现的问题汇总
    jQuery为什么移除了.toggle()方法
    Linux配置DNS
  • 原文地址:https://www.cnblogs.com/hubcarl/p/1732779.html
Copyright © 2011-2022 走看看