Параметризация запросов при использовании SQLOLEDB-провайдера Ключевые слова: Параметризация, запрос, SQLOLEDB, OLEDB
Не помню точно как(склероз), но считается, что параметризация запросов ускоряет время их выполнения. Сейчас появилась задача: показывать в 1С описания товаров, которые находились в сторонней базе в MS SQL Server. Запрос получился довольно тяжелым и если значения условий подставлялись в текст, то время выборки составляло порядка 14-25 секунд. Решил добавить параметры, долго парился, пока не научился - но результат того стоил: время выборки после параметризации составило 5-8 секунд. Теперь обо всем по порядку:
Параметр в тексте запроса объявляется символом «?» (вопрос), причем без имени параметра(я привык параметру задавать имя – и на этом попался). СКЛ-сервер сам преобразует текст, заменив знаки вопроса на «@Рi», где i – порядковый номер параметра в запросе.
Заполняем строку соединения:
ConnectString="Provider=SQLOLEDB; Data Source=" +ServerName+ ";DatabaseName="+ DSN +";Initial Catalog=" +DSN+ ";UID=" + UID+ ";PWD="+PWD;
где ServerName – имя(IP-адрес) СКЛ-Сервера,
DSN – имя базы данных
UID – имя пользователя для соединения(обычно sa)
PWD – пароль пользователя.
Объявляем и открываем соединение:
Соединение=CreateObject("ADODB.Connection");
Соединение.ConnectionTimeOut=600;
Попытка
Соединение.Open(ConnectString);
Исключение
Предупреждение("Не удалось соединиться с базой данных описаний товара!");
Сообщить(ОписаниеОшибки());
Возврат 0;
КонецПопытки;
Создаем объект команды:
Cmd=СоздатьОбъект("ADODB.Command");
Cmd.ActiveConnection=Соединение;
Cmd.CommandTimeOut=600;
Cmd.CommandType=1;//запрос на языке SQL
После чего повторяем столько раз, сколько есть параметров:
Пар = Cmd.CreateParameter(Name, Value_Type, Param_type, Param_Lenght, Param_Value);
Cmd.Parameters.Append(Пар);
Описание CreateParameter можно глянуть здесь: http://melan.gazinter.net/ADO&SQL&1C/commandcreation.htm или еще где найдете.
ВНИМАНИЕ! Имя параметра должно быть ПУСТЫМ (т.е. Name = «»).
Param_Lenght желательно задавать такого размера, какого размера поле в таблице.
Присваиваем текст запроса:
Cmd.Commandtext=СокрЛП(ТекстЗапроса);
и выполняем…
Закрываем соединение:
Соединение.Close();
|