第三节: 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. 封装思想
结合泛型方法和参数化查询,将这两个方法进行简单封装一下,方便后面代码的调用。
#region 01-封装增删改或其他的方法
/// <summary>
/// 封装增删改或其他的方法
/// </summary>
/// <param name="db">数据库连接上下文</param>
/// <param name="sql">数据库sql语句</param>
/// <param name="paras">参数化参数</param>
/// <returns></returns>
public static int ExecuteSqlCommand(DbContext db, string sql, params SqlParameter[] paras)
{
return db.Database.ExecuteSqlCommand(sql, paras);
}
#endregion #region 02-执行查询操作(结果为集合) public static List<T> SqlQueryList<T>(DbContext db, string sql, params SqlParameter[] paras)
{
return db.Database.SqlQuery<T>(sql, paras).ToList();
}
#endregion #region 03-执行查询操作(结果为单一实体) public static T SqlQuery<T>(DbContext db, string sql, params SqlParameter[] paras)
{
return db.Database.SqlQuery<T>(sql, paras).FirstOrDefault();
}
#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语句进行查询、增加、修改、删除、删除表所有数据的相关操作。
using (DbContext db = new CodeFirstModel())
{
//1. 查询TestInfor表中的所有数据
Console.WriteLine("-----------------------------1. 查询TestInfor表中的所有数据----------------------------------");
string sql1 = @"select * from TestInfor";
List<TestInfor> tList = EFSqlTest.SqlQueryList<TestInfor>(db, sql1);
tList.ForEach(t =>
{
Console.WriteLine("id值为{0},txt1值为{1},txt2值为{2}", t.id, t.txt1, t.txt2);
}); //2. 查询TestInfor表中ID值为2的数据txt1和txt2
Console.WriteLine("-----------------------------2. 查询TestInfor表中ID值为2的数据----------------------------------");
string sql2 = @"select * from TestInfor where id=@id ";
SqlParameter[] paras ={
new SqlParameter("@id",""),
};
TestInfor T2 = EFSqlTest.SqlQuery<TestInfor>(db, sql2, paras);
if (T2!=null)
{
Console.WriteLine("id值为{0},txt1值为{1},txt2值为{2}", T2.id, T2.txt1, T2.txt2);
}
else
{
Console.WriteLine("没有查出符合条件的数据");
} //3. 增加一条数据
Console.WriteLine("-----------------------------3. 增加一条数据----------------------------------");
string sql3 = @"insert into TestInfor values(@id,@txt1,@txt2)";
SqlParameter[] paras3 ={
new SqlParameter("@id",Guid.NewGuid().ToString("N")),
new SqlParameter("@txt1","txt1+"+Guid.NewGuid().ToString("N").Substring(,)),
new SqlParameter("@txt2","txt2+"+Guid.NewGuid().ToString("N").Substring(,))
};
int result3 = EFSqlTest.ExecuteSqlCommand(db, sql3, paras3);
if (result3 > )
{
Console.WriteLine("增加成功");
} //4. 删除一条数据
Console.WriteLine("-----------------------------4. 删除一条数据----------------------------------");
string sql4 = @"delete from TestInfor where id=@id";
SqlParameter[] paras4 ={
new SqlParameter("@id",""),
};
int result4 = EFSqlTest.ExecuteSqlCommand(db, sql4, paras4);
if (result4 > )
{
Console.WriteLine("删除成功");
}
else
{
Console.WriteLine("没有查到相应的数据进行删除");
} //5. 修改一条数据
Console.WriteLine("-----------------------------5. 修改一条数据----------------------------------");
string sql5 = @"update TestInfor set txt1=@txt1 where id=@id";
SqlParameter[] paras5 ={
new SqlParameter("@id",""),
new SqlParameter("@txt1","limaru")
};
int result5 = EFSqlTest.ExecuteSqlCommand(db, sql5, paras5);
if (result5 > )
{
Console.WriteLine("修改成功");
}
else
{
Console.WriteLine("没有查到相应的数据进行修改");
} //6. 删除表中的所有数据
Console.WriteLine("-----------------------------6. 删除表中的所有数据----------------------------------");
string sql6 = @"truncate table LoginRecords";
//执行成功的话 result6仍然为0
int result6 = EFSqlTest.ExecuteSqlCommand(db, sql6); }
思考:EF执行多条SQL语句,如何控制事务一体呢?
在后续EF事务章节将详细介绍该问题的解决方案,敬请期待。
第三节: EF调用普通SQL语句的两类封装(ExecuteSqlCommand和SqlQuery )的更多相关文章
- ASP.NET MVC深入浅出(被替换) 第一节: 结合EF的本地缓存属性来介绍【EF增删改操作】的几种形式 第三节: EF调用普通SQL语句的两类封装(ExecuteSqlCommand和SqlQuery ) 第四节: EF调用存储过程的通用写法和DBFirst模式子类调用的特有写法 第六节: EF高级属性(二) 之延迟加载、立即加载、显示加载(含导航属性) 第十节: EF的三种追踪
ASP.NET MVC深入浅出(被替换) 一. 谈情怀-ASP.NET体系 从事.Net开发以来,最先接触的Web开发框架是Asp.Net WebForm,该框架高度封装,为了隐藏Http的无状态 ...
- EF中执行sql语句,以及事务
EF to sql string sql = "select T_Task.BSID,T_Task.CloseDate,T_Task.CompleteDate,T_Task.CloseUse ...
- easyui datagrid 禁止选中行 EF的增删改查(转载) C# 获取用户IP地址(转载) MVC EF 执行SQL语句(转载) 在EF中执行SQL语句(转载) EF中使用SQL语句或存储过程 .net MVC使用Session验证用户登录 PowerDesigner 参照完整性约束(转载)
easyui datagrid 禁止选中行 没有找到可以直接禁止的属性,但是找到两个间接禁止的方式. 方式一: //onClickRow: function (rowIndex, rowData) ...
- EF中使用SQL语句或存储过程
EF中使用SQL语句或存储过程 1.无参数查询var model = db.Database.SqlQuery<UserInfo>("select* from UserInfoe ...
- 在EF中执行SQL语句
你可能要问,我用EF不就为了避免写SQL吗?如果要写SQL我不如直接用ADO.NET得了.话虽然这么说没错,可有些时候使用EF操作数据还是有一些不方便,例如让你根据条件删除一组记录,如果按照正常的流程 ...
- 在EF中执行SQL语句(转载)
在EF中执行SQL语句 你可能要问,我用EF不就为了避免写SQL吗?如果要写SQL我不如直接用ADO.NET得了.话虽然这么说没错,可有些时候使用EF操作数据还是有一些不方便,例如让你根据条件删除 ...
- EF中执行Sql语句
Entity Framework是微软出品的高级ORM框架,大多数.NET开发者对这个ORM框架应该不会陌生.本文主要罗列在.NET(ASP.NET/WINFORM)应用程序开发中使用Entity F ...
- .NET在EF中使用sql,用动态类吧!
.NET在EF中使用sql,用动态类吧! 前言 在.NET中使用Entity Framework能快速.方便地结合LINQ来对数据库进行一系列的增删改查操作.但是由于EF根据表达式最后生成通用的sql ...
- Mybatis——SQL语句构建器类
SQL语句构建器类 问题 Java程序员面对的最痛苦的事情之一就是在Java代码中嵌入SQL语句.这么来做通常是由于SQL语句需要动态来生成-否则可以将它们放到外部文件或者存储过程中.正如你已经看到的 ...
随机推荐
- LeetCode算法题-Fibonacci Number(Java实现)
这是悦乐书的第250次更新,第263篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第117题(顺位题号是509).Fibonacci数字,通常表示为F(n),形成一个称为 ...
- 大数据平台Lambda架构详解
Lambda架构由Storm的作者Nathan Marz提出.旨在设计出一个能满足.实时大数据系统关键特性的架构,具有高容错.低延时和可扩展等特. Lambda架构整合离线计算和实时计算,融合不可变( ...
- 在 Xshell 中 使用 hbase shell 进入后 无法删除
在 Xshell 中 使用 hbase shell 进入后 无法删除 问题: 在hbase shell下,误输入的指令不能使用backspace和delete删除,使用过的人都知道,这是有多坑,有多苦 ...
- 为什么 npm 要为每个项目单独安装一遍 node_modules?
nodejs中package.json中的依赖必须每个项目都有自己的node_modules文件夹,而无法在多个项目之间共用一套node_modules(像Java中的Maven那样). 依赖管理是每 ...
- 前端——DOM
什么是DOM? DOM是W3C(万维网联盟)的标准,是Document Object Model(文档对象模型)的缩写,它定义了访问HTML和XML文档的标准: “W3C文档对象模型(DOM)是中立于 ...
- 必须掌握的MySQL优化指南
当 MySQL 单表记录数过大时,增删改查性能都会急剧下降,本文会提供一些优化参考,大家可以参考以下步骤来优化. 单表优化 除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑.部 ...
- AngularJS 1.x系列:AngularJS控制器(3)
1. 控制器(Controller)定义 控制器(Controller)在AngularJS中作用是增强视图(View),AngularJS控制器是一个构造方法,用来向视图(View)中添加额外功能. ...
- js DOM操作 容易犯的错误
这样一段html片段 <select class="form-control" id="course_chapter" onchange="fi ...
- 源码编译安装php7
现在新启的项目都是采用php7了,无奈很多Linux发行版中还是php5 第三方php7源在自己本机上用用到无所谓,放到正式环境上还是有点不放心 其实编译安装也就几分钟,麻烦的是各种依赖 先删除老版本 ...
- UVA 10618 Tango Tango Insurrection
https://vjudge.net/problem/UVA-10618 题目 你想学着玩跳舞机.跳舞机的踏板上有4个箭头:上.下.左.右.当舞曲开始时,屏幕上会有一些箭头往上移动.当向上移动箭头与顶 ...