首页 > 解决方案 > 在 EF Core 2.1 中执行异步不可选择的存储过程

问题描述

我正在尝试在 EF Core 2.1 中执行异步不可选择的存储过程。

  return Ok(
              await db.Set()
              .FromSql($"EXECUTE PROCEDURE MY_PROC({id})")
              .ToListAsync());

错误

无法从用法中推断出方法“DbContext.Set()”的类型参数。尝试明确指定类型参数

我也试过:

return Ok(
             await db.MYDB
              .FromSql($"EXECUTE PROCEDURE MY_PROC({id})")              
             .ToListAsync());

错误

500(内部服务器错误)在控制台

然后我尝试创建一个静态方法:

public static async Task ExecSqlNonQuery(Entities db, string sql)
{
     using (var com = db.Database.GetDbConnection().CreateCommand())
     {
         com.CommandText = sql;
         com.CommandType = CommandType.StoredProcedure;
         db.Database.OpenConnection();
         await com.ExecuteNonQueryAsync();
     };
}
....
return Ok( await ExecSqlNonQuery(db,$"EXECUTE PROCEDURE MY_PROC({id})");   

但有了这段代码,我得到:

论点 1:不能从 'void' 转换为 'object'

仅适用于非异步和老式方式:

public static  bool ExecSqlNonQuery(Entities db, string sql)
{
    try
    {
        using (var com = db.Database.GetDbConnection().CreateCommand())
        {
            com.CommandText = sql;
            com.CommandType = CommandType.StoredProcedure;

            db.Database.OpenConnection();
            com.ExecuteNonQuery();

            return true;
        };
    }
    catch (Exception)
    {
        return false;
    }
}
......
return Ok(ExecSqlNonQuery(db, $"EXECUTE PROCEDURE MY_PROC({id})"););

有什么帮助吗?谢谢

标签: asp.net-coreentity-framework-coreasp.net-core-2.0asp.net-core-webapientity-framework-core-2.1

解决方案


FromSql方法用于记录集(查询)返回 SQL 命令。对于其他类型的命令,您应该使用一些ExecuteSqlCommandorExecuteSqlCommandAsync方法重载。

对数据库执行给定的 SQL 并返回受影响的行数。

例如(假设 SQL 语法正确):

await db.Database.ExecuteSqlCommandAsync($"EXECUTE PROCEDURE MY_PROC({id})");
return Ok();

推荐阅读