第三节: EF调用普通SQL语句的两类封装(ExecuteSqlCommand和SqlQuery )
一. 前言
在前面的两个章节中,我们分别详细介绍了EF的增删改的两种方式(方法和状态)和EF查询的两种方式( Lambda和Linq ),进行到这里,可以说对于EF,已经入门了,本来应该继续往下进行EF的高级属性,但本章节要打断一下,俗话所得好,“做人不能忘本”,应用到开发领域,就是“编码也不能忘本”,我们原始的SQL语句,在本章节将结合EF的调用,进行复习一番。
本章节我们要达到的目标是:
① 掌握基本的单表和多表SQL操作(单表操作复习和多表操作复习)
② 加深SQL重点关键字的使用(去复习)
③ SQL参数化的写法
④ EF如何调用各类SQL语句
二. 两大核心方法
1. 从程序集的角度分析
EF调用SQL语句,主要是依赖于DbContext→DataBase类下SqlQuery和ExecuteSqlCommand两个方法,来处理查询的SQL语句、增删改或其它的SQL语句。
2. 封装思想
结合泛型方法和参数化查询,将这两个方法进行简单封装一下,方便后面代码的调用。
1 #region 01-封装增删改或其他的方法2 /// <summary>3 /// 封装增删改或其他的方法4 /// </summary>5 /// <param name="db">数据库连接上下文</param>6 /// <param name="sql">数据库sql语句</param>7 /// <param name="paras">参数化参数</param>8 /// <returns></returns>9 public static int ExecuteSqlCommand(DbContext db, string sql, params SqlParameter[] paras) 10 { 11 return db.Database.ExecuteSqlCommand(sql, paras); 12 } 13 #endregion 14 15 #region 02-执行查询操作(结果为集合) 16 17 public static List<T> SqlQueryList<T>(DbContext db, string sql, params SqlParameter[] paras) 18 { 19 return db.Database.SqlQuery<T>(sql, paras).ToList(); 20 } 21 #endregion 22 23 #region 03-执行查询操作(结果为单一实体) 24 25 public static T SqlQuery<T>(DbContext db, string sql, params SqlParameter[] paras) 26 { 27 return db.Database.SqlQuery<T>(sql, paras).FirstOrDefault(); 28 } 29 #endregion
补充参数化查询:
目的:防止SQL注入。 那么什么是SQL注入呢?
SQL 注入漏洞存在的原因,就是拼接 SQL 参数。也就是将用于输入的查询参数,直接拼接在 SQL 语句中,导致了SQL 注入漏洞。
举例:String sql = "select * from user where id=" + id; 该局sql语句的目的是通过id来查询用户信息,id的值传入进入。
SQL注入的写法:id值传为: 2 or 1=1 ,由于 1=1 始终为true,加上or的配合,可以将所有的user信息查出来。
以上还是比较温柔的:下面来个狠的,比如: 2; truncate table user 这种破坏就有点可怕了。
参数化查询的写法:
String sql = "select * from user where id=@id" ;
SqlParameter[] paras ={
new SqlParameter("@id","2"),};这种写法,就有效的阻止SQL注入的风险。
三. 代码实践
下面结合代码,展示EF调用SQL语句进行查询、增加、修改、删除、删除表所有数据的相关操作。
1 using (DbContext db = new CodeFirstModel())2 {3 //1. 查询TestInfor表中的所有数据4 Console.WriteLine("-----------------------------1. 查询TestInfor表中的所有数据----------------------------------");5 string sql1 = @"select * from TestInfor";6 List<TestInfor> tList = EFSqlTest.SqlQueryList<TestInfor>(db, sql1);7 tList.ForEach(t =>8 {9 Console.WriteLine("id值为{0},txt1值为{1},txt2值为{2}", t.id, t.txt1, t.txt2); 10 }); 11 12 //2. 查询TestInfor表中ID值为2的数据txt1和txt2 13 Console.WriteLine("-----------------------------2. 查询TestInfor表中ID值为2的数据----------------------------------"); 14 string sql2 = @"select * from TestInfor where id=@id "; 15 SqlParameter[] paras ={ 16 new SqlParameter("@id","2"), 17 }; 18 TestInfor T2 = EFSqlTest.SqlQuery<TestInfor>(db, sql2, paras); 19 if (T2!=null) 20 { 21 Console.WriteLine("id值为{0},txt1值为{1},txt2值为{2}", T2.id, T2.txt1, T2.txt2); 22 } 23 else 24 { 25 Console.WriteLine("没有查出符合条件的数据"); 26 } 27 28 29 //3. 增加一条数据 30 Console.WriteLine("-----------------------------3. 增加一条数据----------------------------------"); 31 string sql3 = @"insert into TestInfor values(@id,@txt1,@txt2)"; 32 SqlParameter[] paras3 ={ 33 new SqlParameter("@id",Guid.NewGuid().ToString("N")), 34 new SqlParameter("@txt1","txt1+"+Guid.NewGuid().ToString("N").Substring(1,2)), 35 new SqlParameter("@txt2","txt2+"+Guid.NewGuid().ToString("N").Substring(1,2)) 36 }; 37 int result3 = EFSqlTest.ExecuteSqlCommand(db, sql3, paras3); 38 if (result3 > 0) 39 { 40 Console.WriteLine("增加成功"); 41 } 42 43 //4. 删除一条数据 44 Console.WriteLine("-----------------------------4. 删除一条数据----------------------------------"); 45 string sql4 = @"delete from TestInfor where id=@id"; 46 SqlParameter[] paras4 ={ 47 new SqlParameter("@id","1"), 48 }; 49 int result4 = EFSqlTest.ExecuteSqlCommand(db, sql4, paras4); 50 if (result4 > 0) 51 { 52 Console.WriteLine("删除成功"); 53 } 54 else 55 { 56 Console.WriteLine("没有查到相应的数据进行删除"); 57 } 58 59 //5. 修改一条数据 60 Console.WriteLine("-----------------------------5. 修改一条数据----------------------------------"); 61 string sql5 = @"update TestInfor set txt1=@txt1 where id=@id"; 62 SqlParameter[] paras5 ={ 63 new SqlParameter("@id","2"), 64 new SqlParameter("@txt1","limaru") 65 }; 66 int result5 = EFSqlTest.ExecuteSqlCommand(db, sql5, paras5); 67 if (result5 > 0) 68 { 69 Console.WriteLine("修改成功"); 70 } 71 else 72 { 73 Console.WriteLine("没有查到相应的数据进行修改"); 74 } 75 76 //6. 删除表中的所有数据 77 Console.WriteLine("-----------------------------6. 删除表中的所有数据----------------------------------"); 78 string sql6 = @"truncate table LoginRecords"; 79 //执行成功的话 result6仍然为0 80 int result6 = EFSqlTest.ExecuteSqlCommand(db, sql6); 81 82 }
思考:EF执行多条SQL语句,如何控制事务一体呢?
在后续EF事务章节将详细介绍该问题的解决方案,敬请期待。
第三节: EF调用普通SQL语句的两类封装(ExecuteSqlCommand和SqlQuery )相关推荐
- Abp框架从零开始(基于.Net Core 2.2) 小记(三) 将EF生成调用的Sql语句打印到控制台
前一段时间,忙完了终身大事,导致自我学习的步伐给停了,这段时间赶紧快马加鞭,继续学习研究下Abp框架,这次我们把仓储层生成调用的Sql语句打印出来,方便以后程序的调试和调优. 在仓储层(EntityF ...
- ef 执行mysql语句_在EF中执行SQL语句
一.为什么要在EF中执行SQL语句 使用EF操作数据库,可以避免写SQL语句,完成使用Linq实现,但为什么还要在EF中执行SQL语句呢.如果要写SQL语句,完全可以使用ADO.NET来操作数据库.这 ...
- 在EF中执行SQL语句
一.为什么要在EF中执行SQL语句 使用EF操作数据库,可以避免写SQL语句,完成使用Linq实现,但为什么还要在EF中执行SQL语句呢.如果要写SQL语句,完全可以使用ADO.NET来操作数据库 ...
- EF中使用SQL语句或存储过程
EF中使用SQL语句或存储过程 1.无参数查询 var model = db.Database.SqlQuery<UserInfo>("select* from UserIn ...
- mybatis入门(六)之SQL语句构建器类
转载自 mybatis SQL语句构建器类 问题 Java程序员面对的最痛苦的事情之一就是在Java代码中嵌入SQL语句.这么来做通常是由于SQL语句需要动态来生成-否则可以将它们放到外部文件或 ...
- 导入数据的sql语句,两表互导
导入数据的sql语句,两表互导 insert into Product(C_ID,Pname,Ptitle,Ptype,IsProduct,onLine,FisrtSort,SecSort,Sort, ...
- MyBatis超详细介绍——SQL语句构建器类
MyBatis超详细介绍--SQL语句构建器类 (本文作为学习笔记,了解更多请参考:MyBatis参考文档) MyBatis3提供了SQL类帮助构造SQL语句: private String sele ...
- Sql语句中两个比较迷糊的概念:“连接查询” 与 “外键约束”
Sql语句中两个比较迷糊的概念:"连接查询" 与 "外键约束 Sql 中的连接查询:就是为了避免笛卡尔积,因为涉及到多表查询的化,不使用连接查询,会先将多个互相乘,求出笛 ...
- 如何使用sql语句算两经纬度的距离
本文章转载于https://segmentfault.com/a/1190000013922206 经纬度计算距离公式 对以上公式描述 1.Lung1 Lat1表示A点经纬度, Lung2 Lat2表 ...
最新文章
- Java文件流之练习
- mysql5.5索引,MySQL--5索引选择原则
- 论文浅尝 | BERT:Pre-training of Deep Bidirectional Transformers
- 【转载】web.xml中的classpath和classpath*
- 【分享】具有“魔性”的通用软件开发框架
- 【Linux常用指令整理8】别名、输入/输出重定向、管道、命令连接符、命令替换符...
- pycharm 升级 pip
- 混淆矩阵(Confusion Matrix)
- html5shiv版本,用html5shiv.js解决ie低版本浏览器支持html5标签
- xml配置service服务器文件路径,xml配置service服务器文件路径
- Android 插件化换肤方案
- Enterprise Architect v16
- 获取本月最后一天23:59:59和次月的最后一天23:59:59次月第一天0点的时间戳
- JVM--基础--19.4--垃圾收集器--Parallel Scavenge
- 【电脑常用办公软件】万彩办公大师教程丨截屏大师工具的应用
- python pil grab screen
- Unity3D官方教程爬坑
- python列表插入_python列表插入append(), extend(), insert()用法详解
- 【结构体】C语言结构体使用教程
- Contra-cnv
热门文章
- mac使用Shell(终端)SSH连接远程服务器
- VM异常关闭后导致虚拟机无法打开问题解决办法【已解决】
- 深入理解javascript函数参数
- [LeetCode]Distinct Subsequences,解题报告
- Objective-C浮点数转化整数(向上取整、向下取整)
- AsyncTask知识整理笔记
- HDOJ 1875 畅通工程再续
- 大叔手记(21):汤姆大叔博客园开博100天总结
- 第一章 概率论的基本概念
- [密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第28篇]什么是公钥密码学的IND-CCA安全定义?