调用EF的存储过程报“存储区数据提供程序返回的数据读取器所具有的列数对于所请求的查询不够”问题
2013-10-10 15:43
369 查看
在运用Entity Framework调用存储过程的时候,遇到"调用EF的存储过程报"调用EF的存储过程报“存储区数据提供程序返回的数据读取器所具有的列数对于所请求的查询不够”问题"的问题,存储过程是用EF模型的函数导入(设置映射的存储过程)。检查过存储过程,在Sql Management Studio运用是正常的。
存储过程的部分代码如下:
调用存储过程的EDMX的方法如下:
函数与存储过程应该都是没有问题,在折腾了最后,发现我在函数导入(设置映射的存储过程)时候,设置了存储过程返回的集合。如图:
![](http://images.cnitblog.com/blog/402077/201310/10153451-39340003d16746f18ec12105d8bfd146.jpg)
添加函数导入的返回类型是指最后一个SELECT语句的字段类型(仅返回一个字段的情况);所以如果没有使用SELECT语句返回则应该置返回类型为“无”;如果SELECT多个字段或者数据表行时必须将返回类型指定为“实体”(即DTO类型);如果是表就必须建一个对应的DTO;如果返回若干字段则必须为这些字段手工创建DTO类型。如果是返回DTO类型的则无需在分部类封装方法了,直接使用导入的函数即可。
解决方法:
1). 在存储过程return前,添加一条select语句,"select 1 as Result" ,使得存储过程在return时有行列返回;
2). 不使用select 结果,则不需要返回类型,将添加函数导入时指定返回类型为“无”即可
存储过程的部分代码如下:
ALTER PROCEDURE [dbo].[GetNameByCustomerId] -- Add the parameters for the stored procedure here @CustomersId NVARCHAR(10), @CustomerName NVARCHAR(20) OUTPUT AS BEGIN from -- interfering with SELECT statements. SET NOCOUNT ON; ……… SELECT @CustomerName=c.CompanyName FROM Customers c WHERE c.CustomerID=@CustomersId END
调用存储过程的EDMX的方法如下:
public void GetNameByCustomerId(string CustomerId, out string ContactName) { ContactName = string.Empty; var Pars = new System.Data.EntityClient.EntityParameter[] { new System.Data.EntityClient.EntityParameter{ ParameterName="CustomersId", DbType=System.Data.DbType.String,Value=CustomerId}, new System.Data.EntityClient.EntityParameter{ParameterName="CustomerName", DbType=System.Data.DbType.String, Direction=System.Data.ParameterDirection.Output} }; this.ExecuteNonQuery("GetNameByCustomerId", Pars); ContactName = Pars[1].Value.ToString(); }
函数与存储过程应该都是没有问题,在折腾了最后,发现我在函数导入(设置映射的存储过程)时候,设置了存储过程返回的集合。如图:
![](http://images.cnitblog.com/blog/402077/201310/10153451-39340003d16746f18ec12105d8bfd146.jpg)
添加函数导入的返回类型是指最后一个SELECT语句的字段类型(仅返回一个字段的情况);所以如果没有使用SELECT语句返回则应该置返回类型为“无”;如果SELECT多个字段或者数据表行时必须将返回类型指定为“实体”(即DTO类型);如果是表就必须建一个对应的DTO;如果返回若干字段则必须为这些字段手工创建DTO类型。如果是返回DTO类型的则无需在分部类封装方法了,直接使用导入的函数即可。
解决方法:
1). 在存储过程return前,添加一条select语句,"select 1 as Result" ,使得存储过程在return时有行列返回;
2). 不使用select 结果,则不需要返回类型,将添加函数导入时指定返回类型为“无”即可
相关文章推荐
- 调用EF的存储过程报“存储区数据提供程序返回的数据读取器所具有的列数对于所请求的查询不够”问题
- 程序调用查询数据存储过程的问题
- 调用企业信息查询接口展示数据并对外提供接口遇到的问题
- 一个提供数据存储和查询服务的分布式中间件需要考虑的一般问题
- 关于VS2005 调用WebService返回发送请求数据失败问题
- c#Winform程序调用app.config文件配置数据库连接字符串 SQL Server文章目录 浅谈SQL Server中统计对于查询的影响 有关索引的DMV SQL Server中的执行引擎入门 【译】表变量和临时表的比较 对于表列数据类型选择的一点思考 SQL Server复制入门(一)----复制简介 操作系统中的进程与线程
- jQuery在异步请求数据返回后,调用$("selector").html(data.content);之后因为一些特殊字符或者',"不能显示内容的问题解决办法
- 解决“找不到请求的 .Net Framework 数据提供程序。可能没有安装”的问题
- “数据提供程序或其他服务返回 E_FAIL 状态” 的问题
- 微信小程序,请求php后台返回json数据多出隐藏字符问题
- Android 跨程序调用,返回数据获取不到的问题
- 【.net】DbProviderFactories找不到请求的 .Net Framework 数据提供程序。可能没有安装”的问题
- SQLite : 解决“找不到请求的 .Net Framework 数据提供程序。可能没有安装”的问题
- Linq 此提供程序只支持对返回实体或投影(包含所有标识列)的有序查询使用 问题的解决
- 【Mysql To EF】codefirst连接问题提供程序未返回 ProviderManifestToken 字符串
- EF调用存储过程查询表中的部分字段,报数据读取器与指定的“AdventureWorksDWModel.Student”不兼容。某个类型为“Age”的成员在同名的数据读取器中没有对应的列。
- jQuery通过调用webservice返回json数据的问题
- Linq 异常“此提供程序只支持对返回实体或投影(包含所有标识列)的有序查询使用 Skip()...”
- 二 cocos2dx 之 解析xml文件数据并在程序中调用,存储
- Spring学习笔记(三十四):关于http的get请求返回的数据过长问题