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

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

Автор Тема: Текст внутри SQL запроса  (Прочитано 2719 раз)

Серега

  • Постоялец
  • ***
  • Сообщений: 209
    • Просмотр профиля
Текст внутри SQL запроса
« : 02 Ноября 2018, 13:23:44 »
Добрый день!
Вопрос. База MySQL.
Запрос:
SELECT * FROM recipes WHERE ID = 'test'
В базе выполняется. Результат то что нужно. При переносе в скаду возникает затык с кавычками. Т.е.:
Код: (delphi)
var
  aQuery: string;
begin
  { Формируем запрос к БД }
  aQuery := 'SELECT * FROM  recipes WHERE ID = 'test';'
  { Отправляем запрос на выполнение c тегом = 1}
  RunSQL(aQuery, nil, 1);
end.
В примерах используется переменная типа string. Но это если надо подставить, а нужно подставить текст в кавычки внутрь запроса, который сам в кавычках.
Подскажите куда смотреть.

« Изменён: 13 Ноября 2018, 11:49:33 от Simple-Scada »

Серега

  • Постоялец
  • ***
  • Сообщений: 209
    • Просмотр профиля
Re: Текст внутри SQL запроса
« Ответ #1 : 02 Ноября 2018, 14:19:39 »
Товарищи!
Терпение и труд все перетрут.
Решение после ряда экспериментов нашел следующее (может кому и пригодиться) :
Код: (delphi)
var
  aQuery: string;
  var:string;
begin
  var:='test';
  { Формируем запрос к БД }
  aQuery := 'SELECT * FROM  recipes WHERE ID = ' + Chr(39) + var + Chr(39) +';';
  { Отправляем запрос на выполнение c тегом = 1}
  RunSQL(aQuery, nil, 1);
end.
В предыдущей записи в конце забыл поставить ;.
Если вместо var использовать внешнею переменную можно разработать интересные скрипты с заменой.
Тема закрыта.
« Изменён: 02 Ноября 2018, 14:36:52 от Simple-Scada »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3000
    • Просмотр профиля
    • Simple-Scada
Re: Текст внутри SQL запроса
« Ответ #2 : 02 Ноября 2018, 14:36:35 »
Здравствуйте.

Лучше всего использовать специальную функцию, которая заключает текст в одинарные кавычки: QuotedStr. Или второй вариант, вместо одной одинарной кавычки ставить две одинарных кавычки подряд. Например:
Код: (delphi)
var
  S: string;
begin
  // записываем в S строку: WHERE ID='var'
  S := 'WHERE ID=' + QuotedStr('var');
  // второй вариант делает то же самое
  S := 'WHERE ID=''var''';
end.
« Изменён: 02 Ноября 2018, 14:50:48 от Simple-Scada »

Серега

  • Постоялец
  • ***
  • Сообщений: 209
    • Просмотр профиля
Re: Текст внутри SQL запроса
« Ответ #3 : 02 Ноября 2018, 14:51:06 »
Спасибо за решения. В понедельник проверим на объекте.

Серега

  • Постоялец
  • ***
  • Сообщений: 209
    • Просмотр профиля
Re: Текст внутри SQL запроса
« Ответ #4 : 21 Января 2020, 18:49:28 »
Еще раз добрый день!
Столкнулся с непонятной ситуацией.
В универсальном скрипте по нажатию кнопки сначала идет проверка на пустую ячейку, потом апдейт данных в базе данных все как в примере на обновление записи рецепта.
- Выделяем строку в таблице которую хотим изменить.
- Отображаем в соответствующих полях
- ! Ни чего не меняем.
Жмем кнопку на выполнение скрипта апдейта и у нас ошибка:
Код
"#23000Cannot add or update a child row: a foreign key constraint fails (....... CONSTRAINT ........ FOREIGN KEY .......... REFERENCES .........ON UPDATE CASCADE)"
Берем скрипт из скады вставляем его в SQL, дополняем чем нужно для теста и выполняем. Ошибок нет.
Скрипт из скады:
Код: (delphi)
aQuery := 'UPDATE `vehicles` SET ' +            
             '`type_vehicles`=' + QuotedStr(edVehiclesType.AsStr) + ', ' +
             '`type_chassis`=' + QuotedStr(edVehiclesTypeChassis.AsStr) + ', ' +
             '`type_traffic`=' + QuotedStr(edTypeTraffic.AsStr) + ', ' +
             '`type_support_wheel`=' + QuotedStr(edNumberInDepo.AsStr) + ', ' +
             '`type_side_wheel`=' + QuotedStr(edNumberOnWay.AsStr) +
             ' WHERE `id_vehicles`=' + QuotedStr(edIDVehicles.AsStr);
  { Отправляем запрос на выполнение }
  RunSQL(aQuery, nil, 19);
В скрипте типа "Выполнен SQL запрос":
Код: (delphi)
case DataSet.Tag of
...
19     :tblVehicles.RunSQL('SELECT * FROM `vehicles`', tsSaveFixRow);
end;
и скрипт в MySQL(значения взяты из самой таблицы без изменений):
Код: (sql)
UPDATE vehicles SET type_vehicles = 'bottom',
type_chassis = 'mono rail',
type_traffic = 'cargo',
type_support_wheel = 'direct',
type_side_wheel = 'mixed'
WHERE id_vehicles = 'U4131';
При этом в таблицах в базе данных на всех Foreign Key стоит в Foreign Key Options -> On Update: -> CASCADE
Можете у себя проверить как то или посоветовать чего.
Жду вопросов и ответов.

« Изменён: 22 Января 2020, 09:28:21 от Simple-Scada »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3000
    • Просмотр профиля
    • Simple-Scada
Re: Текст внутри SQL запроса
« Ответ #5 : 22 Января 2020, 09:44:26 »
Здравствуйте.

При взаимодействии с БД скада берёт запрос, который Вы написали в скаде и без каких-либо изменений отправляет этот запрос к СУБД. СУБД выполняет полученный запрос и возвращает скаде результат выполнения запроса (либо ошибку выполнения). Никакой другой работы скада не выполняет.
Если СУБД выдала ошибку "Cannot add or update a child row: a foreign key constraint fails", значит в переданном ей запросе эта ошибка точно есть. На 100%.

Цитировать
Берем скрипт из скады вставляем его в SQL, дополняем чем нужно для теста и выполняем.
Это значит, что в ходе дополнения скрипта "чем нужно" Вы исправили ошибку SQL-запроса и теперь он выполняется корректно.

Вы можете в утилите Настроек включить опцию "Лог пользовательских SQL-запросов", тогда перед отправкой запроса к СУБД скада будет записывать текст запроса в лог-файл "..\Logs\Server-log.txt". Включите эту опцию, добейтесь выполнения проблемного запроса, завершите работу сервера скады и посмотрите в логе текст передаваемого SQL-запроса и возможно Вы увидите ошибку в запросе.

Серега

  • Постоялец
  • ***
  • Сообщений: 209
    • Просмотр профиля
Re: Текст внутри SQL запроса
« Ответ #6 : 22 Января 2020, 12:31:15 »
Спасибо!
Попробуем.