2017-02-28 2 views
1

다른 매개 변수와 함께 TableValueParameter (TVP)를 포함하는 매개 변수를 저장 프로 시저에 전달하는 데 올바른 Dapper 구문을 이해하는 데 어려움이 있습니다. 내 코드의 단순화 된 버전 :TableValueParameter를 포함하는 Dapper 저장 프로 시저

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을 채울하고 명령의 매개 변수로 DataTable을 통과해야합니다. – Aldo

답변

3

U 대신를 IEnumerable의 DataTable의 인스턴스를 SE는 :

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