广告
返回顶部
首页 > 资讯 > 后端开发 > ASP.NET >EntityFramework中执行sql语句
  • 277
分享到

EntityFramework中执行sql语句

2024-04-02 19:04:59 277人浏览 八月长安
摘要

一、为什么要在EF中执行sql语句 使用EF操作数据库,可以避免写SQL语句,完成使用Linq实现,但为什么还要在EF中执行SQL语句呢。如果要写SQL语句,完全可以使用ADO.ne

一、为什么要在EF中执行sql语句

使用EF操作数据库,可以避免写SQL语句,完成使用Linq实现,但为什么还要在EF中执行SQL语句呢。如果要写SQL语句,完全可以使用ADO.net来操作数据库。这样说虽然没错,可是有些时候使用EF操作数据库还是有一些不方便的地方,例如:如果要修改某一条记录,按照EF的正常流程走,需要先把要修改的数据查询出来,然后在去修改,这样不仅麻烦而且性能也低,这时直接使用EF执行SQL语句性能会提高很多。
而使用EF执行SQL又比ADO.NET方便,特别是在执行查询语句的时候,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语句受影响的行数是-1
int result = entity.Database.ExecuteSqlCommand(strCreateSQL);
if (result.Equals(-1))
{
    Console.WriteLine("创建成功!");
}

 2、执行Insert语句

// 执行Insert语句
string strInsertSQL = @"INSERT INTO test
                                        SELECT 1,'小明','1234' UNION
                                        SELECT 2,'小王','1234' UNioN
                                        SELECT 3,'小红','1234'  ";
int result = entity.Database.ExecuteSqlCommand(strInsertSQL);
if (result > 0)
{
       Console.WriteLine("插入成功");
}

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),
                   new  SqlParameter("@pwd2","ceshi127890"),
                   new  SqlParameter("@id2",2),
                };

int result = entity.Database.ExecuteSqlCommand(strUpdateSQL, para);
if (result > 0)
{
    Console.WriteLine("更新成功");
}

4、执行Delete语句

// 执行删除语句
string strDelSQL = "delete from test";
int result = entity.Database.ExecuteSqlCommand(strDelSQL);
if (result > 0)
{
     Console.WriteLine("删除成功");
}

5、执行Drop语句

string strDropSQL = "drop table test";
int result = entity.Database.ExecuteSqlCommand(strDropSQL);
if (result.Equals(-1))
{
    Console.WriteLine("删除成功");
}

注意:执行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 = entity.Database.SqlQuery<User>(strSQL);
foreach (var item in info)
{
       Console.WriteLine("ID:" + item.ID + " " + "登录名:" + item.LoginName + " " + "密码:" + item.Password);
}

运行结果:

前面说过返回值的个数和名称必须和传入的类型中属性个数、名称相同,不如会报错。如果将SQL语句修改为只查询ID、登录名、密码会出现下面的错误:

如果只想查询ID、登录名、密码该怎么办呢?那就需要单独定义一个类(只包含ID、登录名、密码三个属性)来保存数据.

新定义的类,只包含ID、登录名、密码三个属性:

public class newUser
{
        public int ID { get; set; }

        public string LoginName { get; set; }

        public string Password { get; set; }
}
// 方法四:SqlQuery
try
{
                string strSQL = "SELECT ID,LoginName,Password FROM Users WHERE ID>=10 ORDER BY ID DESC";
                var info = entity.Database.SqlQuery<newUser>(strSQL);
                foreach (var item in info)
                {
                    Console.WriteLine("ID:" + item.ID + " " + "登录名:" + item.LoginName + " " + "密码:" + item.Password);
                }
}
catch (Exception ex)
{
                Console.WriteLine(ex.Message);
}

运行结果:

返回值是基元类型:

查询用户数量,返回int类型

// 查询用户数量
string strSQL = "SELECT COUNT(*) FROM test";
var result = entity.Database.SqlQuery<int>(strSQL);
// 注意:必须使用循环才会真正的去数据库执行SQL语句,否则不会再数据库执行SQL语句(EF的延迟加载)
foreach(var item in result)
{
     Console.WriteLine("用户数量:" + item.ToString());
}

运行结果:

四、使用DbSet<T>下的SqlQuery()

在每个数据实体集合DbSet<T>下也有一个SqlQuery(),功能与上面介绍的一样,只不过DbSet<T>下的SqlQuery()只能返回DbSet<T>中包含的类型,DbSet<T>下的SqlQuery()在返回数据的同时还会让数据库上下文(DBContext)跟踪返回数据的状态,如果返回的数据发生了修改,就可以使用SaveChanges()将结果直接保存回数据库。而Database.SqlQuery()查出的结果则不能跟踪返回数据的状态。

1、使用实体集合下面的SqlQuery()方法

string strSQL = "SELECT * FROM Users WHERE UserID='002068'";
User user = entity.Users.SqlQuery(strSQL).FirstOrDefault();
user.Password = "测试实体下面的SqlQuery方法";
// 调用SaveChanges()方法可以更新Password字段
entity.SaveChanges();

2、使用Database下的SqlQuery()方法

string strSQL = "SELECT * FROM Users WHERE UserID='002068'";
User user = entity.Database.SqlQuery<User>(strSQL).FirstOrDefault();
user.Password = "测试Database下面的SqlQuery方法";
// 调用SaveChanges()方法不可以更新Password字段
entity.SaveChanges();

如果希望使用Database下的SqlQuery()查询出的数据在修改后也能保存到数据库,可以使用下面的代码:

