2017-05-30 10 views
0

asp.net core webapiを使用してアプリケーション用の非同期CRUD機能を実装しようとしています。データベースへのリクエストを行うためにストアドプロシージャを使用するように指示されています。私は要求を取得するために非同期を実装しましたが、要求を作成するために同じものに苦労しました。誰かが自分のコードで何が間違っているのか教えていただけますか?intにはGetawaiter + asp.netの定義が含まれていませんコアweb api async

私は、コードののawaitラインに私のリポジトリの方法で、次のエラーメッセージを取得しています

enter image description here

コントローラ方法:

[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 

答えて

1

ExecuteSqlCommand可能性が最も高いint型ではなく、タスクを返します。代わりにExecuteSqlCommandAsyncを使用してください。 https://msdn.microsoft.com/en-us/library/system.data.entity.database.executesqlcommandasync(v=vs.113).aspx

+0

あなたの提案に従って新しいリポジトリメソッドを追加しました。しかし、私はプロシージャが呼び出されるのを見ていない。私は呼び出しをキャプチャするために私のプロファイラを切り替えました。私は同じパラメータ値を渡すことによって、バックエンドで私のストアドプロシージャをテストし、新しく生成されたムービーIDを返すことによって正常に動作します。私もstoreprocedureを含むように投稿を更新しました – Tom

+0

@Tomは例外を投げるか、何らかの方法で失敗しますか? – Andrew

+0

こんにちはAndrew、私はなぜそれが動作していないか理解することは困難になります例外がスローされているのを見ている。 – Tom

関連する問題