第七节: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,一经查实,立即删除!

相关文章

没用的一些水货

1. 不递归的子函数加上inline会跑的很快。 2. 在稠密图中用dijkstra堆优化会导致跑的很慢。 3. 连着开几个数组的话&#xff0c;有可能越界了评测机却返回WA。 4. 如果你用的Dev-C&#xff0c;那么有的时候会出现一些莫名其妙的编译错误。请检查是否存在未关闭的代码生成的.exe…

js(Dom+Bom)第八天

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

程序员计算器HEX、EDC、OCT等等的意思

binary 二进制 对应的是 BINoctal 八进制的 ---- OCThexadecimal 十六进制的 --- HEXdecimal 十进制的 -- DEC 转载于:https://www.cnblogs.com/132818Creator/p/11459984.html

为什么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;感觉蛮有意思…

Petrozavodsk Winter Camp, Warsaw U, 2014, A The Carpet

一个地图上有若干障碍&#xff0c;问允许出现一个障碍的最大子矩形为多大&#xff1f; 最大子矩形改编 #include<bits/stdc.h> using namespace std; #define rep(i, j, k) for (int i int(j); i < int(k); i) #define dwn(i, j, k) for (int i int(j); i > int…

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…

MFC的sendmessage和postmessage 以及sendmessagetimeout

PostMessage只负责将消息放到消息队列中&#xff0c;不确定何时及是否处理&#xff0c;相当于异步操作&#xff0c;执行后马上返回SendMessage要等到受到消息处理的返回码&#xff08;DWord类型&#xff09;后才继续&#xff0c;相当于同步操作&#xff0c;一直在等待&#xff…

python PIL图像处理-框选

框选图中位置 代码 from PIL import Image,ImageDraw,ImageFont,ImageFilter import random#------------------------------------- #filepath,[837,103][942,208]#图片处理&#xff0c;框选 def pic_rectangle(filepath,bound):image Image.open(filepath)draw ImageDraw.D…

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…

[Codeforces702F]T-Shirts——非旋转treap+贪心

题目链接&#xff1a; Codeforces702F 题目大意&#xff1a;有$n$种T恤&#xff0c;每种有一个价格$c_{i}$和品质$q_{i}$且每种数量无限。现在有$m$个人&#xff0c;第$i$个人有$v_{i}$元&#xff0c;每人每次会买他能买得起的品质最高的一件T恤(当两件T恤品质相同时优先买价格…

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;圆点后⾯的部分称为⽂件扩展名…