GVKun编程网logo

通过Zend Framework执行MSSQL存储过程

11

如果您对通过ZendFramework执行MSSQL存储过程感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解通过ZendFramework执行MSSQL存储过程的各种细节,此外还有关于Entit

如果您对通过Zend Framework执行MSSQL存储过程感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解通过Zend Framework执行MSSQL存储过程的各种细节,此外还有关于Entity Framework Core 执行 SQL 语句和存储过程、Entity Framework Core 执行SQL语句和存储过程、Entity Framework Core中执行SQL语句和存储过程的方法介绍、EntityFramework Core 使用原生 SQL 语句,执行存储过程和视图的实用技巧。

本文目录一览:

通过Zend Framework执行MSSQL存储过程

通过Zend Framework执行MSSQL存储过程

请求:请向我展示一个有效的示例,该示例如何使用Zend
Framework从MSSQL服务器上的存储过程中检索(在数组中?)返回的行,并将参数传递给该存储过程。

说明:我在ZF文档中找不到有关如何在MSSQL服务器上执行SP的任何信息。我知道可以通过纯PHP实现。但是,由于我的项目使用ZF,所以我不需要额外的代码来打开与服务器的连接等。通过ZF代码,我看到诸如“
bindParam”,“ execute”和“ prepare”之类的东西。
”。但是,我不知道这些是如何工作的,或者我将如何处理它们。因此,当然,对所请求的示例代码进行一些解释非常好。

我正在使用Zend_Db_Adapter_Pdo_Mssql。

谢谢!

Entity Framework Core 执行 SQL 语句和存储过程

Entity Framework Core 执行 SQL 语句和存储过程

无论 ORM 有多么强大,总会出现一些特殊的情况,它无法满足我们的要求。在这篇文章中,我们介绍几种执行 SQL 的方法。

表结构

 

在具体内容开始之前,我们先简单说明一下要使用的表结构。

public class Category
{
    public int CategoryID { get; set; }
    public string CategoryName { get; set; }
}

在 Category 定义了两个字段:CategoryID、CategoryName。

public class SampleDbContext : DbContext
{
    public virtual DbSet<Category> Categories { get; set; }
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        var sqlConnectionStringBuilder = new SqlConnectionStringBuilder {
            DataSource = "10.0.1.5",
            InitialCatalog = "TestDataBase",
            UserID = "sa",
            Password = "******"
        };
        optionsBuilder.UseSqlServer(sqlConnectionStringBuilder.ConnectionString);
        base.OnConfiguring(optionsBuilder);
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        EntityTypeBuilder<Category> entityTypeBuilder = modelBuilder.Entity<Category>();
        entityTypeBuilder.ToTable("Category");
        entityTypeBuilder.HasKey(e => e.CategoryID);
        entityTypeBuilder.Property(e => e.CategoryID).UseSqlServerIdentityColumn();
    }
}

我们使用 SampleDbContext 来访问数据库。

FromSql 执行 SQL 语句

 

Entity Framework Core 为 DbSet<TEntity> 提供了一个扩展方法 FromSql,用于执行 SQL 语句或存储过程,以下示例使用 FromSql 加载所有的数据。

using (var dataContext = new SampleDbContext()) {
    var query = dataContext.Categories.FromSql("select * from Category");
    var result = query.ToList();
}

对于带有参数的 SQL 语句,我们使用 C# 6 语法将 SQL 写成如下:

using (var dataContext = new SampleDbContext()) {
    var categoryID = 1;
    var query = dataContext.Categories.FromSql($"select * from Category where CategoryID=    {categoryID}");
    var result = query.ToList();
}

注意:这里不是直接使用拼接的方式处理 SQL,而是转化为参数化的 SQL 语句,这有助于防止 SQL 注入攻击。

我们可以使用 SQL Server Profiler 帮我们验证:

exec sp_executesql N''select * from Category where CategoryID=@p0
'',N''@p0 int'',@p0=1

如果您不使用 C# 6 的语法特征,我们必须使用 @p0、@p1 ... @pn 做为 SQL 语句的参数:

 

using (var dataContext = new SampleDbContext()) {
    var categoryID = 1;
    var categoryName = "Product";
    var query = dataContext.Categories.FromSql("select * from Category where CategoryID=@p0 and CategoryName=@p1"
    categoryID, categoryName);
    var result = query.ToList();
    Assert.NotNull(result);
}

