2014-10-07 16 views
13

Tôi có một thủ tục mà mất trong một tham số bảng giá trị, cùng với những người khác:Sử dụng Dapper.TVP TableValueParameter với các thông số khác

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

và đang cố gắng để gọi đây với Dapper.TVP.

Dưới đây là đoạn code tôi có cho đến nay:

 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); 
     } 

Vấn đề của tôi là làm thế nào để tôi vượt qua cả bộ tham số cho các thủ tục trong các cuộc gọi đến Dapper Execute()?

Tôi đã thử:

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); 

Cả hai gọi thủ tục, nhưng vượt qua một tham số bảng rỗng (SELECT COUNT(*) FROM @records trả về 0)

tôi dường như không thể tìm thấy bất kỳ tài liệu hoặc nguồn tài liệu thực tế nào cho Dapper.TVP, do đó, toàn bộ điều rất khó hiểu và tham số thứ 2 là .Execute() chỉ là một dynamic s o một lần nữa không nói cho tôi biết tôi có thể làm gì và không thể vượt qua nó.

Bất kỳ ý tưởng nào?

+0

Related: http://stackoverflow.com/a/24633764/23354 –

Trả lời

10

tôi trên điện thoại di động và có thể hiểu lầm câu hỏi, nhưng điều này nên chỉ:

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

Vâng, đó là những gì tôi đã kết thúc. Tìm kiếm ban đầu của tôi đã bật gói Dapper.TVP NuGet, dường như không cần thiết (hoặc được duy trì?) Nữa. Cảm ơn! – CodingWithSpike

+0

@CodingWithSpike thực sự, nó không cần thiết nữa - dapper xử lý các TVP nội bộ; như đã được bảo trì: Tôi không biết - nó không phải của tôi, p –

5

Dựa trên một câu trả lời từ Mark Gravell đây: Does Dapper support SQL 2008 Table-Valued Parameters?

tôi đã thay đổi mã của tôi để không còn sử dụng Dapper.TVP và thay vào đó chỉ cần sử dụng một DataTable để mã bây giờ là:

 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); 
     } 

Và đây công trinh.

+0

Bạn không nên thực sự cần như ... ở đây: vì sproc định nghĩa loại do người dùng xác định, nó sẽ hoạt động mà không chỉ định nó. –

+0

Bạn làm gì nếu bạn đang sử dụng SQL động. –

2

Điều gì sẽ là sự thay thế cho các loại DataTable, chỉ trong trường hợp tôi muốn sử dụng nó trong asp.net cốt lõi vì không có hỗ trợ cho DataTable tại thời điểm này ...

+0

Bạn có hiểu điều này không? Bạn có thể cung cấp một liên kết đến câu trả lời nếu bạn đã làm? – Jon49

+0

Bạn phải sử dụng SqlDataRecords https://github.com/StackExchange/Dapper/blob/61e965eed900355e0dbd27771d6469248d798293/Dapper.Tests/Tests.Parameters.cs#L167 – Jon49

Các vấn đề liên quan