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

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

Автор Тема: Чтение значения из БД  (Прочитано 1786 раз)

Rolich

  • Пользователь
  • **
  • Сообщений: 78
    • Просмотр профиля
Чтение значения из БД
« : 15 Августа 2024, 11:50:50 »
Доброго всем времени суток
Имеется таблица БД Value, в которой есть поля ID и Znachenie (база - Postgres)
Как в переменную Simple Scada считать значение ?
Пробую вот так:
Код: (delphi)
var
  aQuery: string;
begin
    aQuery := 'Select "Znachenie" from "Value" where ID=1';
    RunSQL(aQuery);
    if DataSet.Tag = 1 then Peremennaya.Value:= DataSet[0].AsFloat;
end.
« Изменён: 15 Августа 2024, 12:02:49 от Simple-Scada »

Simple Scada

  • Глобальный модератор
  • *****
  • Сообщений: 271
    • Просмотр профиля
    • Simple-Scada
Re: Чтение значения из БД
« Ответ #1 : 15 Августа 2024, 16:09:58 »
Здравствуйте.

Процедура RunSQL выполняется асинхронно (выполнение зависит от нагрузки на СУБД, ПК и пр.). Поэтому сразу после вызова RunSQL нельзя работать с результатом запроса. Обрабатывать результат запроса нужно в отдельном скрипте с типом события "Выполнен SQL-запрос". Пример получения значение из БД (для MySQL) см. по ссылке. Для СУБД PostgreSQL скрипты будут выглядеть следующим образом:
Код: (delphi)
var
  aQuery: string;
begin
  aQuery := 'SELECT "Znachenie" FROM "Value" WHERE "ID" = 1;';
  RunSQL(aQuery, nil, 1);
end.

Скрипт с типом события "Выполнен SQL-запрос":
Код: (delphi)
begin
  if DataSet.Tag = 1 then
    Peremennaya.Value:= DataSet[0].AsFloat;
end.

Проверить свой SQL-запрос и увидеть результат его выполнения можно используя приложение PgAdmin, выполнив в нём требуемый SQL-запрос. Обработать ошибки выполнения SQL-запроса можно в скрипте "Ошибка SQL-запроса". Также для поиска ошибок в SQL-запросе можно включить опцию "Лог пользовательских SQL-запросов". При активации данной опции все пользовательские SQL-запросы будут записываться в лог-файл сервера с указанием имени скрипта, из которого была вызвана процедура и текстом SQL-запроса. Таким образом, можно просмотреть нужный SQL-запрос, отправленный в БД, и проверить, нет ли в нем ошибок. Данную опцию можно использовать только для отладки проекта, иначе она будет создавать лишнюю нагрузку на сервер. После отладки опцию нужно обязательно выключить.

Rolich

  • Пользователь
  • **
  • Сообщений: 78
    • Просмотр профиля
Re: Чтение значения из БД
« Ответ #2 : 16 Августа 2024, 09:00:45 »
Как быть в ситуации, когда поле ID имеет формат uuid и выглядит, например, так: 18a5f8b-7ab4-7727-b7b2-b5f90c739dda
Запрос aQuery := 'SELECT "Znachenie" FROM "Value" WHERE "ID" = 18a5f8b-7ab4-7727-b7b2-b5f90c739dda' возвращает ошибку "Мусорное значение"

Simple Scada

  • Глобальный модератор
  • *****
  • Сообщений: 271
    • Просмотр профиля
    • Simple-Scada
Re: Чтение значения из БД
« Ответ #3 : 16 Августа 2024, 11:49:22 »
Здравствуйте.

Информацию по данной ошибке и ее устранению можно найти в интернете. Вам нужно самостоятельно изучить синтаксис PostgreSQL и составлять запросы в соответствии с требованиями синтаксиса используемой СУБД. Запросы для скады не нужно никак менять. Их можно просто подставить в RunSQL в виде строки. Исключение: символы одинарных кавычек (т.к. в скаде одинарные кавычки используются для указания строки). Чтобы добавить строке одинарные кавычки (по краям) используйте функцию QuotedStr, либо дублируйте их (см. пример по ссылке). Подробное описание см. в руководстве по ссылке.

Исправленный запрос:
Код: (delphi)
aQuery := 'SELECT "Znachenie" FROM "Value" WHERE "ID" = ' + QuotedStr('18a5f8b-7ab4-7727-b7b2-b5f90c739dda') + ';';
« Изменён: 16 Августа 2024, 12:32:13 от Simple-Scada »

Rolich

  • Пользователь
  • **
  • Сообщений: 78
    • Просмотр профиля
Re: Чтение значения из БД
« Ответ #4 : 16 Августа 2024, 14:39:08 »
Большое спасибо за помощь, всё получилось !