在上述 SQL 语句中中,将 @p0 映射到 categoryID、@ p1 映射 categoryName。

 

FromSql 扩展方法返回的是 IQueryable<TEntity> 对象,要们还可以接着使用一些 Linq 的方法,示例如下:

 

using (var dataContext = new SampleDbContext()) {
    var categoryID = 1;
    var query = dataContext.Categories.FromSql("select * from Category")
        .Where(item => item.CategoryID == categoryID)
        .OrderBy(item => item.CategoryName);
    var result = query.ToList();
}

 

 不过在这里,使用的是子查询,使用 SQL Server Profiler 捕获到的 SQL 语句如下:

 

exec sp_executesql N''SELECT [item].[CategoryID], [item].[CategoryName]
FROM (
    select * from Category
) AS [item]
WHERE [item].[CategoryID] = @__categoryID_1
ORDER BY [item].[CategoryName]'',N''@__categoryID_1 int'',@__categoryID_1=1

提示:使用 FromSql 时,需要在执行的 SQL 语句中返回所有列,并且列名必须与实体属性名相匹配,否则执行会出错。

 

FromSql 执行存储过程

 

存储过程与 SQL 语句写法基本一致,使用存储过程的示例如下:

using (var dataContext = new SampleDbContext()) {
    var categoryID = 1;
    var query = dataContext.Categories.FromSql($"GetCategoryById {categoryID}");
    var result = query.ToList();
    Assert.NotNull(result);
}

这些参数的顺序必须与存储过程参数的顺序一致。

 

提示:使用 FromSql 执行存储过程时,如果使用 ''Where''、''OrderBy'' 等 Linq 语法,这些操作不会生成 SQL 语句,而是在.Net 中对存储过程返回的集合进行过滤与排序。

 

ExecuteSqlCommand

 

在 DbContext 暴露了一个 Database 属性,它包括一个 ExecuteSqlCommand 方法。此方法返回一个整数,表示执行的 SQL 语句影响的行数。

 

有效的操作是 INSERT、UPDATE 和 DELETE,不能用于返回实体。

 

using (var dataContext = new SampleDbContext())
{
    var categoryID = 1;
    var categoryName = "Product";
    var result = dataContext.Database.ExecuteSqlCommand($"UPDATE dbo.Category SET CategoryName={categoryName} WHERE CategoryID={categoryID}");
}

 

Entity Framework Core 执行SQL语句和存储过程

Entity Framework Core 执行SQL语句和存储过程

无论ORM有多么强大,总会出现一些特殊的情况,它无法满足我们的要求。在这篇文章中,我们介绍几种执行SQL的方法。

表结构

在具体内容开始之前,我们先简单说明一下要使用的表结构。

    public class Category
    {        
       public int CategoryID { get; set; }                public string CategoryName { get; set; }    }

Category定义了两个字段:CategoryIDCategoryName

    public class SampleDbContext : DbContext
    {     
      public virtual DbSet<Category> Categories { get; set; }        
      protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)        {            var sqlConnectionStringBuilder = new SqlConnectionStringBuilder {                DataSource = "10.0.1.5",                InitialCatalog = "TestDataBase",                UserID = "sa",                Password = "******"            };            optionsBuilder.UseSqlServer(sqlConnectionStringBuilder.ConnectionString);        
          base.OnConfiguring(optionsBuilder);        }      
          
           protected override void OnModelCreating(ModelBuilder modelBuilder)        {            base.OnModelCreating(modelBuilder);            EntityTypeBuilder<Category> entityTypeBuilder = modelBuilder.Entity<Category>();            entityTypeBuilder.ToTable("Category");            entityTypeBuilder.HasKey(e => e.CategoryID);            entityTypeBuilder.Property(e => e.CategoryID).UseSqlServerIdentityColumn();        }    }

我们使用SampleDbContext来访问数据库。

FromSql执行SQL语句

Entity Framework Core为DbSet<TEntity>提供了一个扩展方法FromSql,用于执行SQL语句或存储过程,以下示例使用FromSql加载所有的数据。

        using (var dataContext = new SampleDbContext()) {        
            var query = dataContext.Categories.FromSql("select * from Category");        
           var result = query.ToList();        }

对于带有参数的SQL语句,我们使用C# 6 语法将SQL写成如下:

        using (var dataContext = new SampleDbContext()) {        
            var categoryID = 1;            
            var query = dataContext.Categories.FromSql($"select * from Category where CategoryID={categoryID}");      
             var result = query.ToList();        }

注意:这里不是直接使用拼接的方式处理SQL,而是转化为参数化的SQL语句,这有助于防止SQL注入攻击。我们可以使用SQL Server Profiler帮我们验证:

exec sp_executesql N''select * from Category where CategoryID=@p0'',N''@p0 int'',@p0=1

如果您不使用C# 6的语法特征,我们必须使用 @p0、@p1 ... @pn 做为SQL语句的参数:

        using (var dataContext = new SampleDbContext()) {           
        var categoryID = 1;        
          var categoryName = "Product";                        var query = dataContext.Categories.FromSql("select * from Category where CategoryID=@p0 and CategoryName=@p1"            categoryID, categoryName);        
              var result = query.ToList();            Assert.NotNull(result);        }

在上述SQL语句中中,将@p0映射到categoryID@ p1映射到categoryName

FromSql扩展方法返回的是IQueryable<TEntity>对象,要们还可以接着使用一些Linq的方法,示例如下:

       using (var dataContext = new SampleDbContext()) {           var categoryID = 1;     
            var query = dataContext.Categories.FromSql("select * from Category")               .Where(item => item.CategoryID == categoryID)               .OrderBy(item => item.CategoryName);      
             var result = query.ToList();       }

不过在这里,使用的是子查询,使用SQL Server Profiler捕获到的SQL语句如下:

exec sp_executesql N''SELECT [item].[CategoryID], [item].[CategoryName]FROM (    select * from Category) AS [item]WHERE [item].[CategoryID] = @__categoryID_1ORDER BY [item].[CategoryName]'',N''@__categoryID_1 int'',@__categoryID_1=1

提示:使用FromSql时,需要在执行的SQL语句中返回所有列,并且列名必须与实体属性名相匹配,否则执行会出错。

FromSql执行存储过程

存储过程与SQL语句写法基本一致,使用存储过程的示例如下:

       using (var dataContext = new SampleDbContext()) {           var categoryID = 1;       
          var query = dataContext.Categories.FromSql($"GetCategoryById {categoryID}");           var result = query.ToList();           Assert.NotNull(result);       }

这些参数的顺序必须与存储过程参数的顺序一致。

提示:使用FromSql执行存储过程时,如果使用''Where''、''OrderBy''等Linq语法,这些操作不会生成SQL语句,而是在.Net中对存储过程返回的集合进行过滤与排序。

ExecuteSqlCommand

DbContext暴露了一个Database属性,它包括一个ExecuteSqlCommand方法。此方法返回一个整数,表示执行的SQL语句影响的行数。有效的操作是INSERTUPDATEDELETE,不能用于返回实体。

       using (var dataContext = new SampleDbContext())
       {      
           var categoryID = 1;      
           var categoryName = "Product";                     var result = dataContext.Database.ExecuteSqlCommand($"UPDATE dbo.Category SET CategoryName={categoryName} WHERE CategoryID={categoryID}");       }

总结

本节介绍了Entity Framework Core中执行SQL语句和存储过程的几种方法, 希望对您有帮助,谢谢!

相关文章:

  • 全球首发免费的MySql for Entity Framework Core

  • .NET Core 使用Dapper 操作MySQL

  • 在.NET Core中使用MySQL5.7的JSON类型字段

  • 全文索引 - Pomelo.EFCore.MySql

  • Entity Framework Core 生成跟踪列

  • 在Apworks数据服务中使用基于Entity Framework Core的仓储(Repository)实现

  • Entity Framework Core的贴心:优雅处理带默认值的数据库字段

  • Entity Framework Core 实现MySQL 的TimeStamp/RowVersion 并发控制

  • Entity Framework Core 软删除与查询过滤器

  • Entity Framework Core 命名约定

  • 全文索引 - Pomelo.EFCore.MySql

  • Entity Framework Core 批处理语句

原文地址:http://www.cnblogs.com/tdfblog/p/execute-sql-stored-procedure-in-entity-framework-core.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文分享自微信公众号 - dotNET跨平台(opendotnet)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

Entity Framework Core中执行SQL语句和存储过程的方法介绍

Entity Framework Core中执行SQL语句和存储过程的方法介绍

无论ORM有多么强大,总会出现一些特殊的情况,它无法满足我们的要求。在这篇文章中,我们介绍几种执行SQL的方法。

