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

System.Data.SqlClient传递List<int>至表值参数时转换失败求助

解决System.Data.SqlClient传递List到用户定义表类型参数的问题

问题根源

你遇到的错误是因为System.Data.SqlClient不支持直接将普通IEnumerable<int>作为表值参数的Value。微软文档中提到的支持IEnumerable<T>,特指的是IEnumerable<SqlDataRecord>,而非基础类型的枚举集合。

可行的转换方法

方法1:转换为DataTable(直观易理解)

把List转换成与用户定义表结构匹配的DataTable:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 01:32:12