10-2. 返回输出参数

问题

想获取存储过程里的一个或多个输出参数的值

解决方案

假设我们有一个像Figure 10-1所示的,出租车辆与租金收入的模型

Figure 10-1.出租车辆与租金收入的模型

我们想知道在指定日期里,收入了几笔租金和金额, 以及车辆的租凭情况. 存储过程Listing 10-7 就是获取这些信息的.

Listing 10-7. A Stored Procedure for the Vehicles Rented, the Number of Rentals, and the Total Rental Payments

create procedure [chapter10].[GetVehiclesWithRentals]

(@date date,

@TotalRentals int output,

@TotalPayments decimal(18,2) output)

as

begin

select @TotalRentals = COUNT(*), @TotalPayments = SUM(payment)

from chapter10.Rental

where RentalDate = @date

select distinct v.*

from chapter10.Vehicle v join chapter10.Rental r

on v.VehicleId = r.VehicleId

end

为了在模型里使用空上存储过程,执行以下操作:

1. 右击模型的设计视图,选择“从数据库更新模型”. 在对话框里

,选择存储过程GetVehiclesWithRentals. 点击“完成”添加存储过程到模型里。

2. 右击模型的设计视图, 选择“新增”➤“函数导入”. 在“存储过程/函数名称(P):”下拉框里选择

GetVehiclesWithRentals,在“函数导入名称(F):”里输入GetVehiclesWithRentals (这个就是在模型里生成的方法名称)。在“返回以下内容的集合”里勾选“实体”,并从下拉列里选择Vehicle

.点击“确定”

3.下面的Listing 10-8 就是使用GetVehiclesWithRentals的方法.

Listing 10-8.通过GetVehiclesWithRentals() 方法使用模型里的GetVehiclesWithRentals存储过程

staticvoid Main(string[] args)

{

using (var context = newEFRecipesEntities())

{

context.Database.ExecuteSqlCommand("delete from chapter10.Rental");

context.Database.ExecuteSqlCommand("delete from chapter10.Vehicle");

var car1 = newVehicle { Manufacturer = "Toyata", Model = "Camry", Year = 2013 };

var car2 = newVehicle { Manufacturer = "Chevrolet", Model = "Corvette", Year = 2013 };

var r1 = newRental { Vehicle = car1, RentalDate = DateTime.Parse("5/7/2013"), Payment = 59.95m };

var r2 = newRental { Vehicle = car2, RentalDate = DateTime.Parse("5/7/2013"), Payment = 139.95m };

car1.Rentals.Add(r1);

car2.Rentals.Add(r2);

context.Vehicles.Add(car1);

context.Vehicles.Add(car2);

context.SaveChanges();

}

using (var context = newEFRecipesEntities())

{

string reportDate = "5/7/2013";

var totalRentals = newObjectParameter("TotalRentals", typeof(int));

var totalPayments = newObjectParameter("TotalPayments", typeof(decimal));

var vehicles = context.GetVehiclesWithRentals(DateTime.Parse(reportDate),

totalRentals, totalPayments);

Console.WriteLine("Retal Activity for {0}", reportDate);

Console.WriteLine("Vehicles Rented");

foreach (var vehicle in vehicles)

{

Console.WriteLine("{0} {1} {2}", vehicle.Year, vehicle.Manufacturer, vehicle.Model);

}

Console.WriteLine("TotalRentals:{0}", (int)totalRentals.Value);

Console.WriteLine("Total Payments:{0}", ((decimal)totalPayments.Value).ToString("C"));

Console.WriteLine("\npress any key to exit...");

Console.ReadKey();

}

}

以下Listing 10-8是控制台输出结果:

===================================================================

Rental Activity for 5/7/2013

Vehicles Rented

2013 Toyota Camry

2013 Chevrolet Corvette

Total Rentals: 2

Total Payments: $200.00

===========================================

它是如何工作的?

第2步操作会使用GetVehiclesWithRentals存储过程更新模型 ,我们也更新了概念模型,让存储过程暴露在GetVehiclesWithRentals()上,该方法与存储过程有着类似的签名.

有一点请注意:当调用GetVehiclesWithRentals()方法后,它返回的实体集必须先实例化,输出参数才可以用。这跟ADO.NET里的DataReader相似,DataReader必须必执行NextResult(),才能读取到数据。同样地,实体集必须被访问或是处理之后,输出参数里才能有输出值。

在我们例子里, 当我们实例化第一个vehicle后,输出参数还不可以用,如果我们把输出payments和rentals总和的代码(Console.WriteLine("TotalRentals:{0}", (int)totalRentals.Value);Console.WriteLine("Total Payments:{0}",((decimal)totalPayments.Value).ToString("C"));)移动到foreach循环里,执行到这里的时候,会产生异常(totalRentals.Value和totalPayments.Value为null). 另一种解决办法是:我们把实体类集用ToList()方法实例化之后,然后循环实例化后的实体集. 这样我们也就可以在foreach循环里使用这两个输出参数的输出值了。

附:创建示例用到的数据库的脚本文件

totalPayments

