C # 코드에서 dapper를 사용하여 저장 프로 시저에 출력 매개 변수 전달

c# dapper sql sql-server stored-procedures

문제

이 형식으로 저장 프로 시저가 있습니다.

CREATE PROCEDURE SP_MYTESTpROC
    @VAR1 VARCHAR(10),
    @VAR2 VARCHAR(20),
    @BASEID INT ,
    @NEWID INT OUTPUT
As Begin
   INSERT INTO TABLE_NAME(username, firstname)
      select @VAR1, @VAR2 
      WHERE ID = @BASEID

   SET @NEWID = SCOPE_IDENTITY() AS INT
END

나는이 저장 프로 시저를 dapper를 사용하여 C # 코드에서 호출하려고합니다. 내 질문은 : 어떻게 출력 매개 변수를 저장 프로 시저에 전달하는 데 사용하는 동안 dapper?

수락 된 답변

이 예제에서 찾을 수있는 Test.cs 파일 만 검색하면됩니다.

    public void TestProcSupport()
    {
        var p = new DynamicParameters();
        p.Add("a", 11);
        p.Add("b", dbType: DbType.Int32, direction: ParameterDirection.Output);
        p.Add("c", dbType: DbType.Int32, direction: ParameterDirection.ReturnValue);
        connection.Execute(@"create proc #TestProc 
                         @a int,
                             @b int output
                             as 
                             begin
                                 set @b = 999
                                 select 1111
                                 return @a
                             end");
        connection.Query<int>("#TestProc", p, commandType: CommandType.StoredProcedure).First().IsEqualTo(1111);
        p.Get<int>("c").IsEqualTo(11);
        p.Get<int>("b").IsEqualTo(999);
    }

그래서, 당신의 C # 코드는 다음과 같이 작성할 수 있다고 생각합니다.

    public void InsertData()
    {
        var p = new DynamicParameters();
        p.Add("VAR1", "John");
        p.Add("VAR2", "McEnroe");
        p.Add("BASEID", 1);
        p.Add("NEWID", dbType: DbType.Int32, direction: ParameterDirection.Output);
        connection.Query<int>("SP_MYTESTpROC", p, commandType: CommandType.StoredProcedure);
        int newID =  p.Get<int>("NEWID");
    }

부수적으로, 저장 프로 시저의 접두사로 SP를 사용하지 마십시오. 시스템 정의 절차를 위해 예약되어 있으므로 Microsoft가 동일한 이름을 사용하기로 결정하면 문제가 발생할 수 있습니다. 그것이 위험 할 수도 있겠지만 왜 위험한가?


인기 답변

@id ( @id = @id OUTPUT )라는 이름의 INTEGER 유형의 OUTPUT 매개 변수를 항상 사용하는 경우 sql 문자열과 anonymous 객체를 전달하는 일반 Dapper 구문을 사용할 수있는 확장 메소드를 만들 수 있습니다.

using Dapper;
using System.Data;
using System.Data.SqlClient;

public static int ExecuteOutputParam
            (this IDbConnection conn, string sql, object args)
        {
            // Stored procedures with output parameter require
            // dynamic params. This assumes the OUTPUT parameter in the
            // SQL is an INTEGER named @id.
            var p = new DynamicParameters();
            p.Add("id", dbType: DbType.Int32, direction: ParameterDirection.Output);

            var properties = args.GetType().GetProperties();
            foreach (var prop in properties)
            {
                var key = prop.Name;
                var value = prop.GetValue(args);

                p.Add(key, value);
            }

            conn.Execute(sql, p);

            int id = p.Get<int>("id");
            return id;
        }

리플렉션을 사용하여 모든 속성을 읽지 만 페널티를 받으면 모든 호출에 대해 DynamicParameters 를 보일러 플레이트로 작성하지 않아도됩니다.

트랜잭션의 경우 SqlTransaction 에서 확장 메서드를 만들어 다음과 같이 Execute로 전달합니다.

transaction.Connection.Execute(sql, p, transaction);


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