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. MIP 官方发布 v1稳定版本

    近期,MIP官方发布了MIP系列文件的全新v1版本,我们建议大家尽快完成升级. 一. 我是开发者,如何升级版本? 对于MIP页面开发者来说,只需替换线上引用的MIP文件为v1版本,就可以完成升级.所有 ...

  2. SQL Server2014 SP2新增的数据库克隆功能

    SQL Server2014 SP2新增的数据库克隆功能 创建测试库 --创建测试数据库 create database testtest use testtest go --创建表 )) --插入数 ...

  3. AFNetworking 3.0 源码解读 总结(干货)(上)

    养成记笔记的习惯,对于一个软件工程师来说,我觉得很重要.记得在知乎上看到过一个问题,说是人类最大的缺点是什么?我个人觉得记忆算是一个缺点.它就像时间一样,会自己消散. 前言 终于写完了 AFNetwo ...

  4. Kooboo CMS技术文档之一:Kooboo CMS技术背景

    语言平台 依赖注入方案 存储模型 1. 语言平台 Kooboo CMS基于.NET Framework 4.x,.NET Framework 4.x的一些技术特性成为站点开发人员使用Kooboo CM ...

  5. node中子进程同步输出

    管道 通过"child_process"模块fork出来的子进程都是返回一个ChildProcess对象实例,ChildProcess类比较特殊无法手动创建该对象实例,只能使用fo ...

  6. 【Reading Note】算法读书杂记

    1 排序 排序基本信息 稳定性:排序前大的数在排序后,大的数依然保持不变就是稳定排序,反之不稳定 内外排序:根据待排序的记录是否放在内存里面区分的.诸如:插入排序(直接插入&希尔).交换排序( ...

  7. 声音分贝的概念,dBSPL.dBm,dBu,dBV,dBFS

    需要做个音频的PPM表,看着一堆的音频术语真是懵了,苦苦在网上扒了几天的文档,终于有了点收获,下面关于声音的分贝做个总结. 分贝 Decibel 分贝(dB)是一个对数单位(logarithmic u ...

  8. C# 实时折线图,波形图

    此Demo是采用VS自带的Chart图表控件,制作实时动态显示的折线图,和波形图. 涉及到知识如下: Chart 控件,功能强大,可以绘制柱状图,折线图,波形图,饼状图,大大简化了对图的开发与定制. ...

  9. JavaScript学习笔记(三)——this、原型、javascript面向对象

    一.this 在JavaScript中this表示:谁调用它,this就是谁. JavaScript是由对象组成的,一切皆为对象,万物皆为对象.this是一个动态的对象,根据调用的对象不同而发生变化, ...

  10. iOS 小知识点(持续更新)

    1.如何通过代码设置Button  title的字体大小 设置Button.titleLabel.font = [UIFont systemFontOfSize:<#(CGFloat)#> ...