Я пытаюсь реализовать асинхронную функциональность CRUD для своего приложения, используя ядро webapi asp.net. Мне сказали использовать только хранимые процедуры для любых запросов к базе данных. Я реализовал асинхронность для запроса на получение, но изо всех сил пытался сделать то же самое для запроса на создание. Может ли кто-нибудь сказать мне, что я делаю неправильно в своем коде?
Я получаю следующее сообщение об ошибке в моем методе репозитория в строке кода ожидания
Метод контроллера:
[HttpPost]
[Route("api/Movies")]
public async Task<IActionResult> CreateMovie([FromBody] MoviesDto movies)
{
if (movies == null)
{
return BadRequest();
}
// Check if movie exists
var movie = _moviesRepository.GetMovie(movies.MovieId);
if (movie == null)
{
return NotFound();
}
var results = Mapper.Map<Movies>(movies);
if (ModelState.IsValid)
{
await _moviesRepository.AddMovie(results);
}
return Ok(results);
}
Метод репозитория:
public async Task AddMovie(Movies movie)
{
await _mrdbContext.Database.ExecuteSqlCommand("dbo.spInsertMovie {0}, {1}, {2}, {3}, {4}, {5}", movie.Title,movie.ReleaseYear,movie.Plot,movie.MovieLength,"Ranjit Menon","");
}
Новый метод репозитория:
public async Task AddMovie(Movies movie)
{
object[] parameters =
{
new SqlParameter("@val1", movie.Title),
new SqlParameter("@val2", movie.ReleaseYear),
new SqlParameter("@val3", movie.Plot),
new SqlParameter("@val4", movie.MovieLength),
new SqlParameter("@val5", "Ranjit Menon"),
new SqlParameter
{
ParameterName = "@retVal",
SqlDbType = SqlDbType.Int,
Direction = ParameterDirection.Output,
Value = -1
}
};
await _mrdbContext.Database.ExecuteSqlCommandAsync("EXEC @retVal = dbo.spInsertMovie @val1, @val2, @val3, @val4,@val5", CancellationToken.None , parameters);
}
Хранимая процедура:
CREATE PROCEDURE [dbo].[spInsertMovie]
(@Title varchar(50),
@ReleaseYear int,
@Plot varchar(50),
@MovieLength int,
@CreatedBy varchar(20)
)
AS
BEGIN
set nocount on
----------------------------------------
-- variables
----------------------------------------
-- error
declare @ErrorMessage nvarchar(2048), @ErrorSeverity int, @ErrorState int, @MovieID int
----------------------------------------
-- insert record
----------------------------------------
begin try
-- insert record
insert into [dbo].[Movies]
([Title]
,[ReleaseYear]
,[Plot]
,[MovieLength]
,[CreatedBy]
,[UpdatedBy])
values
(@Title
,@ReleaseYear
,@Plot
,@MovieLength
,@CreatedBy
,@CreatedBy)
-- get assigned id
set @MovieID = scope_identity()
end try
begin catch
select @ErrorMessage = dbo.fnGetErrorMessage('Insert Movie Record', error_message(), object_schema_name(@@procid), object_name(@@procid), error_line()), @ErrorSeverity = error_severity(), @ErrorState = error_state();
raiserror(@ErrorMessage, @ErrorSeverity, @ErrorState);
return
end catch
-- return assigned id
select @MovieID as MovieID
END