저장 프로 시저에서 출력 매개 변수를 가져 오는 다른 방법

dapper

문제

내 ORM 필요에 대한 Dapper를 사용하는 것이 좋지만 저장 프로 시저와 강력한 형식의 List를 사용하여 SQL Server 데이터베이스를 삽입 / 업데이트하는 더 좋은 방법이 있어야한다는 것을 알고 있습니다.

예 :

나는 수업을 가지고있다. Song :

    public class Song
{
    public int Id { get; set; }
    public string title { get; set; }
    public string genre { get; set; }
}

누군가가 노래 목록을 제출합니다.

 List<Song> songs = new List<Song> { 
            new Song { Id = 1, title = "Song 1" , genre="rock"}, 
            new Song { Id = 2, title = "Song 2" , genre="disco"}};

새 노래를 삽입하거나 노래가 이미있는 경우 업데이트하는 저장 프로 시저를 사용하여 데이터베이스를 업데이트하려고합니다. 내 저장 프로 시저에는 두 개의 출력 매개 변수가 있습니다. @success_added int = 0 and @success_updated int = 0

내 sproc은 다음과 같습니다 :

ALTER PROCEDURE [dbo].[UpdateSong] 
@Id int = 0, 
@title varchar(25) = NULL,
@genre varchar(25) = NULL,
@success_updated bit = 0 OUTPUT,
@success_added bit = 0 OUTPUT
AS
IF NOT EXISTS (SELECT Id  FROM Songs WHERE Id = @Id)
    BEGIN
        INSERT INTO Songs
        (
        -- Id created by db
        title,
        genre
        ) 
        VALUES
        (
        @title, 
        @genre
        )
        SELECT @Success_Added = 1, @Success_Updated = 0
    END
ELSE -- song already exists
    BEGIN
        UPDATE Songs  
        SET
        title = @title,
        @genre = @genre
        WHERE Id = @Id
        SELECT @Success_Added = 0, @Success_Updated = 1
    END
RETURN

나는이 작품을 알고 :

dbConn.Open();
DynamicParameters p = new DynamicParameters();
foreach (var song in songs)
  {
    p.Add("@Id", song.Id);
    p.Add("@title", song.title);
    p.Add("@genre", song.genre);
    p.Add("@success_updated", dbType: DbType.Boolean, direction: ParameterDirection.Output);
    p.Add("@success_added", dbType: DbType.Boolean, direction: ParameterDirection.Output);
    dbConn.Execute("Test_UpdateSong", p, commandType: CommandType.StoredProcedure);
    Console.WriteLine("@success_added: " + p.Get<Boolean>("@success_added"));
    Console.WriteLine("@success_updated: " + p.Get<Boolean>("@success_updated"));
  }
dbConn.Close();

그러나이를 위해서는 각 Song 속성을 익명 형식의 DynamicParameter로 수동 변환해야합니다. 나는 차라리 간단히 이렇게 할 것이다.

dbConn.Open();
foreach (var song in songs)
  {
    var updateResult = dbConn.Query<dynamic>("Test_UpdateSong", song, commandType: CommandType.StoredProcedure);
  }
dbConn.Close();

어떤 작품들. 그러나 이제 출력 매개 변수는 어떻게 얻습니까?

수락 된 답변

원래 언급했듯이 각 클래스 속성을 Dapper 동적 매개 변수로 수동으로 변환하지 않아도됩니다. 이것은 제네릭 메서드를 만들면 어떤 클래스가 메서드에 전달되는지 알 수 없으며 따라서 동적 매개 변수로 변환하기 위해 전달할 속성이 있기 때문에 중요합니다. @Metro Smurfs의 조언을 듣고 (다른 모든 방법이 실패 할 때) Dapper 테스트 클래스를 살펴본 결과 나에게 적합한 해결책을 찾았습니다.

DynamicParameters p = new DynamicParameters(song);

Song 객체를 DynamicParameters 생성자에 추가하면 모든 속성을 매개 변수로 자동 변환하는 DynamicParameters 템플릿이 만들어집니다. 그런 다음 간단히 두 개의 출력 매개 변수를 추가하고 sproc을 실행할 수 있습니다.

p.Add("@success_updated", dbType: DbType.Boolean, direction: ParameterDirection.Output);
p.Add("@success_added", dbType: DbType.Boolean, direction: ParameterDirection.Output);
dbConn.Execute("Test_UpdateSong", p, commandType: CommandType.StoredProcedure);
// get my output parameters...
var success_added = p.Get<bool>("@success_Added");
var success_added = p.Get<bool>("@success_Updated");

그리고 나는 가기 좋다! @Nick과 @Metro Smurf에게 감사드립니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow