Search found 4 matches

by Jane
Thu 12 Aug 2021 09:04
Forum: MySQL Data Access Components
Topic: AV on trigger
Replies: 4
Views: 56741

AV on trigger

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

Добрый день. Для таблицы workers есть триггер после апдейта записи, сохраняющий в другую таблицу log_actions sql текст апдейта (для логгирования действий юзера):

Code: Select all

CREATE TRIGGER `worker_changed_by` AFTER UPDATE ON `workers` FOR EACH ROW BEGIN
  DECLARE original_query varchar(1024);
  SET original_query = (SELECT info FROM INFORMATION_SCHEMA.PROCESSLIST WHERE id = CONNECTION_ID());
  INSERT INTO log_actions (id_user, dt, table_name, id_rec, action, sql_text) VALUES (@uid, NOW(), 'workers', NEW.id, 'U', original_query);
END;
При MyCommand.Execute например такого апдейта:

Code: Select all

UPDATE workers SET fio='test' WHERE id=123
без триггера все проходит ОК, но с триггером получаю ошибку:
Project ххх.exe raised exception class EMySqlException with message '#HY000Incorrect string value: '\xD9\xE5\xF2\xE8\xED\xE8...' for column 'INFO' at row 1'.
Если напрямую апдейтить любое поле в workers в любом из БД-менеджеров или выполнить query с текстом апдейта выше, то триггер исполняется корректно, т.е. в таблицу log_actions заносится запись с sql текстом апдейта.

Если в триггере заменить (SELECT info FROM INFORMATION_SCHEMA.PROCESSLIST WHERE id = CONNECTION_ID()) на 'any_text', то ошибки нет!
Поле `log_actions`.`sql_text` varchar(1024) с CHARSET=utf8mb4.
Поле `PROCESSLIST`.`INFO` longtext с CHARSET=utf8mb3. Если заменить в триггере info на CONVERT(info USING utf8mb4), то ошибка остается.

Получается, проблема в MyDAC - как ее исправить?

Окружение: mydac_10.4.4_src + Delphi 10.4.2 + Win 10 + MySQL 8.0.25
Дайте знать, если требуется какая-либо доп.информация.
by Jane
Thu 14 Dec 2017 10:27
Forum: SQLite Data Access Components
Topic: Data Type Mapping bug?
Replies: 6
Views: 3014

Re: Data Type Mapping bug?

MaximG wrote:According to the documentation ( http://www.sqlite.org/datatype3.html , Section "2.2. Date and Time Datatype" ), SQLite can store date and time in one of the three formats depending on the inserted value. When fetching data, LiteDAC automatically tries to determine the format in which the date and time value is stored. In your case, the date and time format is defined as Unix Time and an incorrect value is obtained. To avoid this error, set the property of Connection NativeDate = False :

Code: Select all

LiteConnection1.Options.NativeDate: = False;
In this case, LiteDAC will assume that the date and time are stored in Delphi format.
Thank you, so everything worked as it should.
by Jane
Thu 14 Dec 2017 05:42
Forum: SQLite Data Access Components
Topic: Data Type Mapping bug?
Replies: 6
Views: 3014

Re: Data Type Mapping bug?

LopperPenny wrote:@Jons please use google translate.
I realized what the problem was with your code.
But I can not give a clear answer. Now.
Translated, sorry.
All my code is shown in the example. Where is the error?
by Jane
Wed 13 Dec 2017 13:22
Forum: SQLite Data Access Components
Topic: Data Type Mapping bug?
Replies: 6
Views: 3014

Data Type Mapping bug?

Hello! I'm faced with strange behavior of Data Type Mapping. A simplified example from https://www.devart.com/litedac/docs/?da ... apping.htm :

Code: Select all

CREATE TABLE test
( 
 ID                INTEGER PRIMARY KEY AUTOINCREMENT,
 DELPHI_DTTM       DATETIME
);
INSERT INTO test(DELPHI_DTTM) VALUES (43079.0);
43079.0 is the date 10.12.2017 in TDateTime type (double).

Next, add a rule and execute the query:

Code: Select all

LiteQuery.DataTypeMap.Clear;
LiteQuery.DataTypeMap.AddDBTypeRule(liteDateTime, ftDate);
LiteQuery.SQL.Text := 'SELECT DELPHI_DTTM FROM test'
And we get the value = 01.01.1970
Why is that? How to get the correct date - 10.12.2017?