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事务章节将详细介绍该问题的解决方案,敬请期待。

  • 相关阅读:
    nowcoderD Xieldy And His Password
    Codeforces681D Gifts by the List
    nowcoder80D applese的生日
    Codeforces961E Tufurama
    Codeforces957 Mahmoud and Ehab and yet another xor task
    nowcoder82E 无向图中的最短距离
    nowcoder82B 区间的连续段
    Codeforces903E Swapping Characters
    Codeforces614C Peter and Snow Blower
    Codeforces614D Skills
  • 原文地址:https://www.cnblogs.com/yaopengfei/p/7678819.html
Copyright © 2011-2022 走看看