Передача табличных параметров в SP из C # - PullRequest
0 голосов
/ 22 мая 2018

Мне нужна помощь в передаче табличного параметра в хранимую процедуру.У нас есть слой, который не позволяет мне указать тип параметра или 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 (параметры добавляются в эту хэш-таблицу и используются)

Доступные перегрузки для ExecQuery:

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

Поскольку я ограничен в использовании этого метода,Я не могу передать SQLDbType в команду execute.Это можно обойти?

1 Ответ

0 голосов
/ 22 мая 2018

Вместо

        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
...