c# - 包含 TableValueParameter 的 Dapper 存储过程

标签 c# sql .net dapper

我很难理解将包含 TableValueParameter(TVP) 的参数与其他参数一起传递给存储过程的正确 Dapper 语法。我的代码的简化版本:

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....

最佳答案

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

关于c# - 包含 TableValueParameter 的 Dapper 存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42498629/

相关文章:

c# - linq-sql 中的安全查询?

c# - 如何在 C# 中将 dd/mm 转换为 Mysql 日期时间格式

SQL - 更新表,以便在给定另一列的键的情况下对一列求和

sql - INNER JOIN on UPDATE with WHERE 更新 Postgres 中的每条记录

sql - 计算 Spark SQL 中两行之间列值的差异

c# - WPF DataGrid ItemsSource 问题

c# - 异步网络服务调用。没有可用的(开始...)方法!

c# - 运行时的 .NET CLR/Framework 检测

c# - 您将如何重构此 LINQ 代码?

c# - Canvas 作为 ListBox ItemTemplate