.NET 및 Dapper.NET에서이 SQL 문을 실행하려면 어떻게해야합니까?

.net c# dapper

문제

다음 SQL 쿼리가 있습니다.

BEGIN TRAN;

UPDATE [dbo].[Foo] SET StatusType = 2 WHERE FooId = xxx;
INSERT INTO [dbo].[FooNotes] (FooId, Note) VALUES ('blah....', xxx);

ROLLBACK TRAN;

이것은 id의 목록입니다. 예.

var fooIds = new [] { 1, 2, 3, 4, 5, 6 };

그래서 나는 이걸 기대한다 ..

BEGIN TRAN;

UPDATE [dbo].[Foo] SET StatusType = 2 WHERE FooId = 1;
INSERT INTO [dbo].[FooNotes] (FooId, Note) VALUES ('blah....', 1);

UPDATE [dbo].[Foo] SET StatusType = 2 WHERE FooId = 2;
INSERT INTO [dbo].[FooNotes] (FooId, Note) VALUES ('blah....', 2);

UPDATE [dbo].[Foo] SET StatusType = 2 WHERE FooId = 3;
INSERT INTO [dbo].[FooNotes] (FooId, Note) VALUES ('blah....', 3);

ROLLBACK TRAN;

Dapper를 통해이 작업을 수행 할 수 있습니까?

참고 : TRAN 이이를 어렵게 만들면이를 삭제할 수 있습니다.

수락 된 답변

Dapper는 쿼리를 내부적으로 변경하는 데 최소한의 지원 만 있습니다 ( IN , 리터럴 인젝션 및 일부 OPTION / UNKNOWN 개조에 대한 목록 확장을 지원합니다. 여기에 두 가지 옵션이 있습니다.

  1. StringBuilder 를 사용하여 실행할 수있는 단일 대형 작업을 만들 수 있습니다 (사전을 통해 매개 변수화 할 수 있음)
  2. 트랜잭션을 TSQL 대신 ADO.NET으로 이동

후자의 경우, 아마도 다음과 같습니다.

using(var tran = conn.BeginTransaction())
{
    try
    {
        conn.Execute(@"
UPDATE [dbo].[Foo] SET StatusType = 2 WHERE FooId = @id;
INSERT INTO [dbo].[FooNotes] (FooId, Note) VALUES ('blah....', @id);",
            fooIds.Select(id => new { id }), transaction: tran);
    }
    finally // in this example, we always want to rollback
    {
        tran.Rollback();
    }
}

인기 답변

당신은 다음과 같이 할 수 있습니다 :

using (var connection = new SqlConnection(yourConnectionString))
{
    connection.Open();
    using (var tx = connection.BeginTransaction())
    {
        foreach (var fooId in fooIds)
        {
            connection.Execute("UPDATE [dbo].[Foo] SET StatusType = 2 WHERE FooId = @id; INSERT INTO [dbo].[FooNotes] (FooId, Note) VALUES ('blah....', @id);", new {id = fooId}, tx);
        }

        tx.Rollback();
    }
}


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