使用 Entity Framework Core 的存储过程未找到 return 数据库结果的命令

No command found to return database results from stored procedure using Entity Framework Core

我正在尝试使用在 SQL 服务器数据库中创建的具有 6 个参数的存储过程 usp_WebPortalUserSearchResults

以下是我验证 Entity Framework 核心版本的方法。在解决方案资源管理器中验证包部分时,发现为 Microsoft.EntityFrameworkCore(5.0.9)。因此,我假设我正在使用 Entity Framework Core v5.

我尝试了多种方法从存储过程中获取 return 数据,但对 return 数据没有任何作用。

以下是关于存储过程及其参数的信息。此存储过程应 return User 详细信息。

usp_UserSearchResults
    @AccountNum as integer,
    @UserId as uniqueidentifier,
    @UserName as nvarchar(100),
    @FirstName as nvarchar(100),
    @LastName as nvarchar(100),
    @Email as nvarchar(100)

以下只是我尝试过的一些方法。有人可以建议我使用 Entity Framework Core 将结果返回到 C# 的正确方法是什么吗?

使用此代码,Visual Studio 2019 编辑器报告无法找到 ExecuteSqlCommand

var commandText = "usp_WebPortalUserSearchResults";
SqlParameter sqlPrmAccountNum = new SqlParameter("@AccountNum", model.AccountNum);
_context.Database.ExecuteSqlCommand(commandText, sqlPrmAccountNum);

下面是我尝试过的另一种方法,这甚至没有成功。有人可以告诉我如何解决问题吗!

var webPortalUsers = new List<WebPortalUser>();

using (var command = _context.Database.GetDbConnection().CreateCommand())
{
    command.CommandText = "dbo.usp_WebPortalUserSearchResults";
    command.CommandType = System.Data.CommandType.StoredProcedure;

    var sqlPrmAccountNum = new SqlParameter
        {
            ParameterName = "AccountNum",
            SqlDbType = System.Data.SqlDbType.Int,
            Direction = System.Data.ParameterDirection.Input,
            Value = model.AccountNum
        };

    command.Parameters.Add(sqlPrmAccountNum);

    var sqlPrmUserId = new SqlParameter
        {
            ParameterName = "UserId",
            SqlDbType = System.Data.SqlDbType.UniqueIdentifier,
            Direction = System.Data.ParameterDirection.Input,
            Value = model.UserId
        };
    command.Parameters.Add(sqlPrmUserId);

    var sqlPrmUserName = new SqlParameter
        {
            ParameterName = "UserName",
            SqlDbType = System.Data.SqlDbType.NVarChar,
            Size = 100,
            Direction = System.Data.ParameterDirection.Input,
            Value = model.UserName
        };
    command.Parameters.Add(sqlPrmUserName);

    var sqlPrmFirstName = new SqlParameter
        {
            ParameterName = "FirstName",
            SqlDbType = System.Data.SqlDbType.NVarChar,
            Size = 100,
            Direction = System.Data.ParameterDirection.Input,
            Value = model.FirstName
        };

    command.Parameters.Add(sqlPrmFirstName);

    var sqlPrmLastName = new SqlParameter
        {
            ParameterName = "LastName",
            SqlDbType = System.Data.SqlDbType.NVarChar,
            Size = 100,
            Direction = System.Data.ParameterDirection.Input,
            Value = model.LastName
        };

    command.Parameters.Add(sqlPrmLastName);

    var sqlPrmEmail = new SqlParameter
        {
            ParameterName = "Email",
            SqlDbType = System.Data.SqlDbType.NVarChar,
            Size = 100,
            Direction = System.Data.ParameterDirection.Input,
            Value = 100
        };
    command.Parameters.Add(sqlPrmEmail);

    command.Parameters["AccountNum"].Value = model.AccountNum;
    command.Parameters["UserId"].Value = model.UserId;
    command.Parameters["UserName"].Value = model.UserName;
    command.Parameters["FirstName"].Value = model.FirstName;
    command.Parameters["LastName"].Value = model.LastName;
    command.Parameters["Email"].Value = model.Email;

    _context.Database.OpenConnection();

    using (var result = command.ExecuteReader())
    {
        webPortalUsers.Add(new WebPortalUser
            {
                AccountNum = Convert.ToInt32(result["AccountNum"]),
                //MYTODO: Need to fix this: UserId = Convert.(result["UserId"]),
                UserName = Convert.ToString(result["UserName"]),
                FirstName = Convert.ToString(result["FirstName"]),
                LastName = Convert.ToString(result["LastName"]),
                Email = Convert.ToString(result["Email"])
            });
    }
}

return webPortalUsers;

一切正常。看来问题出在您的 stored procedure 上。我建议您将 NOCOUNT ON 添加到 sp

的开头
create procedure [dbo].usp_UserSearchResults
as
begin

NOCOUNT ON;

...

NOCOUNT OFF;

end

使用 NOCOUNT ON 您可以在 sp 中获得 select 语句结果。

NOCOUNT ON 停止显示受 Transact-SQL 语句或存储过程影响的行数的消息作为结果集的一部分返回。

看看SET NOCOUNT (Transact-SQL)