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

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

 public static class ExtendDbRepository
{
public static DataSet SqlQuery(this Db db, string spName, params SqlParameter[] paramsters)
{
SqlConnection connection = db.Database.GetDbConnection() as SqlConnection;
SqlDataAdapter adapter = null;
DataSet set = null;
using (SqlCommand command = new SqlCommand(spName, connection))
{
command.CommandType = CommandType.StoredProcedure;
command.CommandText = spName;
command.Parameters.AddRange(paramsters);
adapter = new SqlDataAdapter(command); set = new DataSet();
adapter.Fill(set);
adapter.SelectCommand.Parameters.Clear();
adapter.Dispose();
command.Parameters.Clear();
command.Dispose();
connection.Close();
connection.Dispose();
return set;
}
} public static IEnumerable<TElement> SqlQuery<TElement>(this Db 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)
{
//注意需要转换数据库中的DBNull类型
var value = dr.IsDBNull(kv.ColumnOrdinal.Value) ? null : dr.GetValue(kv.ColumnOrdinal.Value);
propertyInfo.SetValue(item, value);
}
}
data.Add(item);
}
dr.Dispose();
return data;
}
}
}

EFCore 中执行存储过程返回DataSet DataTable的更多相关文章

  1. 在asp.net中执行存储过程(转)

    摘自:http://www.cnblogs.com/smhy8187/articles/677742.html 声明:本例用的数据库是系统提供的pubs数据库,表是是employee,编程语言用C# ...

  2. Oracle中执行存储过程call和exec区别

    Oracle中执行存储过程call和exec区别 在sqlplus中这两种方法都可以使用: exec pro_name(参数1..); call pro_name(参数1..); 区别: 1. 但是e ...

  3. 在SQL Server数据库中执行存储过程很快,在c#中调用很慢的问题

    记录工作中遇到的问题,分享出来: 原博客地址:https://blog.csdn.net/weixin_40782680/article/details/85038281 今天遇到一个比较郁闷的问题, ...

  4. EF中执行存储过程,获取output返回值

    EF不能直接支持执行存储过程,于是使用转化成执行SQL语句的形式,却怎么也获取不到output的值,折腾的好久,终于解决了,分享下曲折的经历: public int AddVote(int title ...

  5. C#中执行存储过程并在SQL server中调试

    1.编写存储过程 ) drop PROCEDURE [dbo].[sp_calcPci_of_baseRcd_GTmpTbl] CREATE PROCEDURE [dbo].[sp_calcPci_o ...

  6. Java中执行存储过程和函数(web基础学习笔记十四)

    一.概述 如果想要执行存储过程,我们应该使用 CallableStatement 接口. CallableStatement 接口继承自PreparedStatement 接口.所以CallableS ...

  7. Java中执行存储过程和函数

    装载于:http://www.cnblogs.com/liunanjava/p/4261242.html 一.概述 如果想要执行存储过程,我们应该使用 CallableStatement 接口. Ca ...

  8. ThinkPhp3.1.3执行存储过程返回false

    1.Tp在调用存储过程的时候,每次都显示false 返回一大片,下面是我自己的代码.

  9. sqlserver2008链接服务器中执行存储过程配置过程

    参考:http://www.cnblogs.com/ycsfwhh/archive/2010/12/15/1906507.html 1.双方启动MSDTC服务MSDTC(分布式交易协调器),协调跨多个 ...

随机推荐

  1. C++中rapidxml用法

    转载:https://www.cnblogs.com/rainbow70626/p/7586713.html 解析xml是第三方库很多,例如:tingxml,这次学习一下rapidxml,rapidx ...

  2. Mac JDK 卸载方法

    卸载步骤 输入 sudo rm -fr /Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin sudo rm -fr /Library/Prefere ...

  3. 安装和使用nltk

    安装 参考:https://www.cnblogs.com/zrmw/p/10869325.html 分词:注意先分句再分词,这些对象均来自nltk.tokenize库 word_tokenize 导 ...

  4. 解决 No IDEA annotations attached to the JDK 1.8和xml文件没有代码提示

    Android studio3.3 用着用着突然xml里没有代码联想了,忙着做其他的就没管,写xml的时候就硬写... 然后今天用着突然在class文件上方提示No IDEA annotations ...

  5. TransactionScope处理分布式事物时提示"事务已被隐式或显式提交,或已终止"

    在连接字符串中加入"Enlist=false",问题就这样解决了. ConnectionString = "Data Source=.;Initial Catalog=c ...

  6. 最常见的Java面试题及答案汇总(二)

    上一篇:最常见的Java面试题及答案汇总(一) 容器 18. java 容器都有哪些? 常用容器的图录: 19. Collection 和 Collections 有什么区别? java.util.C ...

  7. Jmeter(一) Jmeter基本使用

    1.下载安装 官方网站 https://jmeter.apache.org/download_jmeter.cgi 选择下载即可 2.基本使用 下载解压后,目录如下: 进入到bin目录, 双击jmet ...

  8. [ARM-Linux开发]mknod命令使用

    mknod - make block or character special files mknod [OPTION]... NAME TYPE [MAJOR MINOR]     option 有 ...

  9. [ARM-Linux开发]Linux下加载.ko驱动模块的两种方法:insmod与modprobe

    假设要加载的驱动程序模块名为SHT21.ko 加载驱动模块 方法一:  进入SHT21.ko驱动模块文件所在的目录,然后直接  insmod SHT21.ko  即可 方法二:  将SHT21.ko文 ...

  10. idea 添加自定义的todo标签

    背景:idea添加自定义的todo标签可以提高开发效率,搞之 在idea定义个人风格的todo IDEA自定义TODO注释 主要分为如下两步 自定义todo标签 settings>Editor& ...