• 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;
          }
        }
    
    
      }
  • 相关阅读:
    RabbitMq、ActiveMq、ZeroMq 和 kafka 比较
    Mysql:The table‘xxxx’is full
    忘记了MariaDB root密码的解决办法
    在CentOS 7 MySQL / MariaDB
    SQL批量删除与批量插入
    org.springframework.web.servlet.PageNotFound No mapping found for HTTP request with URI [/AssetRepair/assetRepairController/test.do] in DispatcherServlet with name 'assetrepair'
    <spring:message> 标签
    Spring MVC之@RequestParam @RequestBody @RequestHeader 等详解
    实现JMS规范的ActiveMQ
    常见消息队列协议总结
  • 原文地址:https://www.cnblogs.com/ABC-wangyuhan/p/14679641.html
Copyright © 2020-2023  润新知