Entity Framework 调用返回标量值的存储过程
最近项目用到EF,虽然说EF与Linq To SQL有很多地方相似,但是EF(这里指3.5版,4.0版的还没去留意)确实有些地方做得不够方便。
就拿存储过程来说吧,EF里面想调用存储过程不是直接在数据库里拖进来就可以用,还要做一个function import的步骤来建立映射。 如果你的存储过程返回的是一个select * from .....的语句的话,那恭喜你,你的存储过程可以直接使用了。但是如果你的存储过程是返回标量值的呢?那不行,你会发现你的代码提示里面还是没有出现想要的存储过程名称。
 DevExpress 控件 ;
为什么呢?原因就是EF没有为返回标量值的存储过程自动生成cs代码,他只是在edmx文件里面写上了诸如
<Function Name="GetOrder" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="false" ParameterTypeSemantics="AllowImplicitConversion" Schema="dbo">
<Parameter Name="OrderID" Type="int" Mode="In" />
</Function>
这样一串映射配置。如需在EF中调用这种存储过程的话,就必须自己写一个通用的调用方法,以下是方法的代码:
private T ExecuteFunction<T>(string functionName, System.Data.EntityClient.EntityParameter[] parameters) where T : struct
{
System.Data.EntityClient.EntityCommand cmd = ((System.Data.EntityClient.EntityConnection)this.Connection).CreateCommand();
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.Parameters.AddRange(parameters);
cmd.CommandText = this.DefaultContainerName + "." + functionName;
try
{
if (cmd.Connection.State != System.Data.ConnectionState.Open)
cmd.Connection.Open();
var obj = cmd.ExecuteScalar();
return (T)obj;
}
catch (System.Exception)
{
throw;
}
finally
{
cmd.Connection.Close();
}
}
其中泛型T就是你的存储过程返回值的类型。
虽然说有了调用方法,但是你还不可以放松,注意到方法里面有这样一句 var obj = cmd.ExecuteScalar();这句的意思就是获取返回表格的第一行数据,这有什么问题呢?问题就在于他只能拿到形式为表格(table)的返回值,如果你的存储过程是用return来返回结果的话,那不好意思,上面的方法会抛出一个The data reader returned by the store data provider does not have enough columns for the query requested.的异常,原因是return的存储过程并没有返回表格。这样的话,我们必须还要修改一下存储过程,把return改成select,这样就能顺利调用了。
Entity Framework 调用返回标量值的存储过程的更多相关文章
- [转]Entity FrameWork利用Database.SqlQuery<T>执行存储过程并返回参数
本文转自:http://www.cnblogs.com/xchit/p/3334782.html 目前,EF对存储过程的支持并不完善.存在以下问题: EF不支持存储过程返回多表联合查询的 ...
- Entity FrameWork利用Database.SqlQuery<T>执行存储过程并返回参数
目前,EF对存储过程的支持并不完善.存在以下问题: EF不支持存储过程返回多表联合查询的结果集. EF仅支持返回返回某个表的全部字段,以便转换成对应的实体.无法支持返回部分字段的情况. 虽然可以正常导 ...
- SQL创建和调用有默认值的存储过程
先创建一个有默认值的存储过程 create procedure usp_unpass ), --有默认值的参数放到最后 as select @score go 该存储过程有2个参数 ,其中@score ...
- Entity Framework Core 执行SQL语句和存储过程
无论ORM有多么强大,总会出现一些特殊的情况,它无法满足我们的要求.在这篇文章中,我们介绍几种执行SQL的方法. 表结构 在具体内容开始之前,我们先简单说明一下要使用的表结构. public clas ...
- 转:Entity FrameWork利用Database.SqlQuery<T>执行存储过程并返回参数
public IEnumerable<Statistic> GetStatistics(IEnumerable<Guid> itemIds) { var ctx = new D ...
- Entity Framework 利用 Database.SqlQuery<T> 执行存储过程,并返回Output参数值
做个记录: var pCount = this._dataProvider.GetParameter(); pCount.ParameterName = "totalCount"; ...
- Entity Framework Code First (六)存储过程
声明:本文只针对 EF6+ 默认情况下,Code First 对实体进行插入.更新.删除操作是直接在表上进行的,从 EF6 开始你可以选择使用存储过程(Stored Procedures) 简单实体映 ...
- Entity Framework调用表值函数实现全文检索?
CREATE FUNCTION [dbo].[udf_BookContentSearch](@keywords NVARCHAR(1000))RETURNS @BookPageDetail TABLE ...
- Entity Framework 学习中级篇3—存储过程(中)
目前,EF对存储过程的支持并不完善.存在以下问题: l EF不支持存储过程返回多表联合查询的结果集. l EF仅支持返回返回某个表的全部字段,以便转换成对应的实体.无法 ...
随机推荐
- CN_Week1_Receptive_Field
0. The introduction: 1. An example: Models of "Receptive Fields". 2. An intuitive method o ...
- jdbc学习总结
jdbc学习总结: 一.简介: jdbc,直译为java连接数据库.实际为java为很好的操作数据库而提供的一套接口,接口的实现(即驱动)由各个数据库厂商提供. 二.知识要点: 连接5要素,3 ...
- (@WhiteTaken)解决Unity5.x下UnityVS2013不能使用的问题
终于解决了这一困扰我很久的问题. 下面来介绍一下我遇到的问题: 前段时间,重新做了系统,并且安装了Unity5.6版本,VS2013,UnityVS 2013.msi,Visual Studio 20 ...
- Python自学笔记-with详解
with的作用: with关键字是一个替你管理实现上下文协议对象的东西,适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的"清理"操作,释放资源,比如文件使用 ...
- c#使用GDI+简单绘图
private void button2_Click(object sender, EventArgs e) { Bitmap image = new Bitmap(200, 200); Graphi ...
- $http设置headers来实现IE不缓存url请求的资源
var getOrders = function(){ var deferred = $q.defer(); $http({ method:'get', url:'/getOr ...
- JAVA常用API(Date、DateFormat、Calendar、System、Math、基本数据类型包装类)
注:本文所有内容均属个人见解,如有错误望各位大佬好心指点批评,不胜感激 本章重点单词: parse:解析 format:格式化 pattern:模式 amount:数量 filed :领域 1.Dat ...
- 微信小程序城市定位(借助百度地图API判断城市)
概述 微信小程序提供一些API(地址)用于获取当前用户的地理位置等信息,但无论是wx.getLocation,还是wx.chooseLocation均没有单独的字段表示国家与城市信息,仅有经纬度信息. ...
- uva12716 GCD XOR
个人博客:http://acbingo.cn/2015/06/04/uva12716/ 被紫薯上*和素数筛法类似*这句话给误解了= =,一直以为存在某种关系,在枚举c或者a时,可以根据当前的答案,筛掉 ...
- 【转】RAM 大全-DRAM, SRAM, SDRAM的关系与区别
http://blog.csdn.net/huleide/article/details/5506698 ROM和RAM指的都是半导体存储器,ROM是Read Only Memory的缩写,RAM是R ...