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


Обработка позволяет делать запросы к базам 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

28 Comments

  1. mitiyV

    А в чем разница с консолью запросов ADO? http://infostart.ru/public/62737/

    Reply
  2. BorisMor

    (1) mitiyV,

    В первую очередь это все таки «обертка-обработка» для выполнения запросов из кода.

    Сама консоль запроса — это вторично т.к. была сделана для тестирования функций запроса.

    Reply
  3. Serj1C

    (2) Не проще было сделать обертку для обработки (1)? = )

    Reply
  4. BorisMor

    (3) Serj1C,

    Не понял что вы имели в виду…

    Сделал обработку что бы при необходимости вызвать ее из кода (предварительно добавив в конфигурацию) и выполнить запрос к MS SQL. Конечно можно было сделать модуль с 10-ком функциями, но по мне, в виде отдельной обработке понятней.

    Reply
  5. Misanets

    Думаю, надо бы добавить возможность доменной авторизации аутентификации средствами ОС на скуле.

    Reply
  6. BorisMor

    (5) Misanets,

    Добавил. Но требуется проверка. У меня авторизация через sa.

    Reply
  7. Misanets

    (6) не работает.

    Если аутентификация ОС, строка соединения следующая:

    «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=<БД>»

    И в процедуру АвторизацияОСПриИзменении() добавить строку:

    ЭлементыФормы.Пароль.Доступность = Не АвторизацияОС;

    Reply
  8. BorisMor

    (7) Misanets, Поправил. Спасибо за наглядность пояснения.

    Reply
  9. petrov_al

    Спасибо автору полезная вещь, появилась почва для фантазий…

    Reply
  10. mike581

    Автору респект. Иногда приятнее написать запрос непосредственно на MS SQL.

    Особенно если INSERT, SET, UPDATE и т.д. нужны.

    Reply
  11. avhrst

    Интересно наблюдать как программеры по 1С движутся к концепции от которой 10 лет назад отказались: База данных — GUI пользователя (желательно web), 1Сv7 была и базой данных (DBF) и апликейшен сервером, v8.1 «разрешили» в базу напрямую ходить, v8.2 практически стал апликейшен сервером (Middleware) , и от базы данных отстали. А дальше что? 1С v9 — кеширующий web сервер ?

    Reply
  12. aximo

    интересно, только вместо йп, надо писать сетевое имя, мне кажется

    Reply
  13. Lyns_owner

    Серьезный подход, однозначный плюс)

    Reply
  14. navi

    А запись можно делать?

    Reply
  15. BorisMor

    (14) navi,

    Можно)

    см. MSSQL_ВыполнитьЗапрос и База_ВыполнитьЗапрос

    Reply
  16. kiros

    Класс! У нас «Игра с огнем» на сервере не запускается, попробуем этот механизм! Спасибо.

    Reply
  17. K_A_O

    Как ни удивительно, мне придется повторить свой комментарий к другой обработке (http://forum.infostart.ru/forum24/topic29874/message336391/#message336391)

    —-

    Есть «ADO Demo» от Михайлова. Несмотря на 2004 год — там функционал поболе.

    http://1c.proclub.ru/modules/mydownloads/personal.php?cid=120&lid=2681

    —-

    Эта обработка хорошая, но у Михайлова возвращается типизированная таблица значений, которую можно использовать в дальнейшем в запросах.

    Reply
  18. BorisMor

    (17) K_A_O,

    У меня не консоль, а интерфейс для доступа до баз. Т.е. Вы можете использовать эту обработку в своем коде для доступа до баз. А консоль используется для тестирования связи.

    Спасибо за ссылки.

    Reply
  19. zfilin

    Однако, мне казалось, что ADO это уже универсальная обертка для доступа к любому типу баз данных, был бы драйвер и строка подключения.

    Reply
  20. frc

    (11) it.net,

    v8.1 «разрешили» в базу напрямую ходить

    когда и кто разрешил?

    Reply
  21. AlexO

    (18)

    с чего вдруг у вас указано подключение к MySQL? Вы намеренно ввводите в заблуждение, что ODBC-драйвер для подключения к MySQL совершенно не нужен, и достаточно подобного драйвера от MS SQL?

    Reply
  22. BorisMor

    (21) AlexO,

    В диалоге подключения дается ссылка на ADODB драйвер для MySQL и SQLite.

    Reply
  23. AlexO

    (22)

    в смысле, «ссылка в диалоге подключения»? в самой статье написано правильно, но только по SQLite и MS SQL, про MySQL надо тогда аналогично дополнить…

    Reply
  24. Boudybuilder

    ТекстЗапроса = «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();

    КонецЕсли;

    Я тут шаманю , но никак получить список таблиц не могу…

    Прийдется качать обработки и смореть на примере.

    Reply
  25. Boudybuilder

    если у пользователя нет никаких привилегий для таблицы, таблица не будет показана в результатах команды SHOW TABLES или mysqlshow db_name.

    это о каких привилегиях идет тут речь ,что то я не пойму…

    Reply
  26. PrinzOfMunchen

    А почему обязательно подключаться через ADO? Можно же воспользоваться внешними источниками данных…И из обычной консоли запросов уже писать запросы к БД(в том числе удаленных) на языке запросов 1С?

    Reply
  27. HEKPOH

    (26) без вызова хранимых процедур и кучи функций SQL 🙁

    Это во-первых.

    А во-вторых, исключительно SELECT.

    Так что, манипулирование данными с помощью этой обработки и «ВЫБРАТЬ» посредством внешних источников данных — разные вещи

    Reply
  28. sashulyT

    При подключение в SQLite из 8.3 вылетает ошибка:

    «{ВнешняяОбработка.ADODB.МодульОбъекта(204)}: Ошибка при установке значения атрибута контекста (ActiveConnection): Произошла исключительная ситуация (Microsoft OLE DB Provider for ODBC Drivers): [Microsoft][Диспетчер драйверов ODBC] Источник данных не найден и не указан драйвер, используемый по умолчанию»

    Reply

Leave a Comment

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