表结构

在具体内容开始之前,我们先简单说明一下要使用的表结构。

    public class Category
    {

        public int CategoryID { get; set; }
        
        public string CategoryName { get; set; }
    }

Category定义了两个字段:CategoryIDCategoryName

    public class SampleDbContext : DbContext
    {
        public virtual DbSet<Category> Categories { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            var sqlConnectionStringBuilder = new SqlConnectionStringBuilder {
                DataSource = "10.0.1.5",
                InitialCatalog = "TestDataBase",
                UserID = "sa",
                Password = "******"
            };
            optionsBuilder.UseSqlServer(sqlConnectionStringBuilder.ConnectionString);

            base.OnConfiguring(optionsBuilder);
        }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            EntityTypeBuilder<Category> entityTypeBuilder = modelBuilder.Entity<Category>();
            entityTypeBuilder.ToTable("Category");
            entityTypeBuilder.HasKey(e => e.CategoryID);
            entityTypeBuilder.Property(e => e.CategoryID).UseSqlServerIdentityColumn();
        }
    }

我们使用SampleDbContext来访问数据库。

FromSql执行SQL语句

Entity Framework Core为DbSet<TEntity>提供了一个扩展方法FromSql,用于执行SQL语句或存储过程,以下示例使用FromSql加载所有的数据。

        using (var dataContext = new SampleDbContext()) {
        
            var query = dataContext.Categories.FromSql("select * from Category");

            var result = query.ToList();
        }

对于带有参数的SQL语句,我们使用C# 6 语法将SQL写成如下:

        using (var dataContext = new SampleDbContext()) {
        
            var categoryID = 1;
            
            var query = dataContext.Categories.FromSql($"select * from Category where CategoryID={categoryID}");

            var result = query.ToList();
        }

注意:这里不是直接使用拼接的方式处理SQL,而是转化为参数化的SQL语句,这有助于防止SQL注入攻击。我们可以使用SQL Server Profiler帮我们验证:

exec sp_executesql N''select * from Category where CategoryID=@p0
'',N''@p0 int'',@p0=1

如果您不使用C# 6的语法特征,我们必须使用 @p0、@p1 ... @pn 做为SQL语句的参数:

        using (var dataContext = new SampleDbContext()) {

            var categoryID = 1;
            var categoryName = "Product";
            
            var query = dataContext.Categories.FromSql("select * from Category where CategoryID=@p0 and CategoryName=@p1"
            categoryID, categoryName);

            var result = query.ToList();

            Assert.NotNull(result);
        }

在上述SQL语句中中,将@p0映射到categoryID@ p1映射到categoryName

FromSql扩展方法返回的是IQueryable<TEntity>对象,要们还可以接着使用一些Linq的方法,示例如下:

       using (var dataContext = new SampleDbContext()) {

           var categoryID = 1;

           var query = dataContext.Categories.FromSql("select * from Category")
               .Where(item => item.CategoryID == categoryID)
               .OrderBy(item => item.CategoryName);

           var result = query.ToList();
       }

不过在这里,使用的是子查询,使用SQL Server Profiler捕获到的SQL语句如下:

exec sp_executesql N''SELECT [item].[CategoryID], [item].[CategoryName]
FROM (
    select * from Category
) AS [item]
WHERE [item].[CategoryID] = @__categoryID_1
ORDER BY [item].[CategoryName]'',N''@__categoryID_1 int'',@__categoryID_1=1

提示:使用FromSql时,需要在执行的SQL语句中返回所有列,并且列名必须与实体属性名相匹配,否则执行会出错。

FromSql执行存储过程

存储过程与SQL语句写法基本一致,使用存储过程的示例如下:

       using (var dataContext = new SampleDbContext()) {

           var categoryID = 1;
           var query = dataContext.Categories.FromSql($"GetCategoryById {categoryID}");


           var result = query.ToList();

           Assert.NotNull(result);
       }

这些参数的顺序必须与存储过程参数的顺序一致。

提示:使用FromSql执行存储过程时,如果使用''Where''、''OrderBy''等Linq语法,这些操作不会生成SQL语句,而是在.Net中对存储过程返回的集合进行过滤与排序。

ExecuteSqlCommand

