2023年6月21日发(作者:)

在EntityFramework6中执⾏SQL语句在中我介绍了如何使⽤EF6对数据库实现CRDU以及事务,我们没有写⼀句SQL就完成了所有操作。这⼀节我来介绍⼀下如何使⽤在EF6中执⾏SQL语句。你可能要问,我⽤EF不就为了避免写SQL吗?如果要写SQL我不如直接⽤得了。话虽然这么说没错,可有些时候使⽤EF操作数据还是有⼀些不⽅便,例如让你根据条件删除⼀组记录,如果按照正常的流程来⾛,你就得先把这些数据查出来,然后再⼀条⼀条地删除它们,这样不仅⿇烦⽽且性能也⽐较低。这种情况下SQL就显⽰出它的威⼒了。⽽使⽤EF执⾏SQL⼜⽐⽅便,特别是在执⾏查询语句的时候,EF会把查询到的数据⾃动保存到数据实体中,省去了使⽤DataReader的⿇烦。同时查询出来的数据还会进⾏跟踪,如果你修改了查询出的值,之后就可以很⽅便的使⽤.SaveChanges()直接更新到数据库了。ExecuteSqlCommand与SqlQuery在数据上下⽂DBModel的实例中有个Database属性,其中有两组⽅法.ExecuteSqlCommand()和.SqlQuery()。它们都可以执⾏SQL语句,只不过.ExecuteSqlCommand()是不返回结果的,只返回受影响的⾏数,所以.ExecuteSqlCommand()更适合执⾏创建、更新、删除操作。.SqlQuery()则会返回查询到的结果,并将结果保存在数据实体中,所以更适合执⾏查询操作。使⽤.ExecuteSqlCommand()实现创建、更新、删除.ExecuteSqlCommand()的使⽤⽅法也很简单,直接传⼊SQL语句就可以了,执⾏完成后会返回受影响的⾏数。1. using (var db = new DBModel()) //创建数据库上下⽂2. {3. //同步的⽅式执⾏SQL,并返回受影响的⾏数4. int result = eSqlCommand(@"CREATE TABLE `test`.`test` (5. `id` INT NOT NULL,6. PRIMARY KEY(`id`)); ");7.

8. //使⽤SqlParameter传值可以避免SQL注⼊9. var p_name = new SqlParameter("@name", "萝莉");10. var p_age = new SqlParameter("@age", 13);11.

12. //如果使⽤的是MySql数据库 需要SqlParameter把替换为MySqlParameter13. //var p_name = new MySqlParameter("@name", "萝莉");14. //var p_age = new MySqlParameter("@age", 13);15.

16. //更改学⽣年龄17. result = eSqlCommand(@"UPDATE `test`.`student`18. SET `age` = @age19. WHERE `name` = @name;", p_age, p_name);20.

21. //异步的⽅式执⾏SQL,并返回受影响的⾏数22. Task result2 = eSqlCommandAsync("DROP TABLE `test`.`test`;");23. }PS:如果需要创建或删除当前数据库,Database属性中还存在.Create() 和.Delete()⽅法,它们不接受参数,返回⼀个bool值表⽰执⾏成功或失败。使⽤.SqlQuery()查询数据从名字就看的出来.SqlQuery()是⽤来执⾏查询的。.SqlQuery()使⽤前需指定返回值的数据类型,⽐如我查询寻⼀条学⽣的完整信息,类型就可以指定为student类型。如果是统计有多少个学⽣,返回值是个整数,就以设置为int。注意:不仅返回值的个数必须与传⼊类型中属性值的个数相同,⽽且名称还必须⼀样,不然会出错。那么如果我只想获取姓名和年龄,那就得单独定义⼀个类(其中包含⼀个string类型的name和int类型的age),来保存数据了。

1. class temp2. {3. public string name { get; set; }4.

5. public int age { get; set; }6. }7.

