none
Как передать в хранимую прцедуру параметр табличного типа RRS feed

  • Вопрос

  • Здравствуйте!

    Задача: Передать из 1С в хранимую процедуру на MSSQLSERVER параметр табличного типа?

    в С# вот так замечательно передается параметр табличного типа и все работает:

    DataTable table = new DataTable(); //Далее заполняем таблицу, подключаемся SqlConnection connection1 = new SqlConnection(@"Data Source= .......

     SqlParameter p = new SqlParameter("@Name", SqlDbType.Structured);
    p.Value = table; //и ........

    В 1С вот так передаются обычные параметры:

    Подключение = Новый COMОбъект("ADODB.Connection");

    *******

    *******

    П1 = "Какое то значение для параметра обычных типов";

    Тип = "Числовое значение указывающее на тип"

    СтрДл1 =  СтрДлина(П1);

    P1 = Command.CreateParameter("@Param", Тип, 1, СтрДл1, П1);
    Command.Parameters.Append(P1);

    Не могу найти какое значение нужно указать в качестве Type в Command.CreateParameter для 1С!

    Или может причина в другом?

    В ADO есть такой тип?

    Может существует драгой подход?

    указывал

     П1 = Command.CreateParameter();
                     П1.Name = "@Name";
                     П1.Type = "SqlDbType.Structured"; //Именно в кавычках
                     П1.Value = table; // table - это ТаблицаЗначений 1С
    Выдает ошибку:

    Ошибка при установке значения атрибута контекста (Value)
                     П1.Value = table;
    по причине:
    Произошла исключительная ситуация (ADODB.Parameter): Аргументы имеют неверный тип, выходят за пределы допустимого диапазона или вступают в конфликт друг с другом.

    В обоих случаях table заполнена одинаковыми данными

    Передавать таблицу на сервер при помощи нескольких тысяч ИНСЕРТОВ накладно!

    Заранее благодарю за помощь!


    • Изменено mtdem 29 мая 2012 г. 14:34

Ответы

  • С TVP нельзя работать через ADODB. 

    Самым простым будет сериализовать данные в xml, binary или текстовую строку, сделать процедуру-обёртку с соответствующим параметром и дёргать уже её. Надо будет следить за длиной этого параметра и самостоятельно делить данные на несколько пакетов, если потребуется.

    Можно ещё извернуться и исследовать вопрос с интерфейсами для bulk insert в ADO, но тут я не готов навскидку сказать, будет ли результат.  

    Спасибо за совет!

    Но всетаки решил пойти проверенным способом:

                       RecordSet.AddNew();
                       RecordSet.Fields("ХХХХХ").Value = Значение1;
                       RecordSet.Fields("YYYYY").Value = Значение2;
                       ..............................
                     
                       RecordSet.Update();




    • Помечено в качестве ответа mtdem 31 мая 2012 г. 3:06
    • Изменено mtdem 31 мая 2012 г. 3:09

Все ответы

  • С TVP нельзя работать через ADODB. 

    Самым простым будет сериализовать данные в xml, binary или текстовую строку, сделать процедуру-обёртку с соответствующим параметром и дёргать уже её. Надо будет следить за длиной этого параметра и самостоятельно делить данные на несколько пакетов, если потребуется.

    Можно ещё извернуться и исследовать вопрос с интерфейсами для bulk insert в ADO, но тут я не готов навскидку сказать, будет ли результат.  

    • Предложено в качестве ответа Abolmasov Dmitry 30 мая 2012 г. 12:02
  • Не забудьте отметить ответ, если он решит вашу проблему, спасибо.


    Для связи [mail]

  • С TVP нельзя работать через ADODB. 

    Самым простым будет сериализовать данные в xml, binary или текстовую строку, сделать процедуру-обёртку с соответствующим параметром и дёргать уже её. Надо будет следить за длиной этого параметра и самостоятельно делить данные на несколько пакетов, если потребуется.

    Можно ещё извернуться и исследовать вопрос с интерфейсами для bulk insert в ADO, но тут я не готов навскидку сказать, будет ли результат.  

    Спасибо за совет!

    Но всетаки решил пойти проверенным способом:

                       RecordSet.AddNew();
                       RecordSet.Fields("ХХХХХ").Value = Значение1;
                       RecordSet.Fields("YYYYY").Value = Значение2;
                       ..............................
                     
                       RecordSet.Update();




    • Помечено в качестве ответа mtdem 31 мая 2012 г. 3:06
    • Изменено mtdem 31 мая 2012 г. 3:09