Получение XML файла с SQL Server средствами ADODB

В статье описано, как получать XML файл, сгенерированный SQL Server, средствами ADODB.
Обработка написана на обычных формах, тестировалась на платформе 8.12.1685.

Возникла передо мной задача обработкой в 1С получить XML, сгенерированный запросом с иcпользованием FOR XML RAW и FOR XML AUTO.

Есть запрос, который генерирует XML файл на SQL сервере. Его нужно было записать в файл, затем обработать.

В статье для примера я сделал запрос, который не связан с данными из базы "SELECT ‘1234567890’ as num1, ‘abcdefghijklmmopqrstuvwxyz’ as str1, ‘абвгдеёжзиклмнопрстуфхцчшщьъэюя’ as str2  for xml raw"

Сначала я использовал стандартную схему с использованием ADODB.Recordset. Дело в том, что XML так получать можно, читая Recordset, и записывая его в текстовый файл, но почему-то начальные буквы слов на кириллице изменялись не различные символы. Я думал, что это проблемы с кодировкой. Перепробовал много вариантов, но решить проблему не удалось.  Желающие могут попробовать. 

Основной цикл получения данных через Recordset выглядит как обычно:

 Поток = Новый COMОбъект("ADODB.Stream");
Поток.Type = 2; //StreamTypeEnum.adTypeBinary = 1  StreamTypeEnum.adTypeText = 2
Поток.charset="UTF-8";
Поток.Open();

Пока не rs.eof() Цикл
rsval = rs.Fields(0).Value;
Поток.Write(rsval);
КонецЦикла;
Поток.SaveToFile(ПолноеИмяФайла, 2);  // Записать поток в файл

При получении XML таким способом на выходе в файле получаю строку "1234567890ד   abcdefghijklmmopqrstuvwxyzד   אבגדהו¸זחטךכלםמןנסעףפץצקרש?422;ת?423;?424;?425;C", что явно не соответствует исходному тексту.

Гуглил, читал MSDN, смотрел примеры на C#, VB и прочее и прочее, но так и не удавалось решить проблему. Я даже точно не могу привести источники, которые привели меня к решению проблемы. Но вот эта ветка форума была одной из последних: https://www.sql.ru/forum/717172/adodb-command-object-or-provider-is-not-capable-of-performing-requested-operation-800a0cb3

В результате предлагаю вашему вниманию функцию, которая читает XML с SQL сервера и пишет его в файл:

Функция ПолучитьДанные(cn) Экспорт

QueryText = "SELECT '1234567890' as num1, 'abcdefghijklmmopqrstuvwxyz' as str1, 'абвгдеёжзиклмнопрстуфхцчшщьъэюя' as str2  for xml raw";

myCommand = Новый COMОбъект("ADODB.Command");

objADOStream = Новый COMОбъект("ADODB.Stream");

adTypeText = 2;
objADOStream.Type = adTypeText;
objADOStream.Charset = "UTF-8";
objADOStream.Open();

myCommand.ActiveConnection = cn;
myCommand.Properties("Output stream").Value = objADOStream; // Output stream связываем с ADODB потоком

adExecuteStream = 1024;

myCommand.CommandText = QueryText;
myCommand.CommandType = 1; //adCmdText
myCommand.Execute(QueryText, 0, adExecuteStream); // Передать поток adExecuteStream - Это важно!

objADOStream.SaveToFile(ПутьКФайлу, 2);

objADOStream.Close();

Сообщить("Файл записан:" +ПутьКФайлу);

КонецФункции

На вход в переменной "cn" передается установленное соединение (ADODB.Connection).

Прошу обратить особое внимание, что поток (objADOStream) два раза передается в команду.

Внимание! Для тех, кто скачает обработку, параметры подключение к SQL серверу описаны в функции GetSQLServerConnection() в модуле обработки.

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *