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
'prosource' 카테고리의 다른 글
ggplot2 축, 범례 등이 없는 그림 (0) | 2023.07.02 |
---|---|
+=의 정확한 기능은 무엇입니까? (0) | 2023.07.02 |
Oracle에서 count(1)와 count(*)의 차이 (0) | 2023.07.02 |
웹 스트림과 Node.js 스트림 API의 차이점 (0) | 2023.07.02 |
유형 스크립트 확장 서드 파티 선언 파일 (0) | 2023.07.02 |