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

如何在C#中通过受限方法向存储过程传递表值参数

解决C#中通过哈希表传递表值参数的问题

既然你没法直接在代码里指定SqlDbType,但可以利用自定义ExecQuery方法对SqlParameter对象的支持来绕过这个限制。核心思路是手动创建配置好的SqlParameter对象(指定表值参数的类型信息),然后把这个对象作为值存入哈希表,而不是直接放DataTable。

具体步骤

  1. 首先确认你的数据库中对应表值参数的用户定义表类型名称,比如假设你的存储过程ADC_SPCREATE_BULK_SUBDIV_DISCOUNT使用的表类型是dbo.SubDivisionDiscountTableType(请替换成你实际的类型名)。
  2. 创建SqlParameter对象,明确设置它的SqlDbType.Structured类型和对应的数据库表类型名称。
  3. 将这个配置好的参数对象添加到哈希表中,而不是直接添加DataTable。

修改后的代码示例

DataTable dataTable = new DataTable();
try
{
    dataTable.Columns.AddRange(new DataColumn[9] {
        new DataColumn("ITEM_INDEX", typeof(Int32)),
        new DataColumn("SUBDIV_ID", typeof(Int32)),
        new DataColumn("DISC_STRT_TS", typeof(String)),
        new DataColumn("DISC_END_TS", typeof(String)),
        new DataColumn("DISC_PC", typeof(Decimal)),
        new DataColumn("DISC_SPEC_PC", typeof(Decimal)),
        new DataColumn("ASSOC_CLASS_CD", typeof(String)),
        new DataColumn("BUSN_CD", typeof(String)),
        new DataColumn("CREATED_BY", typeof(String))
    });

    foreach (var item in subDivisionDiscounts)
    {
        dataTable.Rows.Add(
            item.ItemIndex,
            item.SubDiv,
            item.FromDate,
            item.ToDate,
            item.DiscountPercent,
            item.SpecialDiscountPercent,
            item.AssociateClassCode,
            item.BusinessLineCode,
            item.CreatedBy);
    }

    objHt.Clear();
    
    // 创建表值参数并配置
    SqlParameter tvpParam = new SqlParameter();
    tvpParam.ParameterName = "SUBDIVISIONDISCOUNT";
    tvpParam.SqlDbType = SqlDbType.Structured;
    tvpParam.TypeName = "dbo.SubDivisionDiscountTableType"; // 替换为你数据库中的实际表类型名
    tvpParam.Value = dataTable;

    // 将配置好的参数对象加入哈希表
    objHt.Add(tvpParam.ParameterName, tvpParam);

    objDs = obj.ExecQuery("ADC_SPCREATE_BULK_SUBDIV_DISCOUNT", CommandType.StoredProcedure, objHt);
}
catch (Exception ex)
{
    // 别忘了异常处理
    throw;
}

为什么这个方法可行?

大多数自定义的DAL封装方法(比如你的ExecQuery)在处理哈希表参数时,会检查值的类型:如果值是SqlParameter对象,就会直接将这个参数添加到SqlCommand的参数集合中,而不是自动生成新的参数。这样就能让命令正确识别这是一个表值参数,同时关联到数据库中对应的用户定义表类型。

如果你的ExecQuery方法内部没有处理SqlParameter类型的逻辑,那可能需要稍微调整封装方法,但根据常规的DAL设计,这种场景是被支持的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:26:02