Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?

Официальный форум Simple-Scada.

Автор Тема: Обработка ошибок запросов к БД  (Прочитано 2246 раз)

Серега

  • Старожил
  • ****
  • Сообщений: 285
    • Просмотр профиля
Обработка ошибок запросов к БД
« : 11 Марта 2020, 14:38:16 »
Добрый день!
Согласно руководству у нас есть скрипт типа "Ошибка SQL запроса". Логика создания понятна. Есть ошибка есть сообщение в Msg.
Но так же у нас есть (можно сказать ID запроса, DataSet) в  RunSQL свой ATag. И в скрипте типа "Выполнен SQL запрос" все замечательно работает.
Теперь к ситуации.
В универсальном скрипте, привязанном к кнопке по нажатию, формируем RunSQL(aQuery, nil, 100), где
Код: (delphi)
 aQuery := 'CREATE TABLE ' + NameNewTable.AsStr + ' LIKE TemplateTable'.
Далее в скрипте типа "Ошибка SQL запроса" добавляем
Код: (delphi)
TextSQLError.Value := Msg;
if TextSQLError.Value <> '' then
    AddMessage(Now, mkWarning, 'Таблица не добавлена', True, True);
и все прекрасно работает если мы пытаемся имитировать именно ошибку добавления таблицы с таким же именем.
Но вот вопрос, не будет ли путать оператора сообщение о создании таблицы при других ошибках SQL запросов. По логике событие будет формироваться при любых ошибках SQL запросов. Честно пока не подтвердилось опасение. Возможно ошибки Таблица. RunSQL к типу "Ошибка SQL запроса"  не относятся.
Можете у себя это проверить или опровергнуть опасения.

И теперь маленькое предложение-вопрос.
Если в скрипте типа "Ошибка SQL запроса" использовать следующую конструкцию:
Код: (delphi)
begin
case DataSet.Tag of
  100  :begin
          TextSQLError.Value := Msg;
          if TextSQLError.Value <> '' then
              AddMessage(Now, mkWarning, 'Таблица не добавлена', True, True);
        end;
end;
end.
У меня не заработала. Всего скорее, потому что номер 100 относиться к  DataSet, а не к ошибке. И обработка идет в типе скрипта "Ошибка SQL запроса".
Или все таки он может заработать? Потому что я делаю не правильно? или потому что это скоро "... появиться в ближайших обновлениях ..."  :D
Жду вопросов и предожений
« Изменён: 11 Марта 2020, 17:33:48 от Simple-Scada »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3214
    • Просмотр профиля
    • Simple-Scada
Re: Обработка ошибок запросов к БД
« Ответ #1 : 11 Марта 2020, 21:26:47 »
Здравствуйте.

Скрипты с типом события "Ошибка SQL-запроса" касаются только основной глобальной функции RunSQL, но не касаются метода таблицы "Table.RunSQL"! У таблиц, если "Table.RunSQL" выполняется с ошибкой, то содержимое таблицы затемняется и текст ошибки выводится прямо в таблице (см. скрин во вложении).
Также скрипты с типом события "Ошибка SQL-запроса" выполняются если любой из вызовов глобальной функции RunSQL завершился с ошибкой. К сожалению на данный момент можно получить только текст ошибки, но нельзя получить DataSet или его тег. Соответственно нельзя понять какой именно из множества запросов выполнился с ошибкой. Постараемся в будущем заменить параметр Msg на Dataset, чтобы можно было получить тег запроса (DataSet.Tag) или связанный с ним объект (DataSet.Sender).

Серега

  • Старожил
  • ****
  • Сообщений: 285
    • Просмотр профиля
Re: Обработка ошибок запросов к БД
« Ответ #2 : 12 Марта 2020, 10:37:33 »
Добрый день!
Ждем и успехов в реализации

pan2000

  • Постоялец
  • ***
  • Сообщений: 226
    • Просмотр профиля
Re: Обработка ошибок запросов к БД
« Ответ #3 : 12 Марта 2020, 11:54:29 »
   Здравствуйте.

Для информирования оператора о существовании таблицы можно предварительно проверить ее наличие.
Универсальный скрипт:
Код: (delphi)
  . . .
aQuery := 'SHOW TABLES LIKE ' + QuotedStr(NameNewTable.AsStr) + ';';
RunSQL(aQuery, nil, 100);
  . . .
Скрипт "Выполнен SQL-запрос"
Код: (delphi)
  case DataSet.Tag of
  . . .
  100: if DataSet.IsEmpty then RunSQL('CREATE TABLE `' + NameNewTable.AsStr + '` LIKE `TemplateTable`;', nil, 101)
       else AddMessage(Now, mkWarning, 'Таблица не добавлена', True, True);
  . . .
  end;

         Получить тэг запроса для события "Ошибка SQL-запроса" (пока это не реализовано средствами Simple-Scada).
В предположении, что порядок вызовов процедуры RunSQL соответствует порядку событий завершения, можно организовать очередь тэгов, добавляя новый тэг при вызове и извлекая тэг по событию SQL-запроса или ошибки SQL-запроса.
Проект узкоспецифичный, смысла в приведении программного кода нет. См. вложение.

« Изменён: 12 Марта 2020, 14:46:15 от pan2000 »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3214
    • Просмотр профиля
    • Simple-Scada
Re: Обработка ошибок запросов к БД
« Ответ #4 : 13 Марта 2020, 21:56:56 »
Цитировать
В предположении, что порядок вызовов процедуры RunSQL соответствует порядку событий завершения, можно организовать очередь тэгов, добавляя новый тэг при вызове и извлекая тэг по событию SQL-запроса или ошибки SQL-запроса.
Запросы вызванные через RunSQL становятся в очередь и три отдельных потока берут их для параллельного выполнения. Поэтому порядок выполнения может быть разным и в основном зависит от сложности запроса. Тот запрос, который выполнится быстрее - первым вызовет событие завершения.