gifts2017

Запросы к MS SQL, SQLite, MySQL

Опубликовал Борис Моренко (BorisMor) в раздел Обмен - Обмен с другими системами

Обработка позволяет делать запросы к базам MS SQL, SQLite, MySQL через ADODB. Вы можете воспользоваться как консолью запросов, так и сделать запрос из кода.

Наглядный инструмент для обращения к SQL базам из 1С. Вы можете просто открыть обработку (тогда вам будет доступна консоль запросов), а можете сделать запрос из кода. Далее пример вызова из кода (если не встраивать в конфигурацию):

    ADODB = ВнешниеОбработки.Создать("c:\Обработки\ADODB.epf");
   
ADODB.База = "base_test";
   
ADODB.Сервер = "192.168.0.1";
   
ADODB.Пользователь = "sa";
   
ADODB.Пароль = "test_password";
   
ADODB.MSSQL_Подключение();

   
// Берем первую попавшуюся таблицу и делаем запрос
   
масТаблиц = ADODB.MSSQL_ПолучитьТаблицы();
   
ТекстЗапроса = "SELECT TOP 10 * FROM " + масТаблиц[0];
   
тзРезультат = ADODB.MSSQL_ВыполнитьЗапросИВернутьТаблицуЗначений(ТекстЗапроса);
   
тзРезультат.ВыбратьСтроку("Выборка");

У обработки есть следующие функции

  • MSSQL_Подключение  - подключится к базе
  • MSSQL_ВыполнитьЗапросИВернутьТаблицуЗначений — Делаем запрос к базе и полученный результат  преобразуем в  таблицу значений.
  • MSSQL_ВыполнитьЗапрос - выполем запрос. Можно воспользоваться для тех запросов которые ничего не возвращают.  Возвращает данные ADODB.RecordSet
  • MSSQL_РезульататЗапросВТаблицуЗначений - Разбирает ADODB.RecordSet в 1С таблицу значений.
  • MSSQL_ПолучитьТаблицы - возвращает массив с именами таблиц в MS SQL
  • СохранитьНастройки – сохраняем настройки подключения в XML файл
  • ПрочитатьНастройки – читаем настройки подключения из XML файла

Добавление от 16.07.2012

Была добавдена поддержка SQLite (ODBC драйвер).
Реквезит "ТекущийТипБазы" указывает с каким типом базы работаем. Поддерживает слежующие значения:

  • MSSQL
  • SQLITE

Добавленны новые функци:

  • SQLite_ПолучитьПоляТаблицы - Возвращает таблицу значений с информации по полям таблицы SQLite
  • SQLite_ПолучитьТаблицы - Возвращает имена таблиц сущесвующие в подключенной базе SQLite


Следующие функции могут использоваться как при работе с MS SQL так и с SQLite:

  • База_ВыполнитьЗапросИВернутьТаблицуЗначений - Выполянет запрос и результат запроса возвращает в таблицу значений
  • База_РезульататЗапросВТаблицуЗначений - На основе результата запроса (База_ВыполнитьЗапрос) создаем таблицу значений
  • База_ВыполнитьЗапрос - Выполянет запрос к базе
  • СелектЗапрос - создает select-запрос для опредленного типа базы

Добавление от 23.08.2012

Добавлена функция получения статистики количества записей во всех таблицах.

Добавление от 08.10.2012

Добавлена поддержка ODBC MySQL

Скачать файлы

