使用 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 语句或存储过程影响的行数的消息作为结果集的一部分返回。
我正在尝试使用在 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 语句或存储过程影响的行数的消息作为结果集的一部分返回。