如何在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
相关产品推荐
相关产品推荐

