System.Data.SqlClient传递List<int>至表值参数时转换失败求助
解决System.Data.SqlClient传递List到用户定义表类型参数的问题
问题根源
你遇到的错误是因为System.Data.SqlClient不支持直接将普通IEnumerable<int>作为表值参数的Value。微软文档中提到的支持IEnumerable<T>,特指的是IEnumerable<SqlDataRecord>,而非基础类型的枚举集合。
可行的转换方法
方法1:转换为DataTable(直观易理解)
把List
var dataTable = new DataTable(); dataTable.Columns.Add("i", typeof(int)); // 列名需与用户定义表类型一致 foreach (int num in myList) { dataTable.Rows.Add(num); } param2.SqlDBType = SqlDbType.Structured; param2.TypeName = "MYDB.dbo.IntegerList"; param2.Value = dataTable;
方法2:使用IEnumerable(高效低内存)
无需创建完整DataTable,直接生成符合要求的SqlDataRecord枚举,适合大数据量场景:
IEnumerable<SqlDataRecord> GenerateSqlRecords(List<int> list) { // 定义与用户表类型匹配的字段元数据 var fieldMeta = new SqlMetaData("i", SqlDbType.Int); foreach (int num in list) { var record = new SqlDataRecord(fieldMeta); record.SetInt32(0, num); yield return record; } } // 赋值参数 param2.SqlDBType = SqlDbType.Structured; param2.TypeName = "MYDB.dbo.IntegerList"; param2.Value = GenerateSqlRecords(myList);
方法3:封装为扩展方法(复用性强)
把转换逻辑封装成扩展方法,方便后续重复调用:
public static IEnumerable<SqlDataRecord> ToTableValueParam(this IEnumerable<int> intList) { var fieldMeta = new SqlMetaData("i", SqlDbType.Int); foreach (int num in intList) { var record = new SqlDataRecord(fieldMeta); record.SetInt32(0, num); yield return record; } } // 使用示例 param2.Value = myList.ToTableValueParam();
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

