如何在C#中通过受限方法向存储过程传递表值参数
解决C#中通过哈希表传递表值参数的问题
既然你没法直接在代码里指定SqlDbType,但可以利用自定义ExecQuery方法对SqlParameter对象的支持来绕过这个限制。核心思路是手动创建配置好的SqlParameter对象(指定表值参数的类型信息),然后把这个对象作为值存入哈希表,而不是直接放DataTable。
具体步骤
- 首先确认你的数据库中对应表值参数的用户定义表类型名称,比如假设你的存储过程
ADC_SPCREATE_BULK_SUBDIV_DISCOUNT使用的表类型是dbo.SubDivisionDiscountTableType(请替换成你实际的类型名)。 - 创建
SqlParameter对象,明确设置它的SqlDbType.Structured类型和对应的数据库表类型名称。 - 将这个配置好的参数对象添加到哈希表中,而不是直接添加
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
相关产品推荐
相关产品推荐

