Ruslan Polupan
Ruslan PolupanJuly 12, 2017, 7:06 p.m.

QSqlQuery выполнение sql запросов из файла

Необходимо выполнять на разных базах данных FireBird запросы такого вида

SET TERM ^ ;
create or alter procedure TMP1C_T1
as
declare variable ARTICLE_ID integer;
declare variable TERMINAL_ID smallint = 2142;
begin
    FOR select A.article_id from get_asaldos (:TERMINAL_ID, 9999, null, 0) GA
    join articles A on A.article_id = GA.article_id and A.terminal_id = :TERMINAL_ID
    where A.isactive = 'F'
    INTO :ARTICLE_ID
    DO
        update articles AR set AR.isactive = 'T'
        where AR.terminal_id = :TERMINAL_ID and AR.article_id = :ARTICLE_ID;
end^
SET TERM ; ^
GRANT EXECUTE ON PROCEDURE GET_ASALDOS TO PROCEDURE TMP1C_T1;
GRANT SELECT,UPDATE ON ARTICLES TO PROCEDURE TMP1C_T1;
GRANT EXECUTE ON PROCEDURE TMP1C_T1 TO SYSDBA;
execute procedure tmp1c_t1;
Это возможно только парсингом строк или есть другие варианты?
Нашел вот такое решение.
We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.

Do you like it? Share on social networks!

4
Evgenii Legotckoi
  • July 12, 2017, 7:19 p.m.

Ну выполнять-то такие запросы скорее всего можно и обычным путём через QSqlQuery, что в той ссылке и делается фактически. Суть в том, что такой запрос представляет собой несколько команд, поэтому и делается разбор на строки.

Тот метод очевидно применяется для парсинга дампа базы данных, поэтому и парсинг присутствует, которые видимо отвечает как раз за формирование набора команд для SQL базы данных.

Если Вы собираетесь сделать файл с набором команд и применять его для разных баз данных в качестве шаблонного кода запросов, то лично мне кажется то решение с github`а вполне адекватным для вашей задачи. Только потребуется под ваши нужды поправить его. Например работу с транзациями передалать, если у Вас это выглядит несколько проще.
    Ruslan Polupan
    • July 12, 2017, 7:47 p.m.

    Еще как вариант скармливать sql скрипт утилите идущей с базой данных в данном случае isql.exe


      Evgenii Legotckoi
      • July 12, 2017, 7:52 p.m.

      Мне думается, что это уже будет дело вкуса и вашего взгляда на проект.

      Если Вы действительно собираетесь просто скармливать своему софту SQL скрипты, которые должны будут выполняться для баз данных, то тот вариант на гитхабе вполне адекватен.
      Там есть подготовка файла для преобразования в набор строк и разделение их по отдельным командам.
      Если же использовать дополнительную утилиту, то придется запускать внешнюю программу, что не очень-то удобно - это же отдельный процесс.
      Я бы попробовал внедрить вариант с парсингом файла.
        Ruslan Polupan
        • May 30, 2018, 3:22 p.m.

        Оказывается QSqlQuery отлично справляется.

                QSqlQuery q = QSqlQuery(db);
                q.exec("CREATE OR ALTER PROCEDURE TMP1C_T1 "
                       "AS "
                       "DECLARE variable ARTICLE_ID INTEGER; "
                       "DECLARE variable TERMINAL_ID SMALLINT; "
                       "BEGIN "
                           "SELECT CAST(F_MID(CAST(F_BLOBASPCHAR(RDB$DEFAULT_SOURCE) AS VARCHAR(20)), 8, 10) AS INTEGER) "
                           "FROM RDB$FIELDS WHERE RDB$FIELD_NAME = 'T_TERMINAL' INTO :TERMINAL_ID; "
                           "FOR SELECT A.article_id FROM get_asaldos (:TERMINAL_ID, 9999, NULL, 0) GA "
                           "JOIN articles A ON A.article_id = GA.article_id AND A.terminal_id = :TERMINAL_ID "
                           "WHERE A.isactive = 'F' "
                           "INTO :ARTICLE_ID "
                           "DO "
                               "UPDATE articles AR SET AR.isactive = 'T' "
                               "WHERE AR.terminal_id = :TERMINAL_ID AND AR.article_id = :ARTICLE_ID; "
                       "END");
                q.exec("GRANT EXECUTE ON PROCEDURE GET_ASALDOS TO PROCEDURE TMP1C_T1");
                q.exec("GRANT SELECT,UPDATE ON ARTICLES TO PROCEDURE TMP1C_T1");
                q.exec("GRANT EXECUTE ON PROCEDURE TMP1C_T1 TO SYSDBA");
                q.exec("EXECUTE PROCEDURE tmp1c_t1");

          Comments

          Only authorized users can post comments.
          Please, Log in or Sign up
          Ua

          Qt - Test 001. Signals and slots

          • Result:84points,
          • Rating points4
          Ua

          Qt - Test 001. Signals and slots

          • Result:42points,
          • Rating points-8
          ОК

          Qt - Test 001. Signals and slots

          • Result:47points,
          • Rating points-6
          Last comments
          ИМ
          Игорь МаксимовNov. 22, 2024, 9:51 p.m.
          Django - Tutorial 017. Customize the login page to Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
          Evgenii Legotckoi
          Evgenii LegotckoiOct. 31, 2024, 11:37 p.m.
          Django - Lesson 064. How to write a Python Markdown extension Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
          A
          ALO1ZEOct. 19, 2024, 5:19 p.m.
          Fb3 file reader on Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
          ИМ
          Игорь МаксимовOct. 5, 2024, 4:51 p.m.
          Django - Lesson 064. How to write a Python Markdown extension Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
          d
          dblas5July 5, 2024, 8:02 p.m.
          QML - Lesson 016. SQLite database and the working with it in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
          Now discuss on the forum
          f
          firstlunoxodFeb. 15, 2025, 1:46 p.m.
          Рисование на QGraphicsScene при зажатой кнопке мыши Подскажите, пожалуйста! Как данный класс можно дополнить, чтобы созданные объекты можно было перемещать мышкой по сцене?
          Дмитрий
          ДмитрийFeb. 3, 2025, 4:24 p.m.
          Создание deb-пакета. Как создать ярлык на рабочем столе после установки собственного deb-пакета? Всем привет. Сделал свой deb-пакет с программой. Всё устанавливается и работает. Ставлю по пути /usr/bin/my_application. Как для пользователя при установке пакета сразу создать ярлык на раб…
          NW
          Nayo WaiJan. 30, 2025, 7:22 p.m.
          не запускается компьютер!!! Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…
          n
          nklyJan. 3, 2025, 12:52 p.m.
          Нужно запретить перемещение только некоторых итемов, остальные перемещать можно. Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
          M
          MarselAug. 17, 2023, 12:26 a.m.
          OAuth2.0 через VK, получение email Спасибо большое за помощь и простите за то что отнял время своей невнимательностью.

          Follow us in social networks