ASP.NET MVC5+EF6+EasyUI 后台管理系统(89)-EF执行SQL语句与存储过程

这一节,我们来看看EF如何执行SQL语句与读取存储过程的数据,可能有一部分人,还不知道EF如何执行存储过程与原生SQL语句! 我们什么时候要直接使用原生的SQL语句? 返回值过于复杂 过于复杂的联合查询,可能连了好几张表 报表自定义SQL语句(自定义报表居多) 使用EF,但是写了一条性能很差的LINQ 批量操作 所以实际开发中,我往往两合一处理 EF上下文 DbContext包含了DataBase属性,里面有很多方法,但是实际我们只需要用到个方法 ExecuteSqlCommand 和 SqlQuery 别小看这两个方法,他们其实有很多重载,不过操作我们以往的ADO.NET基本无异! 下面来看MSDN对于这两个方法的描述,我们直接看代码的描述就好,一看就是我们熟悉的ADO.NET操作方式 方法:ExecuteSqlCommand(String,Object[]) context.Database.ExecuteSqlCommand("UPDATE dbo.Posts SET Rating = 5 WHERE Author = @author", new SqlParameter("@author", userSuppliedAuthor)); 方法:SqlQuery(String, Object[]) context.Database.SqlQuery("SELECT * FROM dbo.Posts WHERE Author = @author", new SqlParameter("@author", userSuppliedAuthor)); 我们通过一个小例子来,来使用这2个方法 新建一个项目,并新增一个EF,并加入表InfoTest 复制代码 CREATE TABLE [dbo].[InfoTest]( [Id] [varchar](50) PRIMARY key, [Name] [varchar](50) NULL, [Phone] [varchar](50) NULL, [CreateTime] [datetime] NULL, ) 复制代码 1.来看一段代码,创建和删除使用ExecuteSqlCommand 复制代码      static void Main(string[] args) { using (DBContainer db = new DBContainer()) { //---------执行一条语句,带参数 string sql = "INSERT INTO [dbo].[InfoTest]([Id],[Name],[Phone],[CreateTime])VALUES(@Id,@Name,@Phone,@CreateTime)"; SqlParameter[] para = new SqlParameter[] { new SqlParameter("@Id",Guid.NewGuid().ToString()), new SqlParameter("@Name","中国移动"), new SqlParameter("@Phone","10086"), new SqlParameter("@CreateTime",DateTime.Now), }; //返回执行的影响行 int count = db.Database.ExecuteSqlCommand(sql,para); Console.WriteLine("新增-带参数"+count); //----------执行一条语句,不带参数 sql = "Delete [dbo].[InfoTest] where Name='中国移动'"; count = db.Database.ExecuteSqlCommand(sql); Console.WriteLine("删除不带参数" + count); } } 复制代码 注:带参数可以防止SQL注入,还是带参数好 2.来看一段查询的语句,使用SqlQuery sql = "select * from InfoTest"; DbRawSqlQuery dbRaw = db.Database.SqlQuery(sql); 执行查询的语句,会返回 DbRawSqlQuery我们需要将其转换为我们熟悉的 IQueryable 或者 List来做进一步的数据库处理 3.我们还有一些异步的调用方法没有说明,跟同步是一致的 如:ExecuteSqlCommandAsync 4.使用存储过程 来看一个简单的存储过程 复制代码 CREATE PROCEDURE SP_GetInfoTest @Phone varchar(50) AS BEGIN select * from InfoTest where Phone=@Phone END GO 复制代码 通过电话号码查一条记录,我们需要通过EF传过来参数,然后接收起返回值 看了上面的朋友,应该知道可以可以用使用SqlQuery来查询,没错,就是可以这样! 但是有时候我们还是要写存储过程,比如你的代码有几百行,那么用存储过程页面的代码看起来就好多了 把创建好的存储过程加入EF【右键更新模型】 第一步:将存储过程添加入EF 第二步:查看导入情况 现在的EF很聪明了,帮我们生成了返回值和函数导入,直接拿来使用就好 第三步:使用方式 复制代码 //使用存储过程 List spResult = db.SP_GetInfoTest("1008612").ToList(); //进一步的操作 foreach (var r in spResult) { Console.Write("来自存储过程的数据:"+r.Name + r.Phone); } 复制代码 参考: Database这个类很强大。有事务,和其他方法,也是非常实用,可以了解一下 https://msdn.microsoft.com/zh-cn/library/system.data.entity.database(v=vs.113).aspx 代码下载:链接:https://pan.baidu.com/s/1qZ964fM 密码:hlyp 作者:YmNets 出处:http://ymnets.cnblogs.com/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。https://www.cnblogs.com/ymnets/p/9913982.html
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信