第七节:EF Core调用SQL语句和存储过程
一. 查询类(FromSql)
1.说明
A. SQL查询必须返回实体的所有属性字段。
B. 结果集中的列名必须与属性映射到的列名相匹配。
C. SQL查询不能包含关联数据
D. 除Select以为的其它SQL语句无法运行。
2.调用SQL语句的几种情况
A. 基本的原生SQL查询
B. 利用$内插语法进行传递
C. 原生SQL与linq语法相结合
D. 利用SqlParameter进行参数化查询
代码分享:
1 { 2 using (EFDB01Context db = new EFDB01Context()) 3 { 4 //1.基本的原生SQL查询 5 var userList1 = db.Set<T_UserInfor>().FromSql("select * from T_UserInfor where id!='123'").ToList(); 6 7 //2.利用$内插语法进行传递 8 var myId = "2fc343069e0a4a559b62b08d5999dbcd"; 9 var userList2 = db.Set<T_UserInfor>().FromSql($"select * from T_UserInfor where id= {myId}").ToList(); 10 11 //3.原生SQL与linq语法相结合 12 var userList3 = db.Set<T_UserInfor>().FromSql($"select * from T_UserInfor") 13 .Where(u => u.id == "2fc343069e0a4a559b62b08d5999dbcd") 14 .ToList(); 15 var userList4 = db.Set<T_UserInfor>().FromSql($"select * from T_UserInfor") 16 .Where(u => u.id != "1111") 17 .OrderBy(u => u.addTime) 18 .ToList(); 19 20 //4.利用SqlParameter进行参数化查询 21 SqlParameter[] paras ={ 22 new SqlParameter("@id","2fc343069e0a4a559b62b08d5999dbcd"), 23 new SqlParameter("@userName","ypf"), 24 }; 25 var userList5 = db.Set<T_UserInfor>().FromSql("select * from T_UserInfor where id=@id and userName=@userName", paras).ToList(); 26 } 27 }
3.调用存储过程的几种情况
可以利用SqlParameter传递参数,防止sql注入。
A.不含任何参数
B.含多个输入参数
C.含输入参数和输出参数
用到的表结构:
对应的生成存储过程的代码:
1 USE [EFDB01] 2 3 --事先准备:插入两条数据 4 select * from T_UserInfor 5 truncate table T_UserInfor 6 insert into T_UserInfor values('01','ypf','男',12,'2019-08-08') 7 insert into T_UserInfor values('02','ypf2','女',30,'2019-09-08') 8 9 -- 1. 不含任何参数存储过程 10 if (exists (select * from sys.objects where name = 'GetAll')) 11 drop proc GetAll 12 go 13 create proc GetAll 14 as 15 select * from T_UserInfor; 16 17 -- 调用 18 exec GetAll; 19 20 21 --2. 含多个输入参数的存储过程 22 if (exists (select * from sys.objects where name = 'GetALLBy')) 23 drop proc GetALLBy 24 go 25 create proc GetALLBy( 26 @id varchar(32), 27 @userName varchar(20) 28 ) 29 as 30 select * from T_UserInfor where id=@id and userName=@userName; 31 32 exec GetALLBy @id='01',@userName='ypf'; 33 34 --3. 含输出参数的存储过程 35 if (exists (select * from sys.objects where name = 'GetSpecial')) 36 drop proc GetSpecial 37 go 38 create proc GetSpecial( 39 @userName varchar(32), 40 @count int output 41 ) 42 as 43 select @count=count(*) from T_UserInfor; 44 select * from T_UserInfor where userName= @userName; 45 46 go 47 declare @myCount int; 48 exec GetSpecial 'ypf',@myCount output; 49 select @myCount as myCount;
对应EF调用的代码:
1 { 2 using (EFDB01Context db = new EFDB01Context()) 3 { 4 //1. 不含任何参数存储过程 5 var data1 = db.Set<T_UserInfor>().FromSql("GetAll").ToList(); 6 7 //2. 含多个输入参数的存储过程 8 SqlParameter[] para ={ 9 new SqlParameter("@id","01"), 10 new SqlParameter("@userName","ypf") 11 }; 12 var data2 = db.Set<T_UserInfor>().FromSql("GetALLBy @id,@userName", para).ToList(); 13 14 //3. 带输出参数的存储过程 15 //把输出参数单独拿出来声明 16 SqlParameter myCount = new SqlParameter("@count", SqlDbType.Int); 17 myCount.Direction = ParameterDirection.Output; 18 //把输出参数放到数组里 19 SqlParameter[] para2 ={ 20 new SqlParameter("@userName","ypf"), 21 myCount 22 }; 23 var data3 = db.Set<T_UserInfor>().FromSql("exec GetSpecial @userName,@count out", para2).ToList(); 24 //通过输出参数在数组中的位置来获取返回值。 25 var count = para2[1].Value; 26 27 } 28 }
二. 其它类(ExecuteSqlCommand)
1.说明
主要用于调用除了查询外其它的SQL语句。
2.调用SQL语句的情况
A. 基本的原生SQL查询
B. 利用$内插语法进行传递
C. 利用SqlParameter进行参数化查询
代码分享:
1 { 2 using (EFDB01Context db = new EFDB01Context()) 3 { 4 5 //1.增加 6 int result1 = db.Database.ExecuteSqlCommand("insert into T_UserInfor values('01','test1','男',21,'2019-09-09')"); 7 8 //2. 修改 9 SqlParameter[] paras ={ 10 new SqlParameter("@id","01"), 11 new SqlParameter("@userSex","未知"), 12 }; 13 int result2 = db.Database.ExecuteSqlCommand("update T_UserInfor set userSex=@userSex where id=@id", paras); 14 15 //3. 删除 16 var myId = "01"; 17 int result3 = db.Database.ExecuteSqlCommand($"delete from T_UserInfor where id={myId}"); 18 19 //4. 其它指令 20 int result4 = db.Database.ExecuteSqlCommand("truncate table T_UserInfor"); 21 } 22 }
3.调用存储过程的情况
存储过程代码
--4. 非查询类的存储过程 if (exists (select * from sys.objects where name = 'DoSome'))drop proc DoSome go create proc DoSome(@id varchar(32)) asbegin transactionbegin tryinsert into T_UserInfor values(@id,'ypf','男',12,'2019-08-08');delete from T_UserInfor where id='02'commit transactionend trybegin catchrollback transactionend catchexec DoSome '03'
EF的调用代码
1 { 2 using (EFDB01Context db = new EFDB01Context()) 3 { 4 SqlParameter[] para ={ 5 new SqlParameter("@id",Guid.NewGuid().ToString("N")), 6 }; 7 int n = db.Database.ExecuteSqlCommand("DoSome @id", para); 8 if (n > 0) 9 { 10 Console.WriteLine("操作成功"); 11 } 12 else 13 { 14 Console.WriteLine("没有更多数据进行处理"); 15 } 16 } 17 }
!
- 作 者 : Yaopengfei(姚鹏飞)
- 博客地址 : http://www.cnblogs.com/yaopengfei/
- 声 明1 : 本人才疏学浅,用郭德纲的话说“我是一个小学生”,如有错误,欢迎讨论,请勿谩骂^_^。
- 声 明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
转载于:https://www.cnblogs.com/yaopengfei/p/11459170.html
第七节:EF Core调用SQL语句和存储过程相关推荐
- EF Core 执行SQL语句和存储过程
无论ORM有多么强大,总会出现一些特殊的情况,它无法满足我们的要求.在这篇文章中,我们介绍几种执行SQL的方法. 表结构 在具体内容开始之前,我们先简单说明一下要使用的表结构. public clas ...
- EF中使用SQL语句或存储过程
EF中使用SQL语句或存储过程 1.无参数查询 var model = db.Database.SqlQuery<UserInfo>("select* from UserIn ...
- Entity Framework Core 执行SQL语句和存储过程
无论ORM有多么强大,总会出现一些特殊的情况,它无法满足我们的要求.在这篇文章中,我们介绍几种执行SQL的方法. 表结构 在具体内容开始之前,我们先简单说明一下要使用的表结构. public clas ...
- 第七节: EF的三种事务的应用场景和各自注意的问题(SaveChanges、DBContextTransaction、TransactionScope)
一. 什么是事务 我们通俗的理解事务就是一系列操作要么全部成功.要么全部失败(不可能存在部分成功,部分失败的情况). 举一个事务在我们日常生活中的经典例子:两张银行卡(甲.乙),甲向乙转钱,整个过程需 ...
- ef 执行mysql语句_在EF中执行SQL语句
一.为什么要在EF中执行SQL语句 使用EF操作数据库,可以避免写SQL语句,完成使用Linq实现,但为什么还要在EF中执行SQL语句呢.如果要写SQL语句,完全可以使用ADO.NET来操作数据库.这 ...
- 用于存储过程的ASP.NET Core Blazor和EF Core原始SQL查询
目录 介绍 背景 先决条件 使用代码 创建数据库和表 步骤1:创建ASP.NET Core Blazor服务器应用程序 运行测试应用程序 步骤2:安装软件包 连接字符串 步骤3:建立模型类 创建DBC ...
- 在EF中执行SQL语句
一.为什么要在EF中执行SQL语句 使用EF操作数据库,可以避免写SQL语句,完成使用Linq实现,但为什么还要在EF中执行SQL语句呢.如果要写SQL语句,完全可以使用ADO.NET来操作数据库 ...
- dede调用sql语句的方法
这篇文章给大家分享的是有关dede调用sql语句的方法的内容.小编觉得挺实用的,因此分享给大家做个参考.一起跟随小编过来看看吧. dede的sql语句怎么调用? sql语句调用,在一些特殊情况下还 ...
- Java学习的第七周之简单的SQL语句
Java学习的第七周之简单的SQL语句 一 简单SQL语句: 1.查询表结构 desc 表名; 2.插入数据 --方式一: 默认全部插入数据INSERT INTO 表名 VALUES (值1,值2,值 ...
最新文章
- python函数每日一讲 - cmp(x,y)
- 前端学习(1395):多人管理项目15建立请求
- python三维模型_python三维模型
- 基于Opencv--图像上采样
- Unreal Engine 4添加自定义Settings到项目设置
- iptables转发基础
- linux内核分析与应用 -- 内存管理(上)
- Linux libaio 实例,linux libaio安装
- MBR分区表详解(SD卡)
- 元宇宙大杀器来了!小扎祭出4款VR头显,挑战视觉图灵测试
- 为公寓运营商提供SaaS管理系统,寓小二获贝壳找房5000万元A轮融资...
- 推荐:(链接)幽默男女--绝对搞笑!!(每日更新)
- win7上安装DDK,SDK。。
- ASPX页面AJAX调用ASPX后台
- manjaro双系统 windows_manjaro win10双系统安装
- android触摸震动原理
- 【正点原子Linux连载】第五章 文件属性与目录-摘自【正点原子】I.MX6U嵌入式Linux C应用编程指南V1.1
- POST和GET有什么区别?
- 郝斌老师-C语言视频教程(全180讲)
- 服务器里怎么设置微信多开,私域必备,企业微信多开的4种方法
热门文章
- React.js开发生态系统概览 [译-转]
- tableau使用_使用Tableau探索墨尔本房地产市场
- 干货 | Elasticsearch7.X Scripting脚本使用详解
- “去除更多的鲜艳色彩和动态效果的搭配,精简用户使用步长,让软件更像是一件工具。(不排除以后更先进的吸引眼球的方式)“。
- 小论文期刊投稿相关整理资料
- TFT显示屏驱动设计与验证
- VC,一条会被鼠标移动的直线
- python通过链接下载文件-如何使用Python通过HTTP下载文件?
- php调用md5.js,PHP和JS实现HTTP上安全地传输密码
- 同一个网络中为什么有些计算机可以连接共享打印机,有些需要输入密码,安装局域网共享打印机时,要求输入用户和密码,但对方并没有设置,为什么?谢谢!!...