Имя: Пароль:
1C
1С v8
ADODB.Connection Чтение двух результатов запросов
0 _Ramzes
 
02.09.14
09:18
Добрый день, Коллеги!
Реализую выгрузку в стороннюю базу для последующей передачи.

    Соединение = Новый COMОбъект("ADODB.Connection");
    Соединение.ConnectionString = СтрокаПодключения;
    Соединение.Open(СтрокаПодключения);
    RS = Новый COMОбъект("ADODB.Recordset");
    ТекстЗапроса = "DECLARE    @return_value int
|
|EXEC    @return_value = [dbo].[Zsp_openSession]
|
|SELECT    'Return Value' = @return_value";
        ТекстЗапроса = "EXEC Zsp_openSession";
        Resultat = RS.Open(ТекстЗапроса, Соединение);    
    Пока RS.EOF() = 0 Цикл


В SQL MS после выполнения запроса возвращаются 2 результата запроса
http://screencast.com/t/5AUpd6o7p
А в 1С через ADODB.Recordset доступен только первый результат выполнения хранимой процедуры. А значение переменной return_value недоступно.
Скажите возможно ли обратиться к двум результатам выполнения процедур?
1 ДенисЧ
 
02.09.14
09:23
recordset.next()
2 olegves
 
02.09.14
09:24
(0) а кто тебе не дает объединить результаты в один запрос, все равно ведь ты предварительно сохраняешь возвращаемое значение в переменную?
3 ДенисЧ
 
02.09.14
09:24
4 _Ramzes
 
02.09.14
10:23
(3)
А в какой момент использовать оператор RS.NextRecordset()?
Он возвращает у меня ComОбъект, однако для него я не могу использовать Пока RS.EOF()
    Соединение = Новый COMОбъект("ADODB.Connection");
    Соединение.ConnectionString = СтрокаПодключения;
    Соединение.Open(СтрокаПодключения);
        RS = Новый COMОбъект("ADODB.Recordset");
        RS.Open(ТекстЗапроса, Соединение);    
        МассивДляВозврата = Новый Массив();
        Счетчик = 0;
        Пока RS.EOF() = 0 Цикл
        СтруктураДанныхДляПередачи = Новый Структура();
        Для СчетчикПолей = 0 По RS.Fields.Count - 1 Цикл
            ТекущееПоле = RS.Fields(СчетчикПолей);
            СтруктураДанныхДляПередачи.Вставить(ОбработатьИмя(ТекущееПоле.Name), Формат(ТекущееПоле.Value, "ЧГ=0"));
        КонецЦикла;
        RS.MoveNext();    
        Счетчик = Счетчик + 1;
        МассивДляВозврата.Добавить(СтруктураДанныхДляПередачи);
    КонецЦикла;
    
    //Второй набор данных
    //RS.NextRecordset();
    
    RS.Close();
    Соединение.Close();
5 _Ramzes
 
02.09.14
10:27
(3)
Для примера уже тестирую вариант запроса
"select 1
|select 2
|select 3
|select 4
|select 5
|select 6
|select 7
|select 8
|select 9
|select 1
|select 2
|select 3
|select 4
|select 5
|select 6
|select 7
|select 8"
6 shuhard
 
02.09.14
10:29
(0) SET NOCOUNT ON попробуй
7 _Ramzes
 
02.09.14
10:37
(6) Это в текст запроса? Если да, то не помогло.
8 Serginio1
 
02.09.14
10:40
Функция ВыполнитьКомандуSQL(ТекстЗапроса) Экспорт
    ДанныеСервера=ПолучитьТекущийСерверИБазу();

    
ConnectionString ="DRIVER=SQL Server;
|UID=администратор;
|Network=DBMSSOCN;
|LANGUAGE=русский;
|DATABASE="+ДанныеСервера.Ref+";
|WSID="+ДанныеСервера.Srvr+";
|APP=Microsoft® Windows® Operating System;
|Trusted_Connection=Yes;
|SERVER="+ДанныеСервера.Srvr;

//Сообщить(СтрокаСоединенияИнформационнойБазы());
     Connection = Новый COMОбъект("ADODB.Connection");
    //ADO_Recordset = Новый COMОбъект("ADODB.Recordset");
    //ADO_Command = Новый COMОбъект("ADODB.Command");
     // ADO_Connection.
//    Соединение.ConnectionString = "DSN=" + ДСН + ";UID=" + УИД + ";PWD=" + ПВД;  
    Connection.ConnectionString = ConnectionString;
    Connection.CommandTimeOut=0;
    Connection.ConnectionTimeout = 0;
    Connection. CursorLocation= 3;
    Сообщить(Connection.ConnectionString);
    Connection.Open();

Command = Новый COMОбъект("ADODB.Command");
Command.ActiveConnection=Connection;
Command.CommandType = 1;
Command.CommandTimeout=0;

Command.CommandText=ТекстЗапроса;
//RecordSet = Новый COMОбъект("ADODB.RecordSet");
РекордСет=Command.Execute();

Резулт="";
Пока РекордСет<>неопределено Цикл
    Если РекордСет.Fields.Count>0 Тогда
        Поле=РекордСет.Fields(0);
        Стр=Поле.Name+" "+Поле.Value;
        Если ЗначениеЗаполнено(Резулт) тогда
            Резулт=Резулт+"
            |"+Стр
        иначе
            Резулт=Стр;
        КонецЕсли;
    КонецЕсли;
    РекордСет=РекордСет.NextRecordSet();
КонецЦикла;
Сообщить(Резулт);
Возврат  Резулт
КонецФункции
9 shuhard
 
02.09.14
10:49
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший