兄弟刚刚写了数据库操作类,请大家提提意见  
        public static string getconnstr()
        {
          string connstr = DBstr.getconnstr("MSSQL");
         return connstr;
        }
        /// <summary>
        /// 添加
        /// </summary>
        /// <param name="entity">对象</param>
        /// <returns></returns>        public static int Insert(T entity,string sqltext)
        {
            SqlParameter[] p =DictionarytoArry(Entitylist(entity)) ;
            if (p.Length>0)
            {
                p[0].Direction = ParameterDirection.Output;
               SqlHelper.ExecuteNonQuery(getconnstr(), CommandType.StoredProcedure, sqltext, p);
               p = null;
                return Convert.ToInt32(p[0].Value); 
            }
            return 0;
        }
  /// <summary>
  /// 修改
  /// </summary>
        /// <param name="entity">对象</param>
  /// <returns></returns>        public static int Update(T entity,string sqltext)
        {
            SqlParameter[] p = DictionarytoArry(Entitylist(entity));
            if (p.Length>0)
            {
                int i = SqlHelper.ExecuteNonQuery(getconnstr(), CommandType.StoredProcedure, sqltext, p);
                p = null;
            return i;
            }
            return 0;
        }
        /// <summary>
        ///查询实例
        /// </summary>
        /// <param name="entity">对象</param>
        /// <returns></returns>
        public static T Select(T entity, string sqltext)
        {
            if (entity!=null)
            {
                if (!string.IsNullOrEmpty(sqltext))
                {
                    
                    SqlParameter[] p = DictionarytoArry(Entitylist(entity));
                    using (IDataReader dr = SqlHelper.ExecuteReader(getconnstr(), CommandType.StoredProcedure, sqltext, p))
                    {
                        while (dr.Read())
                        {
                           entity= Select(dr,ref entity);
                        }
                    }
                    p = null;
                    return entity;
                }
            }
            return default(T);
        }        /// <summary>
        /// 获取查询集合
        /// </summary>
        /// <param name="indexpage"></param>
        /// <param name="pagesize"></param>
        /// <param name="mis"></param>
        /// <param name="recordCount"></param>
        /// <returns></returns>
          public static IList<T> Select(int indexpage, int pagesize,string sqltext, T entity, out int recordCount)
          {
              if (entity!=null)
              {
                 if (!string.IsNullOrEmpty(sqltext))
                 {
                   Dictionary<string,string> dlist = Entitylist(entity);
                   //增加一个记录记录集总数字段
                   dlist.Add("recordCount", "0");
                   SqlParameter[] p = DictionarytoArry(dlist);
                   p[p.Length-1].Direction=ParameterDirection.Output;
                  IList<T> list = new List<T>();
                  using(IDataReader dr=SqlHelper.ExecuteReader(getconnstr(),CommandType.StoredProcedure,sqltext,p))
                  {
                      while (dr.Read())
                      {
                         list.Add(Select(dr,ref entity));
                      }
                  }                  recordCount = Convert.ToInt32(p[p.Length-1].Value);
                  p = null;
                  return list;
                 }
              }              recordCount = 0;
              return null;
          }
           public static T Select(IDataReader dr, ref T entity)
      {
          if (dr!=null)
          {
              Type type = typeof(T);
              PropertyInfo[] propertyInfos = type.GetProperties();
              //创建PropertyInfo类型变量,获取实例化类的各个属性
              for (int i = 0; i < dr.FieldCount; i++)
              {
                  for (int j = 0; j < propertyInfos.Length; j++)
                  {
                      PropertyInfo propertyInfo = propertyInfos[j];                      if (dr.GetName(i).Trim().ToLower() == propertyInfo.Name.Trim().ToLower())
                      //实例化类的各个属性与具体的DateReader中的对象名称变为小写字母后进行比较
                      {
                          Type propertyType = propertyInfo.PropertyType;
                          if (propertyType.IsValueType || (propertyType.IsClass && propertyType.IsSerializable && propertyType.IsSealed))
                          {
                              object val = dr[propertyInfo.Name];
                              if (val != DBNull.Value)
                              {
                                  propertyInfo.SetValue(entity, val, null);
                              }
                              break;
                          }
                      }
                  }
              }
         
              propertyInfos = null;
              return entity;
          }
          return default(T);
      } public static void parlist(string sqltext, ref Dictionary<string, object> strarr)
        {
           
            if (strarr.Count>0 && (!string.IsNullOrEmpty(sqltext)))
            {
                SqlParameter[] sp = new SqlParameter[strarr.Count];
                int i = 0;
                foreach (KeyValuePair<string,object> k in strarr)
                {
                    if (k.Value.Equals(""))
                    {
                        sp[i] = new SqlParameter("@" + k.Key, k.Value);
                    }
                    else
                    {
                        sp[i].Direction = ParameterDirection.Output;
                   
                    }
                    i++;
                }                int t=SqlHelper.ExecuteNonQuery(getconnstr(), CommandType.StoredProcedure, sqltext, sp);
          
            if (t > 0)
            {
                int j = 0; string spstr;
                foreach (KeyValuePair<string,object> k in strarr)
                {
                    if (k.Value.Equals(""))
                    {
                        spstr = sp[j].ParameterName.ToString().Replace("@", "");
                        if (k.Key == spstr)
                        {
                            strarr[k.Key] = sp[j];
                        }
                    }                    j++;
                }
            }
            }
        }

解决方案 »

  1.   


     public static string getconnstr()
            {
             // string connstr = DBstr.getconnstr("MSSQL");
             return DBstr.getconnstr("MSSQL"); 
    //那我来第一个吧:
    //没必要申明connstr临时变量  直接返回DBstr.getconnstr("MSSQL")即可
    //下边代码没看 太长
            }
      

  2.   

    靠反射为字段赋值。
    但是这个要考虑很多,比如字段名和数据库不匹配,关系,延迟加载,特殊类型等等。最好使用现成的 OR 框架,比如 Entity Framework。
      

  3.   

    不过这段代码可以帮助那些想了解 ORM 的原理的人理解。它很简单,但是说明了问题。
      

  4.   

    Entity Framework,曾经考虑过但是不是很好用,尤其一些特殊的存储过程经常出现问题,而且最让我头疼的就它的重建,每次修改的内容都会把覆盖掉
      

  5.   

    原来是一个ORM操作类啊,推荐一个不用反射的ORM,PDF.NET数据开发框架:
    http://www.pwmis.com/sqlmap
      

  6.   

    我一直在用SqlHelper,或者自己写DataAccess
      

  7.   

    Microsoft patterns & practices Enterprice Library
      

  8.   

    现在主流的orm框架基本都是具有代码生成器的作用,呵呵
      

  9.   

    我是说,你可以自己写一个代码生成器代替Visual Studio默认的那个。
      

  10.   

    虽然没有其他的sqlhelper类强大,但也是适用的,支持
      

  11.   

    你或许可以找到一个三层,或者生成DAL之类的东西,但是这样你能找到吗
      

  12.   

    反射的性能问题,注意是消耗在 Assembly的加载上,和invoke的引用上,我的类没有涉及到,性能应该不会有太多降低
      

  13.   

    反射对性能的影响主要在 Assembly的加载和invoke对方法的引用上,其他的应该消耗资源很少