• EFCore 中执行存储过程返回DataSet DataTable


    在项目中由于需求,需要返回复杂的数据,需要执行存储过程,但是在DONETCORE2.0中,看官网文档执行的sql的有点操蛋,满足不了需求,就想到了ADO.NET 

    于是找资料,也没有合适的,就动手自己封装了一个。代码如下;

     1 public static class ExtendDbRepository
     2     {
     3         public static DataSet SqlQuery(this Db db, string spName, params SqlParameter[] paramsters)
     4         {
     5             SqlConnection connection = db.Database.GetDbConnection() as SqlConnection;
     6             SqlDataAdapter adapter = null;
     7             DataSet set = null;
     8             using (SqlCommand command = new SqlCommand(spName, connection))
     9             {
    10                 command.CommandType = CommandType.StoredProcedure;
    11                 command.CommandText = spName;
    12                 command.Parameters.AddRange(paramsters);
    13                 adapter = new SqlDataAdapter(command);
    14 
    15                 set = new DataSet();
    16                 adapter.Fill(set);
    17                 adapter.SelectCommand.Parameters.Clear();
    18                 adapter.Dispose();
    19                 command.Parameters.Clear();
    20                 command.Dispose();
    21                 connection.Close();
    22                 connection.Dispose();
    23                 return set;
    24             }
    25         }
    26 
    27         public static IEnumerable<TElement> SqlQuery<TElement>(this Db db, string sql, params object[] parameters) where TElement : new()
    28         {
    29             var connection = db.Database.GetDbConnection();
    30             using (var cmd = connection.CreateCommand())
    31             {
    32                 db.Database.OpenConnection();
    33                 cmd.CommandText = sql;
    34                 cmd.CommandType = System.Data.CommandType.StoredProcedure;
    35                 cmd.Parameters.AddRange(parameters);
    36                 var dr = cmd.ExecuteReader();
    37                 var columnSchema = dr.GetColumnSchema();
    38                 var data = new List<TElement>();
    39                 while (dr.Read())
    40                 {
    41                     TElement item = new TElement();
    42                     Type type = item.GetType();
    43                     foreach (var kv in columnSchema)
    44                     {
    45                         var propertyInfo = type.GetProperty(kv.ColumnName);
    46                         if (kv.ColumnOrdinal.HasValue && propertyInfo != null)
    47                         {
    48                             //注意需要转换数据库中的DBNull类型
    49                             var value = dr.IsDBNull(kv.ColumnOrdinal.Value) ? null : dr.GetValue(kv.ColumnOrdinal.Value);
    50                             propertyInfo.SetValue(item, value);
    51                         }
    52                     }
    53                     data.Add(item);
    54                 }
    55                 dr.Dispose();
    56                 return data;
    57             }
    58         }
    59     }
  • 相关阅读:
    Codeforces 295 (Div.1)
    Codeforces 614
    Java面试题
    Eclipse创建JSP、HTML、CSS文件默认字符集设置成UTF-8
    Eclipse中配置Tomcat容器
    设置Eclipse中的字符集为UTF-8
    Windows中配置maven环境变量
    Windows中配置MySQL环境变量
    Nacicat for Oracle 绿色版 亲测可用
    MySQL安装版安装过程
  • 原文地址:https://www.cnblogs.com/KenFine/p/10647893.html
Copyright © 2020-2023  润新知