2015-03-19 25 views
3

我有以下SQL查詢:如何在.NET和Dapper.NET中執行這條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使這很難,我可以放棄。

回答

2

小巧玲瓏有改變內部查詢只有很少的支持(也支持IN列表擴展,文字注入,以及一些OPTION/UNKNOWN調整有兩種。選項在這裏:

  1. 使用StringBuilder來創建一個可以執行的單個大操作(這可以通過字典進行參數化)
  2. 移動交易ADO.NET,而不是TSQL

對於後者,或許是這樣的:

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(); 
    } 
} 
+1

嗯好吧 - 所以我試圖說服這個....所以這仍然使用Dapper,但tran是手動創建的(而不是在查詢中)由於短小精靈的使用而使用Dapper:sparkles:現有的連接? – 2015-03-19 22:27:24

+1

@ Pure.Krome不需要閃光燈 - 我們明確地將交易作爲參數傳入 – 2015-03-19 23:52:06

+0

嗯,是的,當我審查上面的代碼片段時,我錯過了最後一個參數。簡單 - 非常有意義。乾杯! :心:你的工作馬克 - 繼續奮鬥的好鬥:) :):歡呼聲: – 2015-03-20 04:01:24

1

你可以做這樣的事情:

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(); 
    } 
} 
+1

小ADO.NET滋擾:你不能'connection.BeginTransaction()'直到你'connection.Open()' – 2015-03-19 09:13:21

+0

@MarcGravell,修復。 – 2015-03-19 19:48:27

+0

這會做2 x'fooIds.Count'往返數據庫,而不是一次去數據庫? – 2015-03-19 22:25:19