asp.net core webapiを使用してアプリケーション用の非同期CRUD機能を実装しようとしています。データベースへのリクエストを行うためにストアドプロシージャを使用するように指示されています。私は要求を取得するために非同期を実装しましたが、要求を作成するために同じものに苦労しました。誰かが自分のコードで何が間違っているのか教えていただけますか?intにはGetawaiter + asp.netの定義が含まれていませんコアweb api async
私は、コードののawaitラインに私のリポジトリの方法で、次のエラーメッセージを取得しています
コントローラ方法:
[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
あなたの提案に従って新しいリポジトリメソッドを追加しました。しかし、私はプロシージャが呼び出されるのを見ていない。私は呼び出しをキャプチャするために私のプロファイラを切り替えました。私は同じパラメータ値を渡すことによって、バックエンドで私のストアドプロシージャをテストし、新しく生成されたムービーIDを返すことによって正常に動作します。私もstoreprocedureを含むように投稿を更新しました – Tom
@Tomは例外を投げるか、何らかの方法で失敗しますか? – Andrew
こんにちはAndrew、私はなぜそれが動作していないか理解することは困難になります例外がスローされているのを見ている。 – Tom