您的位置:首页>科学 >第三节: EF调用普通SQL语句的两类封装(ExecuteSqlCommand和SqlQuery )

第三节: EF调用普通SQL语句的两类封装(ExecuteSqlCommand和SqlQuery )

2023-09-16 10:16
-->

一. 前言

  在前面的两个章节中,我们分别详细介绍了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-封装增删改或其他的方法
///
/// 封装增删改或其他的方法
///

/// 数据库连接上下文
/// 数据库sql语句
/// 参数化参数
///
public static int ExecuteSqlCommand(DbContext db, string sql, params SqlParameter[] paras)
{
return db.Database.ExecuteSqlCommand(sql, paras);
}
#endregion #region 02-执行查询操作(结果为集合) public static List SqlQueryList(DbContext db, string sql, params SqlParameter[] paras)
{
return db.Database.SqlQuery(sql, paras).ToList();
}
#endregion #region 03-执行查询操作(结果为单一实体) public static T SqlQuery(DbContext db, string sql, params SqlParameter[] paras)
{
return db.Database.SqlQuery(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 tList = EFSqlTest.SqlQueryList(db, sql1);
tList.ForEach(t =>
{
Console.WriteLine("id值为{0},txt1值为{1},txt2值为{2}", www.webguidecorpuschristi.com, 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(db, sql2, paras);
if (T2!=null)
{
Console.WriteLine("id值为{0},txt1值为{1},txt2值为{2}", www.webguidecorpuschristi.com, 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事务章节将详细介绍该问题的解决方案,敬请期待。

-->