Запросы к 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
.epf 27,70Kb
07.10.12
347
.epf 27,70Kb 347 Скачать

См. также

Добавить вознаграждение
Комментарии
1. Дима (mitiyV) 6 30.05.12 12:20 Сейчас в теме
А в чем разница с консолью запросов ADO? http://infostart.ru/public/62737/
2. Борис Моренко (BorisMor) 285 30.05.12 12:35 Сейчас в теме
(1) mitiyV,
В первую очередь это все таки "обертка-обработка" для выполнения запросов из кода.
Сама консоль запроса - это вторично т.к. была сделана для тестирования функций запроса.
3. Serj (Serj1C) 458 30.05.12 13:33 Сейчас в теме
(2) Не проще было сделать обертку для обработки (1)? = )
4. Борис Моренко (BorisMor) 285 30.05.12 14:41 Сейчас в теме
(3) Serj1C,
Не понял что вы имели в виду...
Сделал обработку что бы при необходимости вызвать ее из кода (предварительно добавив в конфигурацию) и выполнить запрос к MS SQL. Конечно можно было сделать модуль с 10-ком функциями, но по мне, в виде отдельной обработке понятней.
5. Alex Misanets (Misanets) 331 31.05.12 10:10 Сейчас в теме
Думаю, надо бы добавить возможность доменной авторизации аутентификации средствами ОС на скуле.
6. Борис Моренко (BorisMor) 285 31.05.12 13:11 Сейчас в теме
(5) Misanets,
Добавил. Но требуется проверка. У меня авторизация через sa.
7. Alex Misanets (Misanets) 331 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) 285 31.05.12 20:28 Сейчас в теме
(7) Misanets, Поправил. Спасибо за наглядность пояснения.
9. al petrov (petrov_al) 10 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) 664 09.06.12 09:41 Сейчас в теме
интересно, только вместо йп, надо писать сетевое имя, мне кажется
13. Павел Никифоров (Lyns_owner) 261 10.06.12 23:10 Сейчас в теме
Серьезный подход, однозначный плюс)
14. Ivan Migov (navi) 12.06.12 14:07 Сейчас в теме
15. Борис Моренко (BorisMor) 285 16.07.12 14:59 Сейчас в теме
(14) navi,
Можно)
см. MSSQL_ВыполнитьЗапрос и База_ВыполнитьЗапрос
16. Кирилл (kiros) 49 16.07.12 16:06 Сейчас в теме
Класс! У нас "Игра с огнем" на сервере не запускается, попробуем этот механизм! Спасибо.
17. Андрей Крутских (K_A_O) 478 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) 285 17.07.12 13:20 Сейчас в теме
(17) K_A_O,
У меня не консоль, а интерфейс для доступа до баз. Т.е. Вы можете использовать эту обработку в своем коде для доступа до баз. А консоль используется для тестирования связи.
Спасибо за ссылки.
19. Александр Лапшин (zfilin) 1803 18.07.12 17:27 Сейчас в теме
Однако, мне казалось, что ADO это уже универсальная обертка для доступа к любому типу баз данных, был бы драйвер и строка подключения.
20. Ak A (frc) 18.07.12 17:41 Сейчас в теме
(11) it.net,
v8.1 "разрешили" в базу напрямую ходить

когда и кто разрешил?
21. Алекс Ю (AlexO) 113 11.10.12 14:09 Сейчас в теме
(18) BorisMor,
с чего вдруг у вас указано подключение к MySQL? Вы намеренно ввводите в заблуждение, что ODBC-драйвер для подключения к MySQL совершенно не нужен, и достаточно подобного драйвера от MS SQL?
22. Борис Моренко (BorisMor) 285 11.10.12 14:25 Сейчас в теме
(21) AlexO,
В диалоге подключения дается ссылка на ADODB драйвер для MySQL и SQLite.
23. Алекс Ю (AlexO) 113 11.10.12 14:41 Сейчас в теме
(22) BorisMor,
в смысле, "ссылка в диалоге подключения"? в самой статье написано правильно, но только по SQLite и MS SQL, про MySQL надо тогда аналогично дополнить...
24. Виталий Фантич (Boudybuilder) 50 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) 50 04.06.13 01:40 Сейчас в теме
если у пользователя нет никаких привилегий для таблицы, таблица не будет показана в результатах команды SHOW TABLES или mysqlshow db_name.

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