zoukankan      html  css  js  c++  java
  • 第三节: 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事务章节将详细介绍该问题的解决方案,敬请期待。

  • 相关阅读:
    字王谈M1字形与个人云字库
    想让网站销量爆涨?你离成功只差一个出色的购物车设计
    学习JavaScript很吃力?开发五年经验带你轻松上路!
    摹客—— 自动生成你的颜色规范
    【求职,不求人】2019最全Web设计师面试问题,助你轻松拿下面试
    交易类APP原型设计分享
    全是宝!20款优质高效的在线协作工具任你挑,就是这么强大!
    灵感专题—2019年优秀网页设计作品赏析#4月
    2019年最实用的导航栏设计实践和案例分析全解
    摹客标注:自动标注一键生成,手动标注自由补充
  • 原文地址:https://www.cnblogs.com/yaopengfei/p/7678819.html
Copyright © 2011-2022 走看看