Entity Framework 6 Recipes 2nd Edition(10-2)译 -> 返回输出参数的更多相关文章

  1. Entity Framework 6 Recipes 2nd Edition 译 -> 目录 -持续更新

    因为看了<Entity Framework 6 Recipes 2nd Edition>这本书前面8章的翻译,感谢china_fucan. 从第九章开始,我是边看边译的,没有通读,加之英语 ...

  2. Entity Framework 6 Recipes 2nd Edition(9-1)译->用Web Api更新单独分离的实体

    第九章 在N层结构的应用程序中使用EF 不是所有的应用都能完全地写入到一个单个的过程中(就是驻留在一个单一的物理层中),实际上,在当今不断发展的网络世界,大量的应用程序的结构包含经典的表现层,应用程, ...

  3. Entity Framework 6 Recipes 2nd Edition(9-3)译->找出Web API中发生了什么变化

    9-3. 找出Web API中发生了什么变化 问题 想通过基于REST的Web API服务对数据库进行插入,删除和修改对象图,而不必为每个实体类编写单独的更新方法. 此外, 用EF6的Code Fri ...

  4. Entity Framework 6 Recipes 2nd Edition(9-4)译->Web API 的客户端实现修改跟踪

    9-4. Web API 的客户端实现修改跟踪 问题 我们想通过客户端更新实体类,调用基于REST的Web API 服务实现把一个对象图的插入.删除和修改等数据库操作.此外, 我们想通过EF6的Cod ...

  5. Entity Framework 6 Recipes 2nd Edition(13-4)译 -> 有效地创建一个搜索查询

    问题 你想用LINQ写一个搜索查询,能被转换成更有效率的SQL.另外,你想用EF的CodeFirst方式实现. 解决方案 假设你有如下Figure 13-6所示的模型 Figure 13-6. A s ...

  6. Entity Framework 6 Recipes 2nd Edition(13-2)译 -> 用实体键获取一个单独的实体

    问题 不管你用DBFirst,ModelFirst或是CodeFirst的方式,你想用实体键获取一个单独的实体.在本例中,我们用CodeFirst的方式. 解决方案 假设你有一个模型表示一个Paint ...

  7. Entity Framework 6 Recipes 2nd Edition(13-3)译 -> 为一个只读的访问获取实体

    问题 你想有效地获取只是用来显示不会更新的操作的实体.另外,你想用CodeFirst的方式来实现 解决方案 一个非常常见行为,尤其是网站,就是只是让用户浏览数据.大多数情况下,用户不会更新数据.在这种 ...

  8. Entity Framework 6 Recipes 2nd Edition(13-5)译 -> 使POCO的修改追踪更高

    问题 你正在使用POCO,你想提高修改跟踪的性能,同时使内存消耗更少.另外,你想通过EF的CodeFirst方式来实现. 解决方案 假设你有一个关于Account(帐户)和相关的Payments(支付 ...

  9. Entity Framework 6 Recipes 2nd Edition(13-9)译 -> 避免Include

    问题 你想不用Include()方法,立即加载一下相关的集合,并想通过EF的CodeFirst方式实现. 解决方案 假设你有一个如Figure 13-14所示的模型: Figure 13-14. A ...

  10. Entity Framework 6 Recipes 2nd Edition(目录索引)

    Chapter01. Getting Started with Entity Framework / 实体框架入门 1-1. A Brief Tour of the Entity Framework ...

随机推荐

  1. expect用法

    1. [#!/usr/bin/expect]  这一行告诉操作系统脚本里的代码使用那一个shell来执行.这里的expect其实和linux下的bash.windows下的cmd是一类东西.  注意: ...

  2. 【Machine Learning】KNN算法虹膜图片识别

    K-近邻算法虹膜图片识别实战 作者:白宁超 2017年1月3日18:26:33 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...

  3. 如何用百度MIP快速搭建体验友好的移动页面

    在读这篇文章之前,请确定你已经了解MIP定义及加速原理.如果不确定的话,可以到MIP官网了解. 改造前期准备和注意事项: 你可以选择直接将原先的移动站点直接改成MIP站,也可以单独再做一套MIP站点与 ...

  4. Ubuntu 14.04中Elasticsearch集群配置

    Ubuntu 14.04中Elasticsearch集群配置 前言:本文可用于elasticsearch集群搭建参考.细分为elasticsearch.yml配置和系统配置 达到的目的:各台机器配置成 ...

  5. Canvas坐标系转换

    默认坐标系与当前坐标系 canvas中的坐标是从左上角开始的,x轴沿着水平方向(按像素)向右延伸,y轴沿垂直方向向下延伸.左上角坐标为x=0,y=0的点称作原点.在默认坐标系中,每一个点的坐标都是直接 ...

  6. .NET Core的日志[2]:将日志输出到控制台

    对于一个控制台应用,比如采用控制台应用作为宿主的ASP.NET Core应用,我们可以将记录的日志直接输出到控制台上.针对控制台的Logger是一个类型为ConsoleLogger的对象,Consol ...

  7. WebApi返回Json格式字符串

    WebApi返回json格式字符串, 在网上能找到好几种方法, 其中有三种普遍的方法, 但是感觉都不怎么好. 先贴一下, 网上给的常用方法吧. 方法一:(改配置法) 找到Global.asax文件,在 ...

  8. 文档对象模型DOM通俗讲解

    转自:http://www.jb51.net/article/42671.htm 在开始之前先说一点,DOM是非常容易理解的,但是大家说的太官方,让人很是难于理解,我们就用非常简单的语言翻译一遍.加深 ...

  9. 张小龙宣布微信小程序1月9日发布,并回答了大家最关心的8个问题

    2016 年 12 月 28 日,张小龙在微信公开课 PRO 版的会场上,宣布了微信小程序的正式发布时间. 微信小程序将于 2017 年 1 月 9 号正式上线. 同时他解释称,小程序就像PC时代的网 ...

  10. Kotlin类:功能更强、而更简洁(KAD 03)

    作者:Antonio Leiva 时间:Dec 7, 2016 原文链接:http://antonioleiva.com/classes-kotlin/ Kotlin类尽可能简单,这样用较少的代码完成 ...