2014-10-07 89 views
13

我有一個過程,需要在表值參數,與人相處:使用Dapper.TVP TableValueParameter與其他參數

CREATE PROCEDURE [dbo].[Update_Records] 
    @currentYear INT, 
    @country INT, 
    @records Record_Table_Type READONLY 
AS 

,我試圖用Dapper.TVP調用此。

這裏是我到目前爲止的代碼:

 var recordsParameter = new List<SqlDataRecord>(); 

     // This metadata matches 'Record_Table_Type' in the Database 
     var recordsMetaData = new[] 
     { 
      new SqlMetaData("OriginalValue", SqlDbType.Decimal, 19, 4), 
      new SqlMetaData("NewValue", SqlDbType.Decimal, 19, 4), 
      new SqlMetaData("NewPercent", SqlDbType.Decimal, 7, 2), 
     }; 

     foreach (var r in records) 
     { 
      var record = new SqlDataRecord(recordsMetaData); 
      record.SetDecimal(0, r.OriginalValue); 
      record.SetDecimal(1, r.NewValue); 
      record.SetDecimal(2, r.NewPercent); 
      recordsParameter.Add(record); 
     } 

     var spParams = new DynamicParameters(new 
     { 
      currentYear = filter.currentYear, 
      country = filter.country, 
     }); 

     var recordsParam = new TableValueParameter("@records", "Record_Table_Type", recordsParameter); 

     using (var connection = ConnectionFactory.GetConnection()) 
     { 
      connection.Execute("Update_Records", ???, commandType: CommandType.StoredProcedure); 
     } 

我的問題是我如何通過這兩組參數的程序在調用短小精悍Execute()

我曾嘗試:

var spParams = new DynamicParameters(new 
{ 
    currentYear = filter.currentYear, 
    country = filter.country, 
    records = new TableValueParameter("@records", "Record_Table_Type", recordsParameter); 
}); 

connection.Execute("Update_Records", spParams, commandType: CommandType.StoredProcedure); 

connection.Execute("Update_Records", new Object[] { spParams, recordsParam }, commandType: CommandType.StoredProcedure); 

兩個呼叫的過程,但將一個空表參數(SELECT COUNT(*) FROM @records返回0)

我似乎無法找到任何實際文檔或Dapper.TVP的來源,因此整個事情是非常混亂,並且.Execute()的第二個參數只是一個dynamic s o再次不告訴我我能做什麼,也不能通過它。

任何想法?

+0

相關:http://stackoverflow.com/a/24633764/23354 – 2014-10-08 06:50:24

回答

10

我在移動和可能產生誤解的問題,但是這應該只是:

DataTable records = ... 
connection.Execute("Update_Records", 
    new { 
     currentYear = filter.currentYear, 
     country = filter.country, 
     records 
    }, 
    commandType: CommandType.StoredProcedure 
); 
+0

是的,這就是我最終做的。我最初的搜索發現了Dapper.TVP NuGet包,這似乎不再需要(或維護)了。謝謝! – CodingWithSpike 2014-10-08 01:13:41

+0

@CodingWithSpike事實上,它不應該再需要 - 小巧玲瓏在內部處理TVP;至於維護:我不知道 - 這不是我的; p – 2014-10-08 06:49:48

5

基於馬克Gravell這裏的答案:Does Dapper support SQL 2008 Table-Valued Parameters?

我改變了我的代碼不再使用Dapper.TVP,而是隻使用一個DataTable這樣的代碼是現在:

 var recordsTable = new DataTable(); 
     recordsTable.Columns.Add("NewValue", typeof(Decimal)); 
     foreach (var netRevenue in records) 
     { 
      var row = recordsTable.NewRow(); 
      row[0] = netRevenue.NewValue; 
      recordsTable.Rows.Add(row); 
     } 
     recordsTable.EndLoadData(); 

     var spParams = new DynamicParameters(new 
     { 
      currentYear = filter.currentYear, 
      country = filter.country, 
      records = recordsTable.AsTableValuedParameter("Record_Table_Type") 
     }); 

     using (var connection = ConnectionFactory.GetConnection()) 
     { 
      connection.Execute("Update_Records", spParams, commandType: CommandType.StoredProcedure); 
     } 

這作品。

+0

您不應該實際上需要As ...這裏:因爲sproc定義用戶定義的類型,它應該沒有指定它的工作。 – 2014-10-07 22:01:42

+0

如果您使用的是動態SQL,那麼您可以這樣做。 – 2015-02-19 00:03:03

2

會是什麼替代的DataTable類型,萬一我想在asp.net使用它核心,因爲目前不支持DataTable ...

+0

你知道嗎?如果你有這個問題,你能提供一個答案的鏈接嗎? – Jon49 2017-03-31 17:38:16

+0

你必須使用SqlDataRecords https://github.com/StackExchange/Dapper/blob/61e965eed900355e0dbd27771d6469248d798293/Dapper.Tests/Tests.Parameters.cs#L167 – Jon49 2017-04-12 22:31:28