2017-02-28 42 views
1

我很難理解正確的Dapper語法,以便將包含TableValueParameter(TVP)以及其他參數的參數傳遞給存儲過程。我的代碼的簡化版本:Dapper存儲過程包括TableValueParameter

CLASS

public class GalleryViewModel 
{ 
    public string GalleryName { get; set; } 
    public string Category { get; set; } 
    public IEnumerable<Image> Images { get; set; } 
} 

public class Image 
{ 
    public string FileName { get; set; } 
    public int Order { get; set; } 
} 

C#代碼段

var param = new DynamicParameters(); 
param.Add("@Images", model.Images);//TVP 
param.Add("@GalleryName", model.GalleryName); 
param.Add("@Category", model.Category); 

connection.Execute("CreateGallery", param, commandType: CommandType.StoredProcedure); 

SQL片段

--Create table type 
CREATE TYPE GalleryImageType AS TABLE 
( 
    FileName NVARCHAR(64), 
    Order  INT 
) 
GO 

CREATE PROCEDURE [dbo].[CreateGallery] 
    @Images    GalleryImageType READONLY, 
    @GalleryName  NVARCHAR(32), 
    @Category   NVARCHAR(32) 
AS 
-- SPROC contents here.... 
+0

路過的IEnumerable 相反的,你需要提供一個DataTable類型,只需創建和使用viewmodel.images填充一個DataTable,並通過數據表作爲命令的參數。 – Aldo

回答

3

ü瑟DataTable的,而不是IEnumerable的實例:

DataTable dt = new DataTable(); 
dt.Columns.Add("FileName"); 
dt.Columns.Add("Order"); 

foreach (var image in viewmodel.Images) 
{ 
    dt.Rows.Add(image.FileName, image.Order); 
} 

var param = new DynamicParameters(); 
param.Add("@Images", dt);//TVP 
param.Add("@GalleryName", model.GalleryName); 
param.Add("@Category", model.Category); 

connection.Execute("CreateGallery", param, commandType: CommandType.StoredProcedure); 
+0

謝謝,這正是需要的。 – PixelPaul