string strSQL = "SELECT * FROM Users WHERE UserID='002068'";
User user = entity.Database.SqlQuery<User>(strSQL).FirstOrDefault();
user.Password = "测试Database下面的SqlQuery方法";
// 设置这条数据的状态是:Modified,这样可以通知数据上下文,这条记录也被修改了
entity.Entry<User>(user).State = System.Data.Entity.EntityState.Modified;
// 调用SaveChanges()方法不可以更新Password字段
entity.SaveChanges();

到此这篇关于Entity Framework中执行sql语句的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: EntityFramework中执行sql语句

本文链接: https://www.lsjlt.com/news/140898.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • EntityFramework中执行sql语句
    一、为什么要在EF中执行SQL语句 使用EF操作数据库,可以避免写SQL语句,完成使用Linq实现,但为什么还要在EF中执行SQL语句呢。如果要写SQL语句,完全可以使用ADO.NE...
    99+
    2022-11-13
  • SQL语句执行顺序
    sql语法的分析是从右到左 ...
    99+
    2022-10-18
  • mdb中如何执行sql语句
    在MDB(Microsoft Access数据库)中执行SQL语句,可以通过以下步骤完成:1. 打开Microsoft Access...
    99+
    2023-10-12
    mdb sql
  • dbvisualizer怎么执行sql语句
    要在DBVisualizer中执行SQL语句,可以按照以下步骤操作:1. 连接到数据库:在DBVisualizer中,选择菜单栏的"...
    99+
    2023-10-19
    sql
  • psql怎么执行sql语句
    在psql中执行SQL语句有以下几种方式: 在命令行中直接输入SQL语句: psql -c "SELECT * FROM...
    99+
    2023-10-26
    psql sql
  • SQL语句的执行过程
    1.语法校验      如果在SQL计划缓存中没有对应的执行计划,服务器首先会对用户请求的SQL语句进行语法效验,如果有语法错误,服务器会结束查询操作,并用返回相应的错误信息给...
    99+
    2022-10-18
  • mysql中SQL语句的执行流程
    今天就跟大家聊聊有关mysql中SQL语句的执行流程,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。       &n...
    99+
    2022-10-18
  • 怎么在MyBatis中执行SQL语句
    这期内容当中小编将会给大家带来有关怎么在MyBatis中执行SQL语句,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。基础组件我们要理解 Mybatis 的执行过程,就必须先了解 Mybatis 中都有哪一...
    99+
    2023-06-15
  • Entity Framework中如何执行sql语句
    这篇文章主要介绍Entity Framework中如何执行sql语句,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、为什么要在EF中执行SQL语句使用EF操作数据库,可以避免写SQL语句,完成使用Linq...
    99+
    2023-06-29
  • SQLServer 2000定时执行SQL语句
    我不知道存储过程等能否实现,但是SQL Server 2000的作业调度确实有这样的功能,怎样使某些SQL语句定时执行呢,依次进行下面的操作: 企业管理器 --管理 --SQ...
    99+
    2022-11-21
    定时执行 SQL语句
  • sql语句执行步骤详解
    目录 一、准备工作 二、SQL逻辑查询语句执行顺序 三、SQL书写习惯 一、准备工作 先来一段伪代码,首先你能看懂么? SELEC&#...
    99+
    2015-02-22
    sql语句执行步骤详解
  • SQL查询语句执行原理
    首先有一个 user_info 表,表里有一个 id 字段,执行下面这条查询语句:select * from user_info where id = 1;返回结果为:mysql基本架构...
    99+
    2022-10-18
  • navicat执行sql语句的方法
    小编给大家分享一下navicat执行sql语句的方法,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!首先要在navicat的【查询编辑器】中编写可执行的sql语句当我们在【查询编辑器】中编写完S...
    99+
    2022-10-18
  • [转] Oracle sql语句执行顺序
    sql语法的分析是从右到左 一、sql语句的执行步骤: 1)语法分析,分析语句的语法是否符合规范,衡量语句中各表达式的意义。 2)语义分析,检查语句中涉及的所有数据库对象是否存在,且用户有相应的权限。 3)视图转换,将涉及视图的查询语句...
    99+
    2015-06-02
    [转] Oracle sql语句执行顺序 数据库入门 数据库基础教程
  • mysql的sql语句执行流程
    1、client和server建立连接,client发送sql至server(对应连接器这一过程) 2、server如果在查询缓存中发现了该sql,则直接使用查询缓存的结果返回给client,如果查询缓存中...
    99+
    2022-10-18
  • navicat表如何执行sql语句
    小编给大家分享一下navicat表如何执行sql语句,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!1、首先,打开navicat,选择要操作的数据库。2、接着点击查询,这里有两个查询,随便点...
    99+
    2022-10-18
  • 一条SQL语句执行过程
    目录一、MySQL 体系架构- 连接池组件- 缓存组件- 分析器- 优化器- 执行器二、写操作执行过程三、读操作执行过程四、SQL执行顺序一、MySQL 体系架构 - 连接池组件 ...
    99+
    2022-11-13
  • Shell脚本中怎么执行sql语句
    本篇文章为大家展示了Shell脚本中怎么执行sql语句,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1、将SQL语句直接嵌入到shell脚本文件中代码如下:--演示环境  [root@SZ...
    99+
    2023-06-09
  • java中怎么用jdbc执行sql语句
    在Java中使用JDBC执行SQL语句的一般步骤如下:1. 加载数据库驱动程序(一般在应用程序的入口处执行):javaClass.f...
    99+
    2023-10-23
    java jdbc sql
  • mysql中怎么执行外部sql语句
    这篇文章将为大家详细讲解有关mysql中怎么执行外部sql语句,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。 mysql执行外部sql   ...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作