zoukankan      html  css  js  c++  java
  • DbContext-扩展方法-支持存储过程

    一、方法封装

      public static  class DbContextExtension
        {
            public static List<T> GetList<T>(this DbContext db, string sql, CommandType type=CommandType.Text, params DbParameter[] parameters)
            {
                try
                {
                    using (DbConnection conn = db.Database.Connection)
                    {
                        if (conn.State == ConnectionState.Closed)
                        {
                            conn.Open();
                        }
                        using (DbCommand cmd = conn.CreateCommand())
                        {
                            cmd.CommandText = sql;
                            cmd.CommandType = type;
                            cmd.Parameters.AddRange(parameters);
                            DataTable dt = new DataTable();
                            using (DbDataReader reader = cmd.ExecuteReader())
                            {
                                dt.Load(reader);
                            }
                            cmd.Parameters.Clear();
                            string json = dt.ToJson();
                            List<T> list = json.ToObject<List<T>>();
                            return list;
                        }
                    }
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message);
                }
            }
        }

    二、方法调用

              int code = 0;
                    SqlParameter[] param = { 
                        new SqlParameter("@year",year),
                        new SqlParameter("@userId",userId),
                        new SqlParameter("@code ",code){ Direction=ParameterDirection.Output}
                    };
                    List<EChartsDto<int>> data = new List<EChartsDto<int>>();
    
                    data = db.GetList<EChartsDto<int>>("[dbo].[proc_getRecordsByUser]", CommandType.StoredProcedure, param);

     三、其他版本

     public static class DbContextExtensions
      {
        public static IEnumerable<TElement> ExecuteProc<TElement>(this DbContext db, string sql, params object[] parameters) where TElement : new()
        {
          var connection = db.Database.GetDbConnection();
          using (var cmd = connection.CreateCommand())
          {
            db.Database.OpenConnection();
            cmd.CommandText = sql;
            cmd.CommandType = System.Data.CommandType.StoredProcedure;
            cmd.Parameters.AddRange(parameters);
            var dr = cmd.ExecuteReader();
            var columnSchema = dr.GetColumnSchema();
            var data = new List<TElement>();
            while (dr.Read())
            {
              TElement item = new TElement();
              Type type = item.GetType();
              foreach (var kv in columnSchema)
              {
                var propertyInfo = type.GetProperty(kv.ColumnName);
                if (kv.ColumnOrdinal.HasValue && propertyInfo != null)
                {
                  var value = dr.IsDBNull(kv.ColumnOrdinal.Value)
                      ? null
                      : dr.GetValue(kv.ColumnOrdinal.Value);
                  if (value != null
                  && propertyInfo.PropertyType != typeof(int)
                  && propertyInfo.PropertyType != typeof(double))
                  {
                    value = value.ToString();
                  }
                  propertyInfo.SetValue(item, value);
                }
              }
              data.Add(item);
            }
            dr.Dispose();
            return data;
          }
        }
    
    
    
        public static DataTable ExecuteProc(this DbContext db, string sql, params object[] parameters)
        {
          DataTable dt = new DataTable();
          var connection = db.Database.GetDbConnection();
          using (var cmd = connection.CreateCommand())
          {
            db.Database.OpenConnection();
            cmd.CommandText = sql;
            cmd.CommandType = System.Data.CommandType.StoredProcedure;
            cmd.Parameters.AddRange(parameters);
            SqlDataAdapter sda = new SqlDataAdapter((SqlCommand)cmd);
            sda.Fill(dt);
            return dt;
          }
        }
    
    
      }
  • 相关阅读:
    比较简短的拼音首字母自定义函数
    程序员之路——一个老程序员对刚上大学的学弟学妹的忠告
    Android应用程序请求SurfaceFlinger服务渲染Surface的过程分析
    对当前软件行业的一点点感想
    调用opengl程序代码
    windows平台下,c++获取cpu型号,读取注册表获取系统软硬件信息代码
    应该被记住的8位Java人物
    软件开发高手须掌握的4大SQL精髓语句(二)
    如何建立一个网站(我的5年经验谈)
    vs 2010 express 查看malloc能分配多少内存
  • 原文地址:https://www.cnblogs.com/ABC-wangyuhan/p/14679641.html
Copyright © 2011-2022 走看看