从C#传递表值参数到SP

时间:2018-05-22 12:29:23

标签: c# sql-server table-valued-parameters

我需要帮助将表值参数传递给存储过程。 我们有一个层阻止我在我的代码中指定参数类型或SqlDbType。

以下是代码:

DataTable dataTable = new DataTable();
try
{
    dataTable.Columns.AddRange(new DataColumn[9]
    {
        new DataColumn("ITEM_INDEX", Type.GetType("System.Int32")),
        new DataColumn("SUBDIV_ID", System.Type.GetType("System.Int32")),
        new DataColumn("DISC_STRT_TS",System.Type.GetType("System.String")),
        new DataColumn("DISC_END_TS", System.Type.GetType("System.String")),
        new DataColumn("DISC_PC", typeof(Decimal)),
        new DataColumn("DISC_SPEC_PC",typeof(Decimal)),
        new DataColumn("ASSOC_CLASS_CD", System.Type.GetType("System.String")),
        new DataColumn("BUSN_CD", System.Type.GetType("System.String")),
        new DataColumn("CREATED_BY",System.Type.GetType("System.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();
    objHt.Add("SUBDIVISIONDISCOUNT", dataTable);
    objDs = obj.ExecQuery("ADC_SPCREATE_BULK_SUBDIV_DISCOUNT", CommandType.StoredProcedure, objHt);

ExecQuery()是一个自定义方法,需要3个参数:

  1. 查询
  2. 命令类型
  3. Hashtable(参数添加到此 哈希表并使用)
  4. ExecQuery的可用重载:

    DataSet ExecQuery(string qryData, CommandType type, Hashtable paramTable);
    DataSet ExecQuery(string qryData, CommandType type, Hashtable paramTable, int optionalCmdTimeout);   
    

    由于我被限制使用此方法,因此无法将SQLDbType传递给execute命令。有没有解决的办法?

1 个答案:

答案 0 :(得分:0)

而不是

        objHt.Add("SUBDIVISIONDISCOUNT", dataTable);
        objDs = obj.ExecQuery("ADC_SPCREATE_BULK_SUBDIV_DISCOUNT", CommandType.StoredProcedure, objHt)

你必须使用

        objDs = obj.ExecQuery("ADC_SPCREATE_BULK_SUBDIV_DISCOUNT", CommandType.StoredProcedure, dataTable)

不要忘记创建类型并将其用作存储过程的参数

CREATE TYPE dbo.PersonType AS TABLE
(
    Name NVARCHAR(50), 
    Age INT
);

CREATE PROCEDURE dbo.InsertPerson
    @Person dbo.PersonType READONLY
AS
BEGIN
    --your code here
END