第四节: EF调用存储过程的通用写法和DBFirst模式子类调用的特有写法
一. 背景
上一个章节,介绍了EF调用两类SQL语句,主要是借助 ExecuteSqlCommand 和 SqlQuery 两个方法来完成,在本章节主要是复习几类存储过程的写法和对应的EF调用这几类存储过程的写法,另外介绍EF的DBFirst模式的下EF存储过程的特有写法。
本章要达到以下几个目标:
① 熟练掌握存储过程的相关概念和几类写法(去复习)
② EF各种模式调用各种存储过程的通用写法(也是借助 ExecuteSqlCommand 和 SqlQuery )
③ EF的DBFirst模式事先映射好存储过程,简洁调用的写法
二. EF调用存储过程
EF调用存储过程通用的写法,分两类:
① 对于查询相关的存储过程,调用 SqlQuery 方法
② 对于增删改或其他的存储过程,调用 ExecuteSqlCommand 方法
1. 不含任何参数(查询类的存储过程)
直接调用SqlQuery方法进行操作。
1 if (exists (select * from sys.objects where name = 'GetAll')) 2 drop proc GetAll 3 go 4 create proc GetAll 5 as 6 select * from TestOne; 7 8 -- 调用 9 exec GetAll;
1 private static void NewMethod(DbContext db) 2 { 3 Console.WriteLine("---------------------------------1. 测试查询所有数据(不含输入参数)----------------------------------------"); 4 List<TestOne> tList = db.Database.SqlQuery<TestOne>("GetAll").ToList(); 5 foreach (var item in tList) 6 { 7 Console.WriteLine("id为:{0},t1为:{1},t2为:{2}", item.id, item.t1, item.t2); 8 } 9 }
2. 含多个输入参数(查询类的存储过程)
调用SqlQuery方法进行操作,传入参数的使用要使用SqlParameter参数化的方式进行传入,特别注意:调用时,存储过程的名字后面的参数 必须按照SqlParameter中的先后顺序来写。
1 if (exists (select * from sys.objects where name = 'GetALLBy'))2 drop proc GetALLBy3 go4 create proc GetALLBy(5 @id varchar(32),6 @t1 varchar(32)7 )8 as9 select * from TestOne where id=@id and t1=@t1; 10 11 exec GetALLBy @id='1',@t1='2';
1 private static void NewMethod2(DbContext db)2 {3 Console.WriteLine("---------------------------------2. 测试根据指定条件查询数据(含输入参数)----------------------------------------");4 SqlParameter[] para ={5 new SqlParameter("@id","1"),6 new SqlParameter("@t1","txt1")7 };8 //调用的时,存储过程的名字后面的参数 必须按照SqlParameter中的先后顺序来写9 List<TestOne> tList = db.Database.SqlQuery<TestOne>("GetALLBy @id,@t1", para).ToList(); 10 foreach (var item in tList) 11 { 12 Console.WriteLine("id为:{0},t1为:{1},t2为:{2}", item.id, item.t1, item.t2); 13 } 14 }
3. 增删改的存储过程(含1个输入参数)
调用 ExecuteSqlCommand 方法来执行,针对输入参数,要采用SqlParameter的方式来进行传参数
1 if (exists (select * from sys.objects where name = 'DoSome'))2 drop proc DoSome3 go 4 create proc DoSome(5 @id varchar(32)6 )7 as8 begin transaction9 begin try 10 truncate table [dbo].[TestOne]; 11 insert into TestOne values(@id,'1','2'); 12 delete from TestOne where id='2' 13 commit transaction 14 end try 15 begin catch 16 rollback transaction 17 end catch 18 19 exec DoSome 1
private static void NewMethod3(DbContext db){Console.WriteLine("---------------------------------3. 测试根据指定条件查询数据(含输入参数)----------------------------------------");SqlParameter[] para ={new SqlParameter("@id",Guid.NewGuid().ToString("N")),};int n = db.Database.ExecuteSqlCommand("DoSome @id", para);if (n > 0){Console.WriteLine("操作成功");}else{Console.WriteLine("没有更多数据进行处理");}}
4. 带输出参数的存储过程的调用
1 GO2 if (exists (select * from sys.objects where name = 'GetT1Value'))3 drop proc GetT1Value4 go5 create proc GetT1Value(6 @t1 varchar(32),7 @count int output8 )9 as 10 select @count=count(*) from TestOne where t1=@t1; 11 select * from TestOne where t1=@t1; 12 go 13 declare @myCount int; 14 exec GetT1Value '111',@myCount output; 15 select @myCount as myCount;
1 private static void NewMethod4(DbContext db)2 {3 Console.WriteLine("---------------------------------4. 测试查询含有输入和输出操作----------------------------------------");4 //把输出参数单独拿出来声明5 SqlParameter para1 = new SqlParameter("@t2", SqlDbType.Int);6 para1.Direction = ParameterDirection.Output;7 //把输出参数放到数组里8 SqlParameter[] para2 ={9 new SqlParameter("@t1","111"), 10 para1 11 }; 12 var tList1 = db.Database.SqlQuery<TestOne>("exec GetT1Value @t1,@t2 out", para2).ToList(); 13 //通过输出参数在数组中的位置来获取返回值。 14 var count = para2[1].Value; 15 16 Console.WriteLine($"数量count为:{count}"); 17 foreach (var item in tList1) 18 { 19 Console.WriteLine("id为:{0},t1为:{1},t2为:{2}", item.id, item.t1, item.t2); 20 } 21 22 }
PS:这种调用方式,需要先声明一下输出类型,然后把输出参数放到SqlParameter这个数组里,执行完后,通过数值下标.Value来获取这个返回值。(和DBFirst模式下调用有所不同)
三. DBFirst模式快捷调用存储过程
前面介绍的调用存储过程的方法是通用模式,无论EF的哪种模式都可以使用,这里将介绍DBFirst模式的快捷调用,原理即创建的时候将存储过程映射进来了,所以可以直接调用。如下图:
1. 不含任何参数(查询类存储过程)
1 -- 1.无参存储过程(查询)2 if (exists (select * from sys.objects where name = 'GetAll'))3 drop proc GetAll4 go5 create proc GetAll6 as7 select * from DBTestOne;8 9 -- 调用 10 exec GetAll;
1 private static void DBNewMethod(EFDB3Entities db) 2 { 3 Console.WriteLine("---------------------------------1. 测试查询所有数据(不含输入参数)----------------------------------------"); 4 var tList = db.GetAll().ToList(); 5 foreach (var item in tList) 6 { 7 Console.WriteLine("id为:{0},t1为:{1},t2为:{2}", item.id, item.t1, item.t2); 8 } 9 }
2. 含多个输入参数(查询类存储过程)
1 --2. 有参数的存储过程(查询)2 if (exists (select * from sys.objects where name = 'GetALLBy'))3 drop proc GetALLBy4 go5 create proc GetALLBy(6 @id varchar(32),7 @t1 varchar(32)8 )9 as 10 select * from DBTestOne where id=@id and t1=@t1; 11 12 exec GetALLBy @id='1',@t1='2';
1 private static void DBNewMethod2(EFDB3Entities db) 2 { 3 Console.WriteLine("---------------------------------2. 测试根据指定条件查询数据(含输入参数)----------------------------------------"); 4 var tList = db.GetALLBy("11", "1").ToList(); 5 foreach (var item in tList) 6 { 7 Console.WriteLine("id为:{0},t1为:{1},t2为:{2}", item.id, item.t1, item.t2); 8 } 9 }
3. 增删改存储过程(含1个输入参数)
1 --3. 增删改的一组过程2 if (exists (select * from sys.objects where name = 'DoSome'))3 drop proc DoSome4 go 5 create proc DoSome(6 @id varchar(32)7 )8 as9 begin transaction 10 begin try 11 truncate table [dbo].[DBTestOne]; 12 insert into DBTestOne values(@id,'1','2'); 13 delete from DBTestOne where id='2' 14 commit transaction 15 end try 16 begin catch 17 rollback transaction 18 end catch 19 20 go 21 exec DoSome 1
1 private static void DBNewMethod3(EFDB3Entities db)2 {3 Console.WriteLine("---------------------------------3. 测试根据指定条件查询数据(含输入参数)----------------------------------------");4 int n = db.DoSome("33");5 if (n > 0)6 {7 Console.WriteLine("操作成功");8 }9 else 10 { 11 Console.WriteLine("没有更多数据进行处理"); 12 } 13 14 }
4. 带有输出参数
1 if (exists (select * from sys.objects where name = 'GetT1Value'))2 drop proc GetT1Value3 go4 create proc GetT1Value(5 @t1 varchar(32),6 @count int output7 )8 as9 select @count=count(*) from DBTestOne where t1=@t1; 10 select * from DBTestOne where t1=@t1; 11 go 12 declare @myCount int; 13 exec GetT1Value '111',@myCount output; 14 select @myCount as myCount;
1 private static void DBNewMethod4(EFDB3Entities db)2 {3 Console.WriteLine("---------------------------------4. 测试查询含有输入和输出操作----------------------------------------");4 //声明一下输出参数5 ObjectParameter para1 = new ObjectParameter("XXX", SqlDbType.Int);6 7 var tList1 = db.GetT1Value("1", para1).ToList();8 //通过.Value获取输出参数的值。9 var count = para1.Value; 10 11 Console.WriteLine($"数量count为:{count}"); 12 foreach (var item in tList1) 13 { 14 Console.WriteLine("id为:{0},t1为:{1},t2为:{2}", item.id, item.t1, item.t2); 15 } 16 17 }
PS:需要先声明ObjectParameter对象来存放输出参数,执行完后,通过.Value即可以获取输出参数,输出参数都是一个值,还没遇到集合的(PS:欢迎补充)。
第四节: EF调用存储过程的通用写法和DBFirst模式子类调用的特有写法相关推荐
- oracle数据块调用存储过程,VC调用存储过程的通用方法(ORACLE篇)
先对上一篇调用SQLServer的存储过程作一点补充,就是如果存储过程里有Insert,update,delete等操作,最后返回结果集,按示例代码有可能得不到数据,因为返回的数据有可能不在第一个结果 ...
- C#调用存储过程的通用类
using System; using System.Collections.Generic; using System.Text; using System.Data.SqlClient; usin ...
- 第十四节: EF的三种模式(四) 之 原生正宗的 CodeFirst模式的默认约定
一. 简介 1. 正宗的CodeFirst模式是不含有edmx模型,需要手动创建实体.创建EF上下文,然后生成通过代码来自动映射生成数据库. 2. 旨在:忘记SQL.忘记数据库. 3. 三类配置:On ...
- python调用存储过程怎么传多个参数_Python - pyodbc调用具有参数名称的存储过程...
I need to call a SqlServer stored procedure from python2.7 via pyodbc module with input parameter na ...
- Hibernate调用存储过程
Hibernate调用存储过程 Hibernate调用存储过程方法一: List<?> list = new ArrayList<HibernateProcedureObject& ...
- spring jdbctemplate调用存储过程,返回list对象
注:本文来源于< spring jdbctemplate调用存储过程,返回list对象 > spring jdbctemplate调用存储过程,返回list对象 方法: /*** 调用存储 ...
- mysql naivcat执行存储过程_mysql使用navicat编写调用存储过程
在Navicat里面,找到函数,右键,新建函数,选择过程,如果有参数就填写函数,如果没有就直接点击完成 在BEGIN......END中间编写要执行的sql语句,例如下面存储过程取名为pro_data ...
- 网络斗地主游戏的完整设计与实现(三)入口存储过程详解,理解动态调用存储过程的原理
引言 在前一篇文章中说到了一个核心技术路线,就是在js代码中通过ajax请求调用sqlserver中的存储过程. 下面对这一个调用过程在数据库端的工作过程做一个较为详细的说明.因为这里用到了在存储过程 ...
- kettle调用oracle存储过程,kettle 调用存储过程
这里整理一下有关kettle调用存储过程的问题 刚开机,就看到昨天写的存储过程在kettle的Job定时调用里没有执行成功,很是不理解!就是简单的更新两个表的字段,注意这里我定义了一个输出参数MESS ...
最新文章
- 陕西信息计算机学校,陕西计算机信息专业学校
- UML-2-迭代、进化和敏捷
- 教您怎么从spring 官网下载参考文档
- selenium对富文本的操作
- java映射的概念_Java 反射 概念理解
- c语言0可以除10吗,C语言10.0
- Java中类的创建及类与对象的关系
- live2dmesh渲染优先级_如何渲染Live2D模型
- c语言逻辑推理题大全,C语言逻辑推理例题(附答案)
- mapminmax函数
- Windows不重启使用最新hosts文件
- 一年级前一学期计算机应用题,计算机教学工作计划7篇
- 照片去雾怎么操作?学会这招就不用担心雾化了
- 编程初学者如何缓解迷茫和焦虑?墙裂推荐此文,助你赢在起跑线
- windows置顶程序DeskPins的下载、安装和使用
- FreeSwitch呼入处理流程
- oracle官网下载JDK速度很慢的解决方案
- 重启c语言-查验身份证
- 【毕业论文】开题报告写作技巧
- 2022-2027年中国机器人伺服电机行业发展前景及投资战略咨询报告
热门文章
- Linux系统运维成长记
- 出口同比中国经济三大怪状折射出啥危机?
- Hibernate C3P0连接池配置
- 编程是一门实践性的科学
- 【数据结构与算法】快排、归并 O(nlogn) 基于比较
- 平板xmind怎么添加父主题_xmind 怎么插入子主题
- cocos 禁掉快速点击_win10系统快速运行debug程序的技巧
- mysql数据库sysdate_MySql数据库知识点复习
- memset和fill
- alonedb.php on line 58,SHOPEX出现\core\include_v5\AloneDB.php on line 58的解决办法