DynamicParameters를 Template과 함께 사용할 수 있고 dapper에서 return 매개 변수를 사용할 수 있습니까?

.net c# dapper

문제

현재 작업중인 시스템은 모든 데이터 액세스에 대해 저장 프로 시저를 사용합니다. 나는 지금 Dapper를보고있다. (지금까지 멋지다.)하지만 템플릿을 사용하여 만든 DynamicParameters 객체를 사용할 수 있지만 매개 변수 중 하나를 출력 매개 변수로 만들 수 있는지 궁금하다. 예 :

SP :

internal class Person
{
  public int ID { get; set; }
  public string Name { get; set; }
  public DateTime DOB { get; set; }
}

포코 :

internal class Person
{
  public int ID { get; set; }
  public string Name { get; set; }
  public DateTime DOB { get; set; }
}

암호:

internal class Person
{
  public int ID { get; set; }
  public string Name { get; set; }
  public DateTime DOB { get; set; }
}

현재 키를 찾을 수 없어 오류가 발생합니다. 저장된 procs 매개 변수를 모두 수동으로 설정하지 않고 ID 출력 매개 변수를 가져 오는 방법이 있습니까?

수락 된 답변

빠른 조정을 사용하면 Add 이제 템플릿의 값을 대체 하여 다음을 허용합니다.

public void TestProcWithOutParameter()
{
    connection.Execute(
        @"CREATE PROCEDURE #TestProcWithOutParameter
@ID int output,
@Foo varchar(100),
@Bar int
AS
SET @ID = @Bar + LEN(@Foo)");
    var obj = new
    { // this could be a Person instance etc
        ID = 0,
        Foo = "abc",
        Bar = 4
    };
    var args = new DynamicParameters(obj);
    args.Add("ID", 0, direction: ParameterDirection.Output);
    connection.Execute("#TestProcWithOutParameter", args,
                 commandType: CommandType.StoredProcedure);
    args.Get<int>("ID").IsEqualTo(7);
}

충분히 가깝습니까? 기존 값 또는 새 값 중 하나 인 ParameterDirection.ReturnValue 를 사용할 수도 있습니다. 원래 템플릿으로 직접 업데이트되지 않습니다 . 이 값은 DynamicParameters 인스턴스에서 가져와야합니다 (그림 참조).


인기 답변

DynamicParameters 의 생성자를 사용하여 템플릿 객체를 지정하는 경우 @ID 가 출력 매개 변수임을 지정해야합니다. 처음에는 템플릿을 통해 ParameterDirection.Input 으로 설정됩니다. 추가 한 후에는 업데이트 된 값을 갖도록 재정의되고 다음과 같이 매개 변수 이름으로 값을 가져올 수 있습니다.

string sql = "INSERT INTO Person (Name, DOB) VALUES (@Name, @DOB) SELECT SCOPE_IDENTITY()";
decimal id = conn.Query<decimal>(sql, procParams).First();
person.ID = (int)id;

위에 나와있는 것과 더불어이 작업을 수행하고 클래스와 코드를 사용할 수있었습니다.

편집 : 주석에서 설명한대로 저장 프로 시저가 선언 한 것보다 많은 인수를 받아들이지 않습니다. 따라서 대체 접근법은 저장 프로 시저를 버리고 일부 인라인 SQL에 의존하는 것입니다. 쿼리를 사용할 때 Dapper는 SQL 문에 지정되지 않은 모든 매개 변수를 무시합니다. 이 문제를 해결하기위한 해결 방법입니다.

string sql = "INSERT INTO Person (Name, DOB) VALUES (@Name, @DOB) SELECT SCOPE_IDENTITY()";
decimal id = conn.Query<decimal>(sql, procParams).First();
person.ID = (int)id;

SCOPE_IDENTITY() 는 int가 아닌 십진수를 반환합니다.

이상적이지 않은 또 다른 생각은 Dapper 코드를 수정하고 DynamicParameters 클래스에 Remove 메서드를 추가하여 원하지 않는 매개 변수를 제거하는 것입니다. 이렇게하면 저장 프로 시저를 행복하게 만들기 위해 모든 매개 변수를 제거 할 시간을 지정하기 때문에 많은 시간을 절약 할 수 있습니다. 이것을 구현하기로 결정했다면 parameters 사전에서 제거 할 키를 지정할 때 대소 문자가 중요하다는 것을 기억하십시오.




아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.