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

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<InfoTest> dbRaw = db.Database.SqlQuery<InfoTest>(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<SP_GetInfoTest_Result> 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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

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

    EF上下文 DbContext包含了DataBase属性,里面有很多方法,但是实际我们只需要用到个方法

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

    EF上下文 DbContext包含了DataBase属性,里面有很多方法,但是实际我们只需要用到个方法

    用户1149182
  • ASP.NET MVC5+EF6+EasyUI 后台管理系统(60)-系统总结

    前言: 起初写这个框架的时候,可以说在当时来说并不是很流行的设计模式,那是在2012年,面向对象的编程大家都很熟悉, 但是“注入、控制反转(DI,IOC,依赖注...

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

    EF上下文 DbContext包含了DataBase属性,里面有很多方法,但是实际我们只需要用到个方法

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

    EF上下文 DbContext包含了DataBase属性,里面有很多方法,但是实际我们只需要用到个方法

    用户1149182
  • 如何获取QQ/微信好友的IP地址

    通过监控网络通讯过程中的数据包,从而捕获QQ/微信好友的IP地址,这早已不是秘密,而这种方式依然有效。

    Bypass
  • 记录一次有意思的溯源

    我们经常通过域名、IP信息来对攻击进行溯源。比如某机房内网被攻击,很多机器中了马,为了控制这些机器,通常需要一些域名、IP来进行通信。

    yumusb
  • 揭秘技术大国以色列

    image.png 推荐语: 以色列这个二战后建立的犹太国家,在狭小的国土上创造了让世人震惊的科技创新。他们创造了滴灌技术、ICQ、网络防火墙、特定成...

    腾讯研究院
  • 来给火星拜个早年:“天问一号”探测器拟在大年二十九前后抵达火星

    据国家航天局消息,截止1月3日6时,中国天问一号火星探测器已经在轨飞行163天,飞行里程突破4亿公里,距离地球约1.3亿公里,距离火星约830万公里。探测器姿态...

    镁客网
  • python pyecharts 实现一个文件绘制多张图

    以上这篇python pyecharts 实现一个文件绘制多张图就是小编分享给大家的全部内容了,希望能给大家一个参考。

    砸漏

扫码关注云+社区

领取腾讯云代金券