8. static void Main(string[] args)9. {10. using (var db = new DBModel()) //创建数据库上下⽂11. {12. //查询叫萝莉的学⽣信息,并指定返回值类型为student13. DbRawSqlQuery result1 = ry("SELECT * FROM t WHERE name = '萝莉'");14. //也可以这样指定返回值类型15. //DbRawSqlQuery result1 = ry(typeof(student), "SELECT * FROM t WHERE name = '萝莉'");16. ine(rDefault().name); //打印姓名17.

18. DbRawSqlQuery result2 = ry("SELECT count(*) FROM t");19. ine(rDefault()); //打印有多少学⽣20.

21. //只查询学⽣的年龄与姓名22. var result3 = ry("SELECT `name`,`age` FROM t;");23. foreach (temp item in result3)24. {25. ine( + ":" + );26. }27. }使⽤DbSet下的.SqlQuery()在每个数据实体集合DbSet下也有⼀个.SqlQuery(),功能与上⾯介绍的⼀样,只不过DbSet下的.SqlQuery()只能返回DbSet中包含的类型。但DbSet下的.SqlQuery()在返回数据的同时还会让数据库上下⽂(DBModel)跟踪返回数据的状态,如果返回的数据发⽣了修改,就可以使⽤.SaveChanges()将结果直接保存回数据库。⽽.ry()查出的结果则是做不到的。1. using (var db = new DBModel()) //创建数据库上下⽂2. {3. //查询叫萝莉的学⽣信息,并修改她的年龄4. student result1 = ry("SELECT * FROM t WHERE name = '萝莉'").FirstOrDefault();5. = 13; //通过实体集合下.SqlQuery查询到的数据,修改之后是可以保存到数据库的6.

7. student result2 = ry("SELECT * FROM t WHERE name = '旺财'").FirstOrDefault();8. = 21; //因为使⽤的是.ry查询到的,所以这⾥的修改不会保存到数据库9.

10. //如果希望.ry下查出的数据在修改后也能保存到数据库11. student result3 = ry("SELECT * FROM t WHERE name = '⼩明'").FirstOrDefault();12. = 36;13. (result3).State = ed; //通知数据上下⽂,这条记录也被修改了14.

15. anges();16. }到此为⽌,EF6中的常⽤操作就全部讲完了,之后如果发现还有什么值得拿出来讲的,到时候再加。

2023年6月21日发(作者:)

在EntityFramework6中执⾏SQL语句在中我介绍了如何使⽤EF6对数据库实现CRDU以及事务,我们没有写⼀句SQL就完成了所有操作。这⼀节我来介绍⼀下如何使⽤在EF6中执⾏SQL语句。你可能要问,我⽤EF不就为了避免写SQL吗?如果要写SQL我不如直接⽤得了。话虽然这么说没错,可有些时候使⽤EF操作数据还是有⼀些不⽅便,例如让你根据条件删除⼀组记录,如果按照正常的流程来⾛,你就得先把这些数据查出来,然后再⼀条⼀条地删除它们,这样不仅⿇烦⽽且性能也⽐较低。这种情况下SQL就显⽰出它的威⼒了。⽽使⽤EF执⾏SQL⼜⽐⽅便,特别是在执⾏查询语句的时候,EF会把查询到的数据⾃动保存到数据实体中,省去了使⽤DataReader的⿇烦。同时查询出来的数据还会进⾏跟踪,如果你修改了查询出的值,之后就可以很⽅便的使⽤.SaveChanges()直接更新到数据库了。ExecuteSqlCommand与SqlQuery在数据上下⽂DBModel的实例中有个Database属性,其中有两组⽅法.ExecuteSqlCommand()和.SqlQuery()。它们都可以执⾏SQL语句,只不过.ExecuteSqlCommand()是不返回结果的,只返回受影响的⾏数,所以.ExecuteSqlCommand()更适合执⾏创建、更新、删除操作。.SqlQuery()则会返回查询到的结果,并将结果保存在数据实体中,所以更适合执⾏查询操作。使⽤.ExecuteSqlCommand()实现创建、更新、删除.ExecuteSqlCommand()的使⽤⽅法也很简单,直接传⼊SQL语句就可以了,执⾏完成后会返回受影响的⾏数。1. using (var db = new DBModel()) //创建数据库上下⽂2. {3. //同步的⽅式执⾏SQL,并返回受影响的⾏数4. int result = eSqlCommand(@"CREATE TABLE `test`.`test` (5. `id` INT NOT NULL,6. PRIMARY KEY(`id`)); ");7.

8. //使⽤SqlParameter传值可以避免SQL注⼊9. var p_name = new SqlParameter("@name", "萝莉");10. var p_age = new SqlParameter("@age", 13);11.

12. //如果使⽤的是MySql数据库 需要SqlParameter把替换为MySqlParameter13. //var p_name = new MySqlParameter("@name", "萝莉");14. //var p_age = new MySqlParameter("@age", 13);15.

16. //更改学⽣年龄17. result = eSqlCommand(@"UPDATE `test`.`student`18. SET `age` = @age19. WHERE `name` = @name;", p_age, p_name);20.

21. //异步的⽅式执⾏SQL,并返回受影响的⾏数22. Task result2 = eSqlCommandAsync("DROP TABLE `test`.`test`;");23. }PS:如果需要创建或删除当前数据库,Database属性中还存在.Create() 和.Delete()⽅法,它们不接受参数,返回⼀个bool值表⽰执⾏成功或失败。使⽤.SqlQuery()查询数据从名字就看的出来.SqlQuery()是⽤来执⾏查询的。.SqlQuery()使⽤前需指定返回值的数据类型,⽐如我查询寻⼀条学⽣的完整信息,类型就可以指定为student类型。如果是统计有多少个学⽣,返回值是个整数,就以设置为int。注意:不仅返回值的个数必须与传⼊类型中属性值的个数相同,⽽且名称还必须⼀样,不然会出错。那么如果我只想获取姓名和年龄,那就得单独定义⼀个类(其中包含⼀个string类型的name和int类型的age),来保存数据了。

1. class temp2. {3. public string name { get; set; }4.

5. public int age { get; set; }6. }7.

8. static void Main(string[] args)9. {10. using (var db = new DBModel()) //创建数据库上下⽂11. {12. //查询叫萝莉的学⽣信息,并指定返回值类型为student13. DbRawSqlQuery result1 = ry("SELECT * FROM t WHERE name = '萝莉'");14. //也可以这样指定返回值类型15. //DbRawSqlQuery result1 = ry(typeof(student), "SELECT * FROM t WHERE name = '萝莉'");16. ine(rDefault().name); //打印姓名17.

18. DbRawSqlQuery result2 = ry("SELECT count(*) FROM t");19. ine(rDefault()); //打印有多少学⽣20.

21. //只查询学⽣的年龄与姓名22. var result3 = ry("SELECT `name`,`age` FROM t;");23. foreach (temp item in result3)24. {25. ine( + ":" + );26. }27. }使⽤DbSet下的.SqlQuery()在每个数据实体集合DbSet下也有⼀个.SqlQuery(),功能与上⾯介绍的⼀样,只不过DbSet下的.SqlQuery()只能返回DbSet中包含的类型。但DbSet下的.SqlQuery()在返回数据的同时还会让数据库上下⽂(DBModel)跟踪返回数据的状态,如果返回的数据发⽣了修改,就可以使⽤.SaveChanges()将结果直接保存回数据库。⽽.ry()查出的结果则是做不到的。1. using (var db = new DBModel()) //创建数据库上下⽂2. {3. //查询叫萝莉的学⽣信息,并修改她的年龄4. student result1 = ry("SELECT * FROM t WHERE name = '萝莉'").FirstOrDefault();5. = 13; //通过实体集合下.SqlQuery查询到的数据,修改之后是可以保存到数据库的6.

7. student result2 = ry("SELECT * FROM t WHERE name = '旺财'").FirstOrDefault();8. = 21; //因为使⽤的是.ry查询到的,所以这⾥的修改不会保存到数据库9.

10. //如果希望.ry下查出的数据在修改后也能保存到数据库11. student result3 = ry("SELECT * FROM t WHERE name = '⼩明'").FirstOrDefault();12. = 36;13. (result3).State = ed; //通知数据上下⽂,这条记录也被修改了14.

15. anges();16. }到此为⽌,EF6中的常⽤操作就全部讲完了,之后如果发现还有什么值得拿出来讲的,到时候再加。