第七节: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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/248167.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

js(Dom+Bom)第八天

JavaScript 移动端事件介绍 touch事件类型 移动设备上无法使用鼠标&#xff0c;当手指按下屏幕的时候会触发 click,mousedown,mouseup事件&#xff0c;但是在移动设备上有专门的事件&#xff1a; touch 备注&#xff1a; 在移动端touch事件需要通过事件监听的方式添加touchsta…

为什么mysql 5.7.24启停不显示错误信息?log-error_verbosity参数

关键词&#xff1a;log-error_verbosity &#xff0c;mysql启停没有信息&#xff0c;mysql启停不显示错误信息&#xff0c;mysql不显示启停信息 原因就是因为 log-error_verbosity 2 被设置成了1/2&#xff0c;需要设置成3才行。 转载自&#xff1a;https://www.cnblogs.com/k…

ASP.NET Core 3.0中使用动态控制器路由

原文&#xff1a;Dynamic controller routing in ASP.NET Core 3.0 作者&#xff1a;Filip W 译文&#xff1a;https://www.cnblogs.com/lwqlun/p/11461657.html 译者&#xff1a;Lamond Lu 译者注 今天在网上看到了这篇关于ASP.NET Core动态路由的文章&#xff0c;感觉蛮有意思…

d3.js 教程 模仿echarts折线图

今天我们来仿echarts折线图,这个图在echarts是折线图堆叠&#xff0c;但是我用d3改造成了普通的折线图&#xff0c;只为了大家学习&#xff08;其实在简单的写一个布局就可以&#xff09;。废话不多说商行代码。 1 制作 Line 类 class Line {constructor() {this._width 1100;…

vue中v-for的使用

本人正在开始学习Vue,每天写写基础的记录,希望对大家有帮助,如有错误还望指出,我也是一个小白,也希望大家能一起进步 v-for指令的使用: 1.循环普通数组 item in list 中的item是自己个想写什么名写什么名 另一种写法 i 表示索引值 2.循环对象数组 3.循环普通对象 4.迭代数字 注…

js高级第一天

JavaScript面向对象 1.1两大编程思想&#xff1a; 1、面向过程 ​ 面向过程&#xff1a;POP(Process-oriented programming) 面向过程就是分析出解决问题所需要的步骤&#xff0c;然后用函数把这些步骤一步一步实现&#xff0c;使用的时候再一个一个的依次调用就可以了。 ​…

d3.js 教程 模仿echarts legend功能

上一节记录没有加上echarts的legend功能&#xff0c;这一小节补一下。 1. 数据 我们可以从echarts中看出&#xff0c;折线数据并不是我们传进入的原始数据&#xff08;多数情况下我们也不会修改原始数据&#xff09;&#xff0c;而是原始数组的一个备份而已。备份数组的方法有很…

小程序2-基本架构讲解(一)WXSS样式

项目里边生成了不同类型的文件: .json 后缀的 JSON 配置文件.wxml 后缀的 WXML 模板文件.wxss 后缀的 WXSS 样式文件.js 后缀的 JS 脚本逻辑文件WXSS 样式 WXSS (WeiXin Style Sheets)是一套样式语言&#xff0c;用于描述 WXML 的组件样式。WXSS 具有 CSS 大部分的特性 新增了尺…

js高级—tab栏切换(面向对象做法)

<main><h4>Js 面向对象 动态添加标签页</h4><div class"tabsbox" id"tab"><!-- tab 标签 --><nav class"fisrstnav"><ul><li class"liactive"><span>测试1</span><sp…

Win10卸载python总是提示error2503失败各种解决办法

最近win10的电脑装了python的3.4&#xff0c;然后想卸载&#xff0c;就总是提示error 2053&#xff0c;类似于这种&#xff1a; 下面是我的坎坷解决之路&#xff1a; 1、网上说&#xff0c;任务管理器 --> 详细信息 --> explorer.exe结束任务&#xff0c;结束资源管理器&…

js高级—查询商品案例

<div class"search">按照价格查询&#xff1a;<input type"text" class"start"> - <input type"text" class"end"><button class"search-price">搜索</button> 按照商品名称查询&a…

js高级第二天

构造函数和原型 构造函数和原型 在典型的OOP 的语言中&#xff08;如Java&#xff09;&#xff0c;都存在类的概念&#xff0c;类就是对象的模板&#xff0c;对象就是类的实例&#xff0c;但在ES6之前&#xff0c;JS 中并没用引入类的概念。ES6&#xff0c;全称ECMAScript6.0…

操作系统原理之文件系统(第五章)

一、文件 1、⽂件系统的⽤户接⼝包括⽂件的命名、类型、属性和对⽂件的操作 2、⽂件命名&#xff1a;所有操作系统都允许⽤1&#xff5e;8个字⺟组成的字符串 3、⽂件扩展名&#xff1a;多数操作系统都⽀持⽂件名⽤圆点隔开分为两部分&#xff0c;圆点后⾯的部分称为⽂件扩展名…

js高级第三天

原型链 作用&#xff1a;提供一个成员的查找机制&#xff0c;或者查找规则含义&#xff1a;由原型所串联起来的链装结构JavaScript 的成员查找机制(规则) 当访问一个对象的属性&#xff08;包括方法&#xff09;时&#xff0c;首先查找这个对象自身有没有该属性。如果没有就查…

为什么大学的计算机老师技术那么厉害,却不愿意当程序员?

不知道大家有多少是从事跟计算机有关的工作的&#xff0c;每次想到大学时的计算机考试&#xff0c;都能令小小编心惊胆战呀&#xff0c;各式代码和计算机语言&#xff0c;真的是很令人头痛了。不过呢&#xff0c;也有很多大神&#xff0c;大学学着其他的专业&#xff0c;却在毕…

DDG全家桶之3022

本篇文章主要根据360Netlab新出的DDG分析文档来复现新变种3022&#xff0c;会涉及部分分析和清除的方法&#xff0c;本篇文章只用于学习交流&#xff0c;为广大受害者提供清除思路 &#xff0c;请勿用于非法用途&#xff0c;产生一切后果与作者无关 详情请参考文档&#xff1a;…

js高级第四天

课程回顾&#xff1a; ​ 原型链&#xff1a;由原型构成链状结构&#xff0c;提供成员查找机制 ​ 继承&#xff1a;组合继承&#xff1a;构造函数和原型对象 ​ 属性&#xff1a;调用父构造函数的时候用call改变this指向 ​ 方法&#xff1a;父实例对象赋值给子原型对象&a…

d3.js 制作简单的俄罗斯方块

d3.js是一个不错的可视化框架&#xff0c;同时对于操作dom也是十分方便的。今天我们使用d3.js配合es6的类来制作一个童年小游戏--俄罗斯方块。话不多说先上图片。 1. js tetris类 由于方法拆分的比较细所以加上了一些备注&#xff08;这不是我的风格&#xff01;&#xff09; c…

Flask中路由系统以及蓝图的使用

一、Flask的路由系统 1.app.route()装饰器中的参数 methods:当前URL地址&#xff0c;允许访问的请求方式 app.route("/info", methods["GET", "POST"]) def student_info():stu_id int(request.args["id"])return f"Hello Old b…