Наименование Файл Версия Размер
ADODB.epf 345
.epf 27,70Kb
07.10.12
345
.epf 27,70Kb Скачать

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Дима (mitiyV) 30.05.12 12:20
А в чем разница с консолью запросов ADO? http://infostart.ru/public/62737/
2. Борис Моренко (BorisMor) 30.05.12 12:35
(1) mitiyV,
В первую очередь это все таки "обертка-обработка" для выполнения запросов из кода.
Сама консоль запроса - это вторично т.к. была сделана для тестирования функций запроса.
3. Serj (Serj1C) 30.05.12 13:33
(2) Не проще было сделать обертку для обработки (1)? = )
4. Борис Моренко (BorisMor) 30.05.12 14:41
(3) Serj1C,
Не понял что вы имели в виду...
Сделал обработку что бы при необходимости вызвать ее из кода (предварительно добавив в конфигурацию) и выполнить запрос к MS SQL. Конечно можно было сделать модуль с 10-ком функциями, но по мне, в виде отдельной обработке понятней.
5. Alex Misanets (Misanets) 31.05.12 10:10
Думаю, надо бы добавить возможность доменной авторизации аутентификации средствами ОС на скуле.
6. Борис Моренко (BorisMor) 31.05.12 13:11
(5) Misanets,
Добавил. Но требуется проверка. У меня авторизация через sa.
7. Alex Misanets (Misanets) 31.05.12 14:57
(6) BorisMor, не работает.
Если аутентификация ОС, строка соединения следующая:
"Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=True; Initial Catalog=<Таблица>;Data Source=<БД>"

Если стандартная:
"Provider=SQLOLEDB.1;Password=<Пароль>;Persist Security Info=True;User ID=<Логин>;Initial Catalog=<Таблица>;Data Source=<БД>"

