Большой Воронежский Форум
» Программирование>ADO запрос из 1С к MS SQL Server, ошибка, если в строке запроса есть оператор print
zagrr 10:43 31.12.2009
Приветствую местное комьюнити.

Возникла следующая проблема.
Имеем:
среда разработки 1С7
Необходимо
сделать ADO запрос к MS SQL Server 2005 и вернуть в 1С результат запроса.

Проблема:
Если в тексте запроса есть print или есть вызов хранимой процедуры, которая содержит в своем коде print, то рекордсет не возвращается.

Простой пример.
Connection = СоздатьОбъект("ADODB.Connection");
СтрокаПодключения = "Provider=SQLOLEDB.1......
Connection .Open( СтрокаПодключения );

СтрокаЗапроса = "
|print '123'
|select '1'
|";
...
RecordSet = Connection.Execute(СтрокаЗапроса..)
..
Cообщить(RecordSet.Fields(0).Value);

При выполнении 1С ругается, в данном случае так:
ADODB.Recordset: Не удается найти объект в семействе, соответствующий требуемому имени или порядковому номеру.

Если print закомментировать, то отработает успешно, вернет 1
Вопрос: как победить? [Ответ]
Yandex 11:42 31.12.2009

Сообщение от :
СтрокаЗапроса = "
|print '123'
|select '1'
|";

Я конечно 1С в глаза не видел, да и MS SQL давно не щупал, но вот именно приведенный выше код получается эквивалентым SQL:
print 123 select ...
Ясен пень, нифига он работать не должен.

Варианты, которые я бы попробовал в первую очередь:
1. Поставить ; после 123: "print '123';"
2. Завернуть запрос в T-SQL процедуру, которая возвращает RecordSet и print-ит что надо. Вызывал бы процедуру из 1C. [Ответ]
DimmaN 14:55 31.12.2009
Yandex, не в этом дело.


zagrr, может проблма в том, что возвращаются два рекордсета? [Ответ]
Yandex 15:07 31.12.2009
DimmaN, ну может быть.
Как вариант еще местами поменять select и print. [Ответ]
DimmaN 15:43 31.12.2009
Yandex, не, тут не в sql дело. Он же говорит, что проблема в хранимках тоже есть, а уж там и селектов и принтов напихать можно в каком угодно порядке.

Ех, АДо я пользовал слишком давно. Вообще, насколько я помню, все сообщения выводятся в коллекцию еррорс коннекшена, так что насчет двух рекордсетов - это я наврал скорее всего. А что вернет RecordSet.RecordCount и RecordSet.Fields.Count?

А если запрос написать так: set nocount on print '123' select '1' ? [Ответ]
дядя Дима 16:39 31.12.2009
а зачем тебе принт то тут нужен? [Ответ]
zagrr 18:40 03.01.2010

Сообщение от Yandex:
2. Завернуть запрос в T-SQL процедуру, которая возвращает RecordSet и print-ит что надо. Вызывал бы процедуру из 1C.

SQL сервера не наши, соотв. ничего своего создавать там не можем.

Сообщение от DimmaN:
А если запрос написать так: set nocount on print '123' select '1' ?

пробовал, однокуйственно)))

Сообщение от DimmaN:
А что вернет RecordSet.RecordCount и RecordSet.Fields.Count?

хм...идею понял, завтра проверю на работе, отпишусь


Сообщение от дядя Дима:
а зачем тебе принт то тут нужен?

для примера, чтоб показать, что print вызывает ошибку...в реальном коде вызываются хранимые процедуры, в тесте которых есть print [Ответ]
zagrr 12:09 04.01.2010

Сообщение от DimmaN:
А что вернет RecordSet.RecordCount и RecordSet.Fields.Count?

да не, ничо не возвращает...
Сообщить(RecordSet.RecordCount);
ADODB.Recordset: Операция не допускается, если объект закрыт.
[Ответ]
zagrr 15:07 04.01.2010
короч допер я

каждый принт/селект это свой рекордсет
если рекордсет с селектом то он открытый.если с принтом то закрытый
т.е. нада как то так

статус = RecordSet.State
Если статус <> 1 тогда
recordset = recordset.Nextrecordset()

и так в цикле..до тех пор пока не наткнетесб на статус = 1, это и будет результатом селекта
правда возникла другая проблема - если в тексте запроса неск.селектов...как получить результат последнего селекта в запросе...
кое как выкрутился..через жопу))) [Ответ]
Вверх