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

ef执⾏原⽣sql语句_在EF中执⾏SQL语句⼀、为什么要在EF中执⾏SQL语句使⽤EF操作数据库,可以避免写SQL语句,完成使⽤Linq实现,但为什么还要在EF中执⾏SQL语句呢。如果要写SQL语句,完全可以使⽤来操作数据库。这样说虽然没错,可是有些时候使⽤EF操作数据库还是有⼀些不⽅便的地⽅,例如:如果要修改某⼀条记录,按照EF的正常流程⾛,需要先把要修改的数据查询出来,然后在去修改,这样不仅⿇烦⽽且性能也低,这时直接使⽤EF执⾏SQL语句性能会提⾼很多。⽽使⽤EF执⾏SQL⼜⽐⽅便,特别是在执⾏查询语句的时候,EF会把查询到的数据⾃动保存到数据实体中,省去了使⽤DataReader的⿇烦。同时查询出来的数据还会进⾏跟踪,如果你修改了查询出的值,之后就可以很⽅便的使⽤.SaveChanges()直接更新到数据库了。在数据上下⽂DbContext中有⼀个Database的属性,Database属性中有两组⽅法:ExecuteSqlCommand()和SqlQuery()。这两个⽅法都可以⽤来执⾏SQL语句,但这两个⽅法也有不同点:ExecuteSqlCommand()是不返回结果的,只返回受影响的⾏数,所以ExecuteSqlCommand()更适合⽤来执⾏创建、插⼊、更新、删除操作(即执⾏给定的DDL/DML命令)。SqlQuery()则会返回查询到的结果,并将结果保存在数据实体中,所以SqlQuery()更适合执⾏查询操作。⼆、使⽤ExecuteSqlCommand()执⾏创建、插⼊、更新、删除语句ExecuteSqlCommand()的使⽤⽅法很简单,直接传⼊SQL语句就可以了,执⾏完成后会返回受影响的⾏数。在下⾯的例⼦中,entity是⼀个继承⾃DbContext的对象。1、执⾏创建语句//执⾏创建语句string strCreateSQL = @"CREATE table test( id int primary key not null,name varchar(16),password varchar(20))";//注意:执⾏create语句受影响的⾏数是-1int result =eSqlCommand(strCreateSQL);if ((-1)){ine("创建成功!");}2、执⾏Insert语句//执⾏Insert语句string strInsertSQL = @"INSERT INTO testSELECT 1,'⼩明','1234' UNIONSELECT 2,'⼩王','1234' UNIONSELECT 3,'⼩红','1234'";int result =eSqlCommand(strInsertSQL);if (result > 0){ine("插⼊成功");}3、执⾏Update语句//执⾏Update语句string strUpdateSQL = @"UPDATE test SET password=@pwd1 WHERE id=@id1;UPDATE test SET password=@pwd2 WHERE id=@id2;";SqlParameter[] para={new SqlParameter("@pwd1","ceshi12we"),new SqlParameter("@id1",1),newSqlParameter("@pwd2","ceshi127890"),new SqlParameter("@id2",2),};int result =eSqlCommand(strUpdateSQL, para);if (result > 0){ine("更新成功");}4、执⾏Delete语句//执⾏删除语句string strDelSQL = "delete from test";int result =eSqlCommand(strDelSQL);if (result > 0){ine("删除成功");}5、执⾏Drop语句string strDropSQL = "drop table test";int result =eSqlCommand(strDropSQL);if ((-1)){ine("删除成功");}注意:执⾏DDL语句(create、alter、drop等)返回值是-1,DML(insert、update、delete)返回的是受影响的⾏数。三、使⽤SqlQuery()查询数据SqlQuery()是⽤来执⾏查询的。SqlQuery()使⽤前需要指定返回值的类型。返回值类型可以是定义的实体类型,或者基元类型。例如:查询⼀个⽤户的完整信息,返回类型就是⽤户实体类型;如果是统计有多少个⽤户,返回值就是int类型。注意:返回值的个数和名称必须和传⼊的类型中属性个数、名称相同,不如会报错。在下⾯的例⼦中User是根据数据库表⽣成的实体类型。string strSQL = "SELECT * FROM Users WHERE ID>=10 ORDER BY ID DESC";var info =ry(strSQL);foreach (var item ininfo){ine("ID:" + + " " + "登录名:" + ame + " " + "密码:" +rd);}运⾏结果:前⾯说过返回值的个数和名称必须和传⼊的类型中属性个数、名称相同,不如会报错。如果将SQL语句修改为只查询ID、登录名、密码会出现下⾯的错误:如果只想查询ID、登录名、密码该怎么办呢?那就需要单独定义⼀个类(只包含ID、登录名、密码三个属性)来保存数据.新定义的类,只包含ID、登录名、密码三个属性:public classnewUser{public int ID { get; set; }public string LoginName { get; set; }public string Password { get; set; }}//⽅法四:SqlQuerytry{string strSQL = "SELECT ID,LoginName,Password FROM Users WHERE ID>=10 ORDER BY ID DESC";var info =ry(strSQL);foreach (var item ininfo){ine("ID:" + + " " + "登录名:" + ame + " " + "密码:" +rd);}}catch(Exception ex){ine(e);}运⾏结果:返回值是基元类型:查询⽤户数量,返回int类型//查询⽤户数量string strSQL = "SELECT COUNT(*) FROM test";var result = ry(strSQL);//注意:必须使⽤循环才会真正的去数据库执⾏SQL语句,否则不会再数据库执⾏SQL语句(EF的延迟加载)foreach(var item inresult){ine("⽤户数量:" +ng());}运⾏结果:四、使⽤DbSet下的SqlQuery()在每个数据实体集合DbSet下也有⼀个SqlQuery(),功能与上⾯介绍的⼀样,只不过DbSet下的SqlQuery()只能返回DbSet中包含的类型,DbSet下的SqlQuery()在返回数据的同时还会让数据库上下⽂(DBContext)跟踪返回数据的状态,如果返回的数据发⽣了修改,就可以使⽤SaveChanges()将结果直接保存回数据库。⽽ry()查出的结果则不能跟踪返回数据的状态。1、使⽤实体集合下⾯的SqlQuery()⽅法string strSQL = "SELECT * FROM Users WHERE UserID='002068'";User user=ry(strSQL).FirstOrDefault();rd= "测试实体下⾯的SqlQuery⽅法";//调⽤SaveChanges()⽅法可以更新Password字段anges();2、使⽤Database下的SqlQuery()⽅法string strSQL = "SELECT * FROM Users WHERE UserID='002068'";User user= ry(strSQL).FirstOrDefault();rd= "测试Database下⾯的SqlQuery⽅法";//调⽤SaveChanges()⽅法不可以更新Password字段anges();如果希望使⽤Database下的SqlQuery()查询出的数据在修改后也能保存到数据库,可以使⽤下⾯的代码:string strSQL = "SELECT * FROM Users WHERE UserID='002068'";User user= ry(strSQL).FirstOrDefault();rd= "测试Database下⾯的SqlQuery⽅法";//设置这条数据的状态是:Modified,这样可以通知数据上下⽂,这条记录也被修改了(user).State =ed;//调⽤SaveChanges()⽅法不可以更新Password字段anges();

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

ef执⾏原⽣sql语句_在EF中执⾏SQL语句⼀、为什么要在EF中执⾏SQL语句使⽤EF操作数据库,可以避免写SQL语句,完成使⽤Linq实现,但为什么还要在EF中执⾏SQL语句呢。如果要写SQL语句,完全可以使⽤来操作数据库。这样说虽然没错,可是有些时候使⽤EF操作数据库还是有⼀些不⽅便的地⽅,例如:如果要修改某⼀条记录,按照EF的正常流程⾛,需要先把要修改的数据查询出来,然后在去修改,这样不仅⿇烦⽽且性能也低,这时直接使⽤EF执⾏SQL语句性能会提⾼很多。⽽使⽤EF执⾏SQL⼜⽐⽅便,特别是在执⾏查询语句的时候,EF会把查询到的数据⾃动保存到数据实体中,省去了使⽤DataReader的⿇烦。同时查询出来的数据还会进⾏跟踪,如果你修改了查询出的值,之后就可以很⽅便的使⽤.SaveChanges()直接更新到数据库了。在数据上下⽂DbContext中有⼀个Database的属性,Database属性中有两组⽅法:ExecuteSqlCommand()和SqlQuery()。这两个⽅法都可以⽤来执⾏SQL语句,但这两个⽅法也有不同点:ExecuteSqlCommand()是不返回结果的,只返回受影响的⾏数,所以ExecuteSqlCommand()更适合⽤来执⾏创建、插⼊、更新、删除操作(即执⾏给定的DDL/DML命令)。SqlQuery()则会返回查询到的结果,并将结果保存在数据实体中,所以SqlQuery()更适合执⾏查询操作。⼆、使⽤ExecuteSqlCommand()执⾏创建、插⼊、更新、删除语句ExecuteSqlCommand()的使⽤⽅法很简单,直接传⼊SQL语句就可以了,执⾏完成后会返回受影响的⾏数。在下⾯的例⼦中,entity是⼀个继承⾃DbContext的对象。1、执⾏创建语句//执⾏创建语句string strCreateSQL = @"CREATE table test( id int primary key not null,name varchar(16),password varchar(20))";//注意:执⾏create语句受影响的⾏数是-1int result =eSqlCommand(strCreateSQL);if ((-1)){ine("创建成功!");}2、执⾏Insert语句//执⾏Insert语句string strInsertSQL = @"INSERT INTO testSELECT 1,'⼩明','1234' UNIONSELECT 2,'⼩王','1234' UNIONSELECT 3,'⼩红','1234'";int result =eSqlCommand(strInsertSQL);if (result > 0){ine("插⼊成功");}3、执⾏Update语句//执⾏Update语句string strUpdateSQL = @"UPDATE test SET password=@pwd1 WHERE id=@id1;UPDATE test SET password=@pwd2 WHERE id=@id2;";SqlParameter[] para={new SqlParameter("@pwd1","ceshi12we"),new SqlParameter("@id1",1),newSqlParameter("@pwd2","ceshi127890"),new SqlParameter("@id2",2),};int result =eSqlCommand(strUpdateSQL, para);if (result > 0){ine("更新成功");}4、执⾏Delete语句//执⾏删除语句string strDelSQL = "delete from test";int result =eSqlCommand(strDelSQL);if (result > 0){ine("删除成功");}5、执⾏Drop语句string strDropSQL = "drop table test";int result =eSqlCommand(strDropSQL);if ((-1)){ine("删除成功");}注意:执⾏DDL语句(create、alter、drop等)返回值是-1,DML(insert、update、delete)返回的是受影响的⾏数。三、使⽤SqlQuery()查询数据SqlQuery()是⽤来执⾏查询的。SqlQuery()使⽤前需要指定返回值的类型。返回值类型可以是定义的实体类型,或者基元类型。例如:查询⼀个⽤户的完整信息,返回类型就是⽤户实体类型;如果是统计有多少个⽤户,返回值就是int类型。注意:返回值的个数和名称必须和传⼊的类型中属性个数、名称相同,不如会报错。在下⾯的例⼦中User是根据数据库表⽣成的实体类型。string strSQL = "SELECT * FROM Users WHERE ID>=10 ORDER BY ID DESC";var info =ry(strSQL);foreach (var item ininfo){ine("ID:" + + " " + "登录名:" + ame + " " + "密码:" +rd);}运⾏结果:前⾯说过返回值的个数和名称必须和传⼊的类型中属性个数、名称相同,不如会报错。如果将SQL语句修改为只查询ID、登录名、密码会出现下⾯的错误:如果只想查询ID、登录名、密码该怎么办呢?那就需要单独定义⼀个类(只包含ID、登录名、密码三个属性)来保存数据.新定义的类,只包含ID、登录名、密码三个属性:public classnewUser{public int ID { get; set; }public string LoginName { get; set; }public string Password { get; set; }}//⽅法四:SqlQuerytry{string strSQL = "SELECT ID,LoginName,Password FROM Users WHERE ID>=10 ORDER BY ID DESC";var info =ry(strSQL);foreach (var item ininfo){ine("ID:" + + " " + "登录名:" + ame + " " + "密码:" +rd);}}catch(Exception ex){ine(e);}运⾏结果:返回值是基元类型:查询⽤户数量,返回int类型//查询⽤户数量string strSQL = "SELECT COUNT(*) FROM test";var result = ry(strSQL);//注意:必须使⽤循环才会真正的去数据库执⾏SQL语句,否则不会再数据库执⾏SQL语句(EF的延迟加载)foreach(var item inresult){ine("⽤户数量:" +ng());}运⾏结果:四、使⽤DbSet下的SqlQuery()在每个数据实体集合DbSet下也有⼀个SqlQuery(),功能与上⾯介绍的⼀样,只不过DbSet下的SqlQuery()只能返回DbSet中包含的类型,DbSet下的SqlQuery()在返回数据的同时还会让数据库上下⽂(DBContext)跟踪返回数据的状态,如果返回的数据发⽣了修改,就可以使⽤SaveChanges()将结果直接保存回数据库。⽽ry()查出的结果则不能跟踪返回数据的状态。1、使⽤实体集合下⾯的SqlQuery()⽅法string strSQL = "SELECT * FROM Users WHERE UserID='002068'";User user=ry(strSQL).FirstOrDefault();rd= "测试实体下⾯的SqlQuery⽅法";//调⽤SaveChanges()⽅法可以更新Password字段anges();2、使⽤Database下的SqlQuery()⽅法string strSQL = "SELECT * FROM Users WHERE UserID='002068'";User user= ry(strSQL).FirstOrDefault();rd= "测试Database下⾯的SqlQuery⽅法";//调⽤SaveChanges()⽅法不可以更新Password字段anges();如果希望使⽤Database下的SqlQuery()查询出的数据在修改后也能保存到数据库,可以使⽤下⾯的代码:string strSQL = "SELECT * FROM Users WHERE UserID='002068'";User user= ry(strSQL).FirstOrDefault();rd= "测试Database下⾯的SqlQuery⽅法";//设置这条数据的状态是:Modified,这样可以通知数据上下⽂,这条记录也被修改了(user).State =ed;//调⽤SaveChanges()⽅法不可以更新Password字段anges();