Я создал новое веб-приложение ASP.NET Core 2.1 с Angular
Visual Studio создает проект, который использует Entity Framework Core с ASP.NET Core MVC.
У меня есть этопроблема: я должен прочитать записи из хранимой процедуры:
CREATE PROCEDURE GetEmployees
(@PageIndex INT,
@PageSize INT)
AS
BEGIN
SELECT *
FROM employee
ORDER BY id
OFFSET @PageSize * (@PageIndex - 1) ROWS
FETCH NEXT @PageSize ROWS ONLY;
SELECT COUNT(*) AS totalCount
FROM employee;
END
Я нашел вопрос, который почти решает мой вопрос , но, к сожалению, все еще есть что-то, что не работает.
Это мой код:
namespace Angular.Controllers
{
//[Produces("application/json")]
[Route("api/Employees")]
public class EmployeesController : Controller
{
private readonly ApplicationDbContext _context;
public EmployeesController(ApplicationDbContext context)
{
_context = context;
}
// GET: api/Employees/pageIndex/1/pageSize/1
[HttpGet("pageIndex/{pageIndex}/pageSize/{pageSize}")]
public Task<IActionResult> GetEmployeeP([FromRoute] int pageIndex, int pageSize)
{
SqlParameter pageIndexParam = new SqlParameter("@PageIndex", SqlDbType.Int);
pageIndexParam.Value = pageIndex;
SqlParameter pageSizeParam = new SqlParameter("@pageSize", SqlDbType.Int);
pageSizeParam.Value = pageSize;
// SqlParameter pageIndexParam = new SqlParameter("@PageIndex", pageIndex);
// SqlParameter pageSizeParam = new SqlParameter("@pageSize", pageSize);
var cmd = _context.Database.GetDbConnection().CreateCommand();
cmd.CommandText = "GetEmployees"; // The name of the stored procedure
cmd.CommandType = System.Data.CommandType.StoredProcedure;
// the 2 parameters to be passed to the procedure
var param = cmd.CreateParameter();
param.ParameterName = "@PageIndex";
param.Value = pageIndexParam;
cmd.Parameters.Add(param);
var param2 = cmd.CreateParameter();
param2.ParameterName = "@pageSize";
param2.Value = pageSizeParam;
cmd.Parameters.Add(param2);
try
{
// connection.Open();
// _context.Database.GetDbConnection().Open(); // it crashes after this line
_context.Database.OpenConnection(); // it crashes after this line
var dr = cmd.ExecuteReader(); // ArgumentException: No mapping exists from object type System.Data.SqlClient.SqlParameter to a known managed provider native type.
List<Employee> listEmp = new List<Employee>();
while (dr.Read())
{
// Is there a faster way to read the whole record?
// Or should I write a line for each field?
Employee emp = new Employee();
emp.ID = System.Int32.Parse(dr["id"].ToString());
emp.Fname = dr["FName"].ToString();
emp.email = dr["email"].ToString();
emp.Lname = dr["LName"].ToString();
listEmp.Add(emp);
dr.NextResult();
}
return Ok(listEmp);
}
catch (Exception ex)
{
// how can I return an error in json format?
throw;
}
}
}
}
Проблема в строке, где скрипт ExecuteReader:
ArgumentException: не существует сопоставления для объекта типа System.Data.SqlClient.SqlParameter для родного типа известного управляемого поставщика.
Я использую Microsoft SQL Server В файле Startup.cs я настроил соединение следующим образом:
services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer("Server=localhost\\SQLEXPRESS;Database=master;Trusted_Connection=True;"));
МожетВы мне помогаете?
Может быть, мне удалось правильно передать параметры (см. мое решение, в ответ), но я не могу извлечь записи