И в процедуру АвторизацияОСПриИзменении() добавить строку:
ЭлементыФормы.Пароль.Доступность = Не АвторизацияОС;
8. Борис Моренко (BorisMor) 31.05.12 20:28
(7) Misanets, Поправил. Спасибо за наглядность пояснения.
9. al petrov (petrov_al) 01.06.12 12:36
Спасибо автору полезная вещь, появилась почва для фантазий...
10. Михаил Петров (mike581) 06.06.12 09:26
Автору респект. Иногда приятнее написать запрос непосредственно на MS SQL.
Особенно если INSERT, SET, UPDATE и т.д. нужны.
11. it.net (avhrst) 09.06.12 03:38
Интересно наблюдать как программеры по 1С движутся к концепции от которой 10 лет назад отказались: База данных - GUI пользователя (желательно web), 1Сv7 была и базой данных (DBF) и апликейшен сервером, v8.1 "разрешили" в базу напрямую ходить, v8.2 практически стал апликейшен сервером (Middleware) , и от базы данных отстали. А дальше что? 1С v9 - кеширующий web сервер ?
12. Дмитрий Никс (aximo) 09.06.12 09:41
интересно, только вместо йп, надо писать сетевое имя, мне кажется
13. Павел Никифоров (Lyns_owner) 10.06.12 23:10
Серьезный подход, однозначный плюс)
14. Ivan Migov (navi) 12.06.12 14:07
15. Борис Моренко (BorisMor) 16.07.12 14:59
(14) navi,
Можно)
см. MSSQL_ВыполнитьЗапрос и База_ВыполнитьЗапрос
16. Кирилл (kiros) 16.07.12 16:06
Класс! У нас "Игра с огнем" на сервере не запускается, попробуем этот механизм! Спасибо.
17. Андрей Крутских (K_A_O) 17.07.12 11:53
Как ни удивительно, мне придется повторить свой комментарий к другой обработке (http://forum.infostart.ru/forum24/topic29874/message336391/#message336391)

----
Есть "ADO Demo" от Михайлова. Несмотря на 2004 год - там функционал поболе.
http://1c.proclub.ru/modules/mydownloads/personal.php?cid=120&lid=2681
----

Эта обработка хорошая, но у Михайлова возвращается типизированная таблица значений, которую можно использовать в дальнейшем в запросах.
18. Борис Моренко (BorisMor) 17.07.12 13:20
(17) K_A_O,
У меня не консоль, а интерфейс для доступа до баз. Т.е. Вы можете использовать эту обработку в своем коде для доступа до баз. А консоль используется для тестирования связи.
Спасибо за ссылки.
19. Александр Лапшин (zfilin) 18.07.12 17:27
Однако, мне казалось, что ADO это уже универсальная обертка для доступа к любому типу баз данных, был бы драйвер и строка подключения.
20. Ak A (frc) 18.07.12 17:41
(11) it.net,
v8.1 "разрешили" в базу напрямую ходить

когда и кто разрешил?
21. Алекс Ю (AlexO) 11.10.12 14:09
(18) BorisMor,
с чего вдруг у вас указано подключение к MySQL? Вы намеренно ввводите в заблуждение, что ODBC-драйвер для подключения к MySQL совершенно не нужен, и достаточно подобного драйвера от MS SQL?
22. Борис Моренко (BorisMor) 11.10.12 14:25
(21) AlexO,
В диалоге подключения дается ссылка на ADODB драйвер для MySQL и SQLite.
23. Алекс Ю (AlexO) 11.10.12 14:41
(22) BorisMor,
в смысле, "ссылка в диалоге подключения"? в самой статье написано правильно, но только по SQLite и MS SQL, про MySQL надо тогда аналогично дополнить...
24. Виталий Фантич (Boudybuilder) 04.06.13 01:39
ТекстЗапроса = "SHOW TABLES";
// подключение к базе MySQL
Соединение = Новый COMОбъект("ADODB.Connection");
СтрокаСоединение = "DRIVER={MySQL ODBC 5.1 Driver};SERVER=;DataBase=;UID=;PWD="; //{MySQL ODBC 3.51 Driver}
Попытка
Соединение.Open(СтрокаСоединение);
Сообщить("Соединение установлено");
Соединено = Истина;
Исключение
Сообщить("Ошибка подключения к базе MySQL!", СтатусСообщения.Важное);
Сообщить(ОписаниеОшибки(), СтатусСообщения.Важное);
Соединено=Ложь;
Возврат;
КонецПопытки;

Если Соединено Тогда
SQLcmd = New COMОбъект("ADODB.Command");
SQLcmd.ActiveConnection = Соединение;
SQLcmd.CommandText = ТекстЗапроса;
тз = Новый ТаблицаЗначений;
мойЗапрос = Новый COMОбъект("ADODB.Recordset");
мойЗапрос.Open(SQLcmd);
КолвоКолонок = мойЗапрос.Fields.Count();

КонецЕсли;

Я тут шаманю , но никак получить список таблиц не могу...
Прийдется качать обработки и смореть на примере.
25. Виталий Фантич (Boudybuilder) 04.06.13 01:40
если у пользователя нет никаких привилегий для таблицы, таблица не будет показана в результатах команды SHOW TABLES или mysqlshow db_name.

это о каких привилегиях идет тут речь ,что то я не пойму...
26. Вадим Миляев (PrinzOfMunchen) 08.06.13 07:30
А почему обязательно подключаться через ADO? Можно же воспользоваться внешними источниками данных...И из обычной консоли запросов уже писать запросы к БД(в том числе удаленных) на языке запросов 1С?
27. Александр Чернышов (HEKPOH) 12.06.13 00:51
(26) без вызова хранимых процедур и кучи функций SQL :(
Это во-первых.
А во-вторых, исключительно SELECT.
Так что, манипулирование данными с помощью этой обработки и "ВЫБРАТЬ" посредством внешних источников данных - разные вещи
28. Александр (sashulyT) 27.01.16 14:51
При подключение в SQLite из 8.3 вылетает ошибка:
"{ВнешняяОбработка.ADODB.МодульОбъекта(204)}: Ошибка при установке значения атрибута контекста (ActiveConnection): Произошла исключительная ситуация (Microsoft OLE DB Provider for ODBC Drivers): [Microsoft][Диспетчер драйверов ODBC] Источник данных не найден и не указан драйвер, используемый по умолчанию"