You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#中通过Dapper调用带表值参数的存储过程?

调用SQL Server表值类型存储过程的C#实现方案

Dapper 实现方案

首先定义与表值类型dbo.StringList对应的实体类:

public class StringListItem
{
    public string Item1 { get; set; }
}

接着通过Dapper调用存储过程,利用其自带的表值参数扩展方法处理映射:

using (var connection = new SqlConnection("你的数据库连接字符串"))
{
    // 准备待传入的列表数据
    var fields = new List<StringListItem>
    {
        new StringListItem { Item1 = "示例值1" },
        new StringListItem { Item1 = "示例值2" }
    };

    // 转换为符合表值类型要求的DataTable
    var tvpDataTable = new DataTable();
    tvpDataTable.Columns.Add("Item1", typeof(string));
    foreach (var item in fields)
    {
        tvpDataTable.Rows.Add(item.Item1);
    }

    // 调用存储过程并获取结果
    var queryResult = connection.Query<你的返回实体类型>(
        "dbo.Getdata",
        new { Fields = tvpDataTable.AsTableValuedParameter("dbo.StringList") },
        commandType: CommandType.StoredProcedure
    );
}

说明:AsTableValuedParameter是Dapper内置的扩展方法,需确保使用最新稳定版Dapper,它会自动完成表值参数与SQL Server类型的绑定。

原生ADO.NET 实现方案

如果不想依赖Dapper,直接用ADO.NET也能快速实现:

using (var connection = new SqlConnection("你的数据库连接字符串"))
{
    connection.Open();

    var fieldValues = new List<string> { "示例值1", "示例值2" };

    // 构造匹配表值类型的DataTable
    var tvpDataTable = new DataTable();
    tvpDataTable.Columns.Add("Item1", typeof(string));
    foreach (var value in fieldValues)
    {
        tvpDataTable.Rows.Add(value);
    }

    using (var command = new SqlCommand("dbo.Getdata", connection))
    {
        command.CommandType = CommandType.StoredProcedure;

        // 添加表值类型参数,指定SQL Server端的类型名称
        var tvpParam = command.Parameters.Add("@Fields", SqlDbType.Structured);
        tvpParam.Value = tvpDataTable;
        tvpParam.TypeName = "dbo.StringList";

        // 执行并处理返回结果
        using (var reader = command.ExecuteReader())
        {
            while (reader.Read())
            {
                // 根据实际需求读取数据,例如映射到实体对象
                // var entity = new 你的返回实体类型 { Prop = reader["ColumnName"].ToString() };
            }
        }
    }
}

注意事项

  • 确保DataTable的列名与SQL Server表值类型dbo.StringList的列名完全一致(此处为Item1)
  • 数据库连接字符串需正确配置,具备访问目标数据库及存储过程的权限

内容的提问来源于stack exchange,提问作者user19447837

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 06:54:35