在运用Entity Framework调用存储过程的时候,遇到"调用EF的存储过程报"调用EF的存储过程报“存储区数据提供程序返回的数据读取器所具有的列数对于所请求的查询不够”问题"的问题,存储过程是用EF模型的函数导入(设置映射的存储过程)。检查过存储过程,在Sql Management Studio运用是正常的。

  存储过程的部分代码如下:

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[].Value.ToString(); }

函数与存储过程应该都是没有问题,在折腾了最后,发现我在函数导入(设置映射的存储过程)时候,设置了存储过程返回的集合。如图:

添加函数导入的返回类型是指最后一个SELECT语句的字段类型(仅返回一个字段的情况);所以如果没有使用SELECT语句返回则应该置返回类型为“无”;如果SELECT多个字段或者数据表行时必须将返回类型指定为“实体”(即DTO类型);如果是表就必须建一个对应的DTO;如果返回若干字段则必须为这些字段手工创建DTO类型。如果是返回DTO类型的则无需在分部类封装方法了,直接使用导入的函数即可。

解决方法:  

 1). 在存储过程return前,添加一条select语句,"select 1 as Result" ,使得存储过程在return时有行列返回;

 2). 不使用select 结果,则不需要返回类型,将添加函数导入时指定返回类型为“无”即可

调用EF的存储过程报“存储区数据提供程序返回的数据读取器所具有的列数对于所请求的查询不够”问题的更多相关文章

  1. ADO.NET入门教程(二)了解.NET数据提供程序

    出处:http://www.cnblogs.com/liuhaorain/archive/2012/02/11/2346312.html 1. 什么是.NET数据提供程序? .NET Framewor ...

  2. 访问MySQL数据库时,报“找不到请求的 .net Framework 数据提供程序。可能没有安装。”的解决方案

    最近开发了一个系统,在测试环境上进行部署(win7环境)并测试,没有发现问题:但是把系统部署到win Server2008R2上之后,部分页面就报“找不到请求的 .net Framework 数据提供 ...

  3. 简述在ADO中使用接口的抽象数据提供程序以及ADO.NET数据提供程序工厂模型

    如何在ADO中使用接口的抽象数据提供程序 在cofig中 appSettings下,配置数据连接类型 <appSettings> <!--这个键值映射到枚举值中的某个值--> ...

  4. Oracle第三方ado.net数据提供程序

    原文地址:http://www.infoq.com/cn/news/2009/06/oracleclient_deprecated 这项决定有部分原因是基于目前Oracle的第三方ADO.NET数据提 ...

  5. contentprovider提供程序间共享数据的统一接口

    contentprovider提供程序间共享数据的统一接口

  6. “数据提供程序或其他服务返回 E_FAIL 状态”

    “数据提供程序或其他服务返回 E_FAIL 状态” 的问题 ADO 连接SQL SERVER

  7. WIN7系统 64位出现 Net Framework 数据提供程序要求 Microsoft Data Access Components(MDAC).

    WIN7系统 64位出现  Net Framework 数据提供程序要求 Microsoft Data Access Components(MDAC).请安装 Microsoft Data Acces ...

  8. Oracle第三方ado.net数据提供程序(转)

    原文地址:http://www.infoq.com/cn/news/2009/06/oracleclient_deprecated 这项决定有部分原因是基于目前Oracle的第三方ADO.NET数据提 ...

  9. TestNG参数化测试-数据提供程序 @DataProvider方式

    在 testng.xml 中指定参数可能会有如下的不足: 1.如果你压根不用 testng.xml. 2.你需要传递复杂的参数,或者从Java中创建参数(复杂对象,对象从属性文件或者数据库中读取的et ...

随机推荐

  1. Linux shell字符串截取与拼接

    一 Linux 的字符串截取很有用.有八种方法. 假设有变量 var=http://www.linuxidc.com/123.htm 1  # 号截取,删除左边字符,保留右边字符. echo ${va ...

  2. CA数字加密解密Demo

    package aisin.text;    import com.google.common.collect.Maps;  import sun.misc.BASE64Decoder;  impor ...

  3. 一个简洁、好用的Pytorch训练模板

    一个简洁.好用的Pytorch训练模板 代码地址:https://github.com/KinglittleQ/Pytorch-Template 怎么使用 1) 更改template.py 替换 __ ...

  4. BestCoder Round #1 第二题 项目管理

    // 第二题 我记得很久很久很久以前看过这样的题目,忘记是哪的区域赛了 // 记得有人说和节点度数有关,我记不清了,反正当时完全不懂 // 然后我想了想,估计就是更新节点度数有关,YY出来可能只要更新 ...

  5. RabbitMQ消息队列———安装(一)

    一.RabbitMQ队列 不同进程间的通信,简称IPC.不同的进程间的通信,可以基于队列解决,将生产者和消费者进行解耦,中间的队列作为其桥梁.RabbitMQ是一个在AMQP基础上完整的,可复用的企业 ...

  6. python 判断类型

    转自:http://san-yun.iteye.com/blog/1543174 Python可以得到一个对象的类型 ,利用type函数: >>>lst = [1, 2, 3] &g ...

  7. 【spring源码学习】spring的事务管理的源码解析

    [一]spring事务管理(1)spring的事务管理,是基于aop动态代理实现的.对目标对象生成代理对象,加入事务管理的核心拦截器==>org.springframework.transact ...

  8. 如何在aspx.cs 里面获取html 控件值

    aspx 页面 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default. ...

  9. Quick 3.3 的代码资源加密

    http://cn.cocos2d-x.org/tutorial/show?id=1507 http://cn.cocos2d-x.org/tutorial/show?id=1447 http://b ...

  10. Python 函数 memoryview()

    memoryview() 函数返回给定参数的内存查看对象(Momory view). 所谓内存查看对象,是指对支持缓冲区协议的数据进行包装,在不需要复制对象基础上允许Python代码访问.返回元组列表 ...