prosource

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

probook 2023. 7. 2. 20:50
반응형

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

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

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에서 동일한 이름을 사용하기로 결정하면 문제가 발생할 수 있습니다.가능성이 희박하지만 그것은 나쁜 관행이고 왜 위험합니까?

"ath's" 제안 추가:반사를 피하기 위해, 동적 파머스.AddDynamicParams()는 익명 개체를 사용합니다. 그런 다음 이렇게 반환 매개 변수를 추가할 수 있습니다.

var param = new { A="a", B="b" };
var dynamicParameters = new DynamicParameters();
dynamicParameters.AddDynamicParams(param);
dynamicParameters.Add("return", dbType: DbType.Int32, direction: ParameterDirection.ReturnValue);

이제 익명 매개 변수 개체 대신 dapper 호출에 dynamicParameters 개체를 사용합니다.

(원하는 경우 출력 매개 변수에 대해서도 이 작업을 수행할 수 있습니다.)

INTERGER 유형의 OUTPUT 매개 변수가 항상 명명된 경우@id(@id = @id OUTPUT), 당신은 정규를 사용할 수 있는 이와 같은 확장 방법을 만들 수 있습니다.Dapper구문 전달 sql 문자열 및anonymous객체:

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다음과 같이 실행에 전달:

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

언급URL : https://stackoverflow.com/questions/22353881/passing-output-parameters-to-stored-procedure-using-dapper-in-c-sharp-code

반응형