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]( ) PRIMARY key, ) NULL, ) 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("@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<InfoTest> dbRaw = db.Database.SqlQuery<InfoTest>(sql);
执行查询的语句,会返回 DbRawSqlQuery我们需要将其转换为我们熟悉的 IQueryable 或者 List来做进一步的数据库处理
3.我们还有一些异步的调用方法没有说明,跟同步是一致的
如:ExecuteSqlCommandAsync
4.使用存储过程
来看一个简单的存储过程
CREATE PROCEDURE SP_GetInfoTest ) AS BEGIN select * from InfoTest where Phone=@Phone END GO
通过电话号码查一条记录,我们需要通过EF传过来参数,然后接收起返回值
看了上面的朋友,应该知道可以可以用使用SqlQuery来查询,没错,就是可以这样!
但是有时候我们还是要写存储过程,比如你的代码有几百行,那么用存储过程页面的代码看起来就好多了
把创建好的存储过程加入EF【右键更新模型】
第一步:将存储过程添加入EF
第二步:查看导入情况
现在的EF很聪明了,帮我们生成了返回值和函数导入,直接拿来使用就好
第三步:使用方式
//使用存储过程 List<SP_GetInfoTest_Result> spResult = db.SP_GetInfoTest(").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
ASP.NET MVC5+EF6+EasyUI 后台管理系统(89)-EF执行SQL语句与存储过程的更多相关文章
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(1)-前言与目录(持续更新中...)
开发工具:VS2015(2012以上)+SQL2008R2以上数据库 您可以有偿获取一份最新源码联系QQ:729994997 价格 666RMB 升级后界面效果如下: 任务调度系统界面 http: ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(63)-Excel导入和导出-自定义表模导入
系列目录 前言 上一节使用了LinqToExcel和CloseXML对Excel表进行导入和导出的简单操作,大家可以跳转到上一节查看: ASP.NET MVC5+EF6+EasyUI 后台管理系统(6 ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统-WebApi的用法与调试
1:ASP.NET MVC5+EF6+EasyUI 后台管理系统(1)-WebApi与Unity注入 使用Unity是为了使用我们后台的BLL和DAL层 2:ASP.NET MVC5+EF6+Easy ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(1)-前言与目录(转)
开发工具:VS2015(2012以上)+SQL2008R2以上数据库 您可以有偿获取一份最新源码联系QQ:729994997 价格 666RMB 升级后界面效果如下: 日程管理 http://ww ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(51)-系统升级
系统很久没有更新内容了,期待已久的更新在今天发布了,最近花了2个月的时间每天一点点,从原有系统 MVC4+EF5+UNITY2.X+Quartz 2.0+easyui 1.3.4无缝接入 MVC5+E ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(71)-微信公众平台开发-公众号管理
系列目录 思维导图 下面我们来看一个思维导图,这样就可以更快了解所需要的功能: 上一节我们利用了一个简单的代码例子,完成了与微信公众号的对话(给公众号发一条信息,并得到回复) 这一节将讲解公众号如何设 ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(84)-Quartz 作业调度用法详解一
前言 我从Quartz2.0开始使用,并对其进行了封装了界面,可以参考 http://www.cnblogs.com/ymnets/p/5065154.html 最近拿出来进行了优化,并升级到最新版, ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(58)-DAL层重构
系列目录 前言:这是对本文系统一次重要的革新,很久就想要重构数据访问层了,数据访问层重复代码太多.主要集中增删该查每个模块都有,所以本次是为封装相同接口方法 如果你想了解怎么重构普通的接口DAL层请查 ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(34)-文章发布系统①-简要分析
系列目录 最新比较闲,为了学习下Android的开发构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(1)-前言与,虽然有点没有目的的学习,但还是了解了Andro ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(54)-工作流设计-所有流程监控
系列目录 先补充一个平面化登陆页面代码,自己更换喜欢的颜色背景 @using Apps.Common; @{ Layout = null; } <!DOCTYPE html> <ht ...
随机推荐
- id,is的用法,小数据池的概念及编码知识进阶
一:id 查询内存地址 name = 'alex' print(id(name)) li = [1,2,3] print(id(li)) 二:is 判断的是内存地址 name1 = 'alex@' ...
- nginx中location匹配顺序
一.location语法 语法: Syntax: location [ = | ~ | ~* | ^~ ] uri { ... } location @name { ... } Default: - ...
- Java - 路线图
java语言基础 基本语法 面向对象思想 mysql数据库基础 jdbc操作 java高级技术 java集合框架 多线程 网络编程 sql深入,索引,sql优化 javaweb servlet jsp ...
- Windows10下用Anaconda3安装TensorFlow教程
这是我在自己的笔记本电脑上用Anaconda3安装TensorFlow的教程 1. 安装好Anaconda3版本 (1) 注:可以发现最新版本是Anaconda5了(没关系,下载就是了) (2) 注意 ...
- CentOs下安装PHP扩展curl
服务器运行一段时间后,可能突然会需求添加某个扩展,如curl.pdo.xmlrpc等,这就需要在不重新编译Linux PHP的情况下独立添加扩展. 1.安装crul wget http://curl. ...
- linux_inotify
什么是inotify? 拥有强大.粒细粒度.异步文件系统事件监控机制,监控文件系统中添加.删除.修改.移动等各种事件 版本支持: 内核 2.6.13以上版本,inotify-tools 是实施监控的软 ...
- java里程碑之泛型--泛型基本语法
1,java7提供的泛型菱形语法 在java7之前,如果使用带泛型的接口和类定义变量初始化对象的时候,构造器后面也必须带上泛型,这有点恶心的.以前我在公司一直使用的java6,所以我也已经习惯了这种写 ...
- Servlet和web服务器关系
前面的博客我详细的罗列了下Servlet的常用的类和接口,然后在前面的前面我类似tomcat模拟了一套web服务器,这里来做一个统一的整理,这样子可以更好的把握Servlet,也可以更好的了解下web ...
- <<Senium2自动化测试>>读书笔记一
为进一步加强Python知识扩展和学习,在朋友的推荐下选择了<<Selenium2自动化测试实战>>,作者胡志恒,基于Python语言实现,以实例的方式详细讲解WebDrive ...
- tcpdump 使用
例子: 首先切换到root用户 tcpdump -w aaa.cap -i eth7 -nn -x 'port 9999' -c 1 以例子说明参数: -w:输出到文件aaa.cap ...