DbContext暴露了一个Database属性,它包括一个ExecuteSqlCommand方法。此方法返回一个整数,表示执行的SQL语句影响的行数。有效的操作是INSERTUPDATEDELETE,不能用于返回实体。

       using (var dataContext = new SampleDbContext())
       {
           var categoryID = 1;
           var categoryName = "Product";
           
           var result = dataContext.Database.ExecuteSqlCommand($"UPDATE dbo.Category SET CategoryName={categoryName} WHERE CategoryID={categoryID}");
       }

总结

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

您可能感兴趣的文章:
  • Entity Framework Core使用控制台程序生成数据库表
  • Entity Framework Core延迟加载(懒加载)用法
  • Entity Framework Core实现Like查询详解
  • Entity Framework Core批处理SQL语句
  • Entity Framework Core实现软删除与查询过滤器
  • Entity Framework Core生成列并跟踪列记录
  • ASP.NET Core在WebApi项目中使用MiniProfiler分析Entity Framework Core
  • Entity Framework Core工具使用命令行
  • Entity Framework Core关联删除
  • 详解如何在ASP.NET Core中应用Entity Framework
  • Entity Framework Core对Web项目生成数据库表

EntityFramework Core 使用原生 SQL 语句,执行存储过程和视图

EntityFramework Core 使用原生 SQL 语句,执行存储过程和视图

参考资料:
微软 MVP 杨旭教程:https://www.bilibili.com/video/BV1xa4y1v7rR?p=10

  • 创建视图和存储过程
  • 无主键的 Entity
  • 原生 SQL 查询
  • 原生 SQL 查询的要求
  • 字符串插值
  • 执行非查询类 SQL

在 EF Core 项目中,如果想在数据库中添加视图或者存储过程或者类似的东西,不可以直接操作数据库,而应该把生成视图或生成存储过程的脚本放在一个 Migration 里面,让它来执行生成视图或者创建存储过程。

创建视图和存储过程

直接 Add 一个空的 Migration,然后再修改 Migration 的代码。空的 Migration:

public partial class AddView : Migration
{
    protected override void Up(MigrationBuilder migrationBuilder)
    {

    }

    protected override void Down(MigrationBuilder migrationBuilder)
    {

    }
}

然后使用 migrationBuilder.Sql(),把 SQL 脚本用 @"xxxx" 包裹起来当作参数放进去。创建视图和存储过程的脚本都应该放在 Up 方法中,先创建视图再创建存储过程:

protected override void Up(MigrationBuilder migrationBuilder)
{
    migrationBuilder.Sql(
        @"CREATE VIEW [dbo].[PlayerClubView]
            AS SELECT p.Id as PlayerId, p.Name as PlayerName, c.Name as ClubName
            FROM [dbo].[Players] as p
            INNER JOIN [dbo].[Clubs] as c
            ON p.ClubId = c.Id");
    migrationBuilder.Sql(
        @"CREATE PROCEDURE [dbo].[RemoveGamePlayersProcedure] @playerId int = 0
            AS 
                DELETE FROM [dbo].[GamePlayers] WHERE [PlayerId] = @playerId
            RETURN 0");
}

同时 Down 方法中应该包含回滚的操作,如果更新失败就回滚,回滚时应该先删除存储过程再删除视图:

protected override void Down(MigrationBuilder migrationBuilder)
{
    migrationBuilder.Sql(
        @"DROP PROCEDURE [dbo].[RemoveGamePlayersProcedure]");
    migrationBuilder.Sql(
        @"DROP VIEW [dbo].[PlayerClubView]");
}

Update-Database 之后,看一下数据库:

UTOOLS1593166699745.png

可以看到视图和存储过程全都有了。

无主键的 Entity

我们建立的实体 Model 基本都有主键,而且基本都是 Id,但:

  • .NET Core 3.1 允许无主键的 Entity
  • 它们不会被追踪
  • 映射到没有主键的 Table 或者 View

我们根据刚才建立的视图建立一个没有主键的模型:

public class PlayerClub
{
    public int PlayerId { get; set; }
    public string PlayerName { get; set; }
    public string ClubName { get; set; }
}

然后把这个类添加到 Context 里的 DbSet 属性。但 DbSet 不识别没有主键的类,我们需要再 OnModelCreating 中设置一下,用 HasNoKey() 方法设置 PlayerClub 这个 Entity。但只这样设置还不足够,如果后面再添加迁移,它会认为我们想要创建 PlayerClubs 这样一个 Table,所以要用 ToView() 方法把它映射到我们前面创建的视图 [dbo].[PlayerClubView] 上。需要稍微修改一下视图名,去掉中括号和 dbo:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    ...
    modelBuilder.Entity<PlayerClub>()
        .HasNoKey()
        .ToView("PlayerClubView");
}

针对这种没有主键的 Entity,查出来的结果都是无法追踪的。

然后我们像查表一样查一下视图:

var playerClubs = context.PlayerClubs.ToList();

UTOOLS1593168338482.png

这种查询也可以加 Where 查询条件:

var playerClubs = context.PlayerClubs
    .Where(x => x.PlayerId > 1)
    .ToList();

但如果使用 DbSet 的 Find() 方法,在编译的时候不会报错,在运行的时候会报错。因为 Find 后面跟的是主键,而这个视图没有主键。

原生 SQL 查询

一共有两种方法,还有它们各自的异步版本:

  • FromSQLRaw("SELECT" * ...")
  • FromSQLRawAsync("SELECT" * ...")
  • FromSQLInterpolated($"SELECT * WHERE x={var}")
  • FromSQLInterpolatedAsync($"SELECT * WHERE x={var}")

第二种方法支持 C#6 出现的字符串插值。这几种方法都是 DbSet 的方法,所以只能针对 DbSet 来执行这个方法。最后还要调用 ToList() 等方法,否则查询不会执行。

var leagues = context.Leagues
    .FromSqlRaw("SELECT * FROM dbo.Leagues")
    .ToList();

UTOOLS1593169259412.png

也可以加查询条件和 Include() 等。过滤条件可以在 SQL 语句里面写,在外面写没有太大意义:

var clubs = context.Clubs
    .FromSqlRaw("SELECT * FROM dbo.Clubs")
    .Include(x => x.League)
    .Include(x => x.Players)
        .ThenInclude(x => x.GamePlayers)
    .ToList();

原生 SQL 查询的要求

  • 必须返回 Entity 类型的所有(标量)属性

    也就是 SELECT *,如果写列名必须一个不多一个不少,而且不包含导航属性

  • 字段名和 Entity 的属性名匹配
  • 无法包含关联的数据

    指在 SQL 语句中无法包含关联的数据

  • 只能查询已知的 Entity

字符串插值

插值的部分在生成的 SQL 语句中也是 SQL 参数。

var id = 0;

var clubs = context.Clubs
    .FromSqlInterpolated($"SELECT * FROM dbo.Clubs WHERE Id > {id}")
    .ToList();

UTOOLS1593169799606.png

如果数据库中有对应的 Club 类的存储过程的话,Clubs.FromSqlInterpolated()Clubs.FromSqlRaw() 也可以执行存储过程。前提是要求存储过程返回的字段必须与 Club 类匹配。

执行非查询类 SQL

执行非查询类 SQL,包括执行非查询类的存储过程,不能使用 DbSet 的方法,应当使用 Context 的 Database 属性,它有下面两种方法,各自还有一个异步方法。。

  • Context.Database.ExecuteSQLRaw()
  • Context.Database.ExecuteSQLRawAsync()
  • Context.Database.ExecuteSQLInterpolated()
  • Context.Database.ExecuteSQLInterpolatedAsync()
  • 无法用于查询
  • 只能返回影响的行数
var count = context.Database
    .ExecuteSqlRaw("EXEC dbo.RemoveGamePlayersProcedure {0}", 2);

count = context.Database
    .ExecuteSqlInterpolated($"EXEC dbo.RemoveGamePlayersProcedure {2}");

可以看到无论那种方法,都使用了参数形式,因为这是非查询类 SQL 语句,不使用参数的话很容易被 SQL 注入。

UTOOLS1593180643043.png

我们今天的关于通过Zend Framework执行MSSQL存储过程的分享已经告一段落,感谢您的关注,如果您想了解更多关于Entity Framework Core 执行 SQL 语句和存储过程、Entity Framework Core 执行SQL语句和存储过程、Entity Framework Core中执行SQL语句和存储过程的方法介绍、EntityFramework Core 使用原生 SQL 语句,执行存储过程和视图的相关信息,请在本站查询。

本文标签:

上一篇如何在MySQL查询本身中检索存储在JSON数组中的值?(如何在mysql查询本身中检索存储在json数组中的值)

下一篇MySQL拒绝参数(mysql拒绝用户访问数据库)