Найдено 16 результатов

Jane
Пт 13 авг 2021 11:37
Форум: MySQL Data Access Components
Тема: Ошибка в триггере
Ответы: 9
Просмотры: 333

Re: Ошибка в триггере

Спасибо за разъяснение.
Их хэлпа:
property UseUnicode:

Informs server that all data between client and server sides will be passed in Utf8 coding. Setting this option converts all fields of the TStringField type into TWideStringField that allows to work correctly with symbols of almost all languages simultaneously. On the other hand, it causes a delay in working. If the UseUnicode property is enabled, the Charset property will be ignored. The default value is False.
это приводит к задержке в работе - проясните еще насчет выделенного. Насколько значительна эта задержка?
Jane
Пт 13 авг 2021 09:50
Форум: MySQL Data Access Components
Тема: Ошибка в триггере
Ответы: 9
Просмотры: 333

Re: Ошибка в триггере

Виктор, спасибо. Это помогло, хотя и не совсем понятна взаимосвязь с триггером - ведь без него кириллица без проблем используется в запросах.
Jane
Пт 13 авг 2021 07:39
Форум: MySQL Data Access Components
Тема: Ошибка в триггере
Ответы: 9
Просмотры: 333

Re: Ошибка в триггере

ViktorV писал(а): Чт 12 авг 2021 10:49 Добрый день.

Для более быстрого и точного ответа, пожалуйста, составьте и пришлите нам небольшой пример, демонстрирующий указанное вами поведение, включающий скрипты на создание и заполнения объектов БД с помощью контактной формы:
https://devart.com/company/contactform.html

С уважением,
Виктор
Удалось воссоздать ошибку на тестовом проекте, всё отправлено через Contact form.
Просьба рассмотреть как можно скорее.
Jane
Чт 12 авг 2021 14:32
Форум: MySQL Data Access Components
Тема: Ошибка в триггере
Ответы: 9
Просмотры: 333

Re: Ошибка в триггере

удалить
Jane
Чт 12 авг 2021 13:52
Форум: MySQL Data Access Components
Тема: Ошибка в триггере
Ответы: 9
Просмотры: 333

Re: Ошибка в триггере

Хотел использовать dbMonitor для отладки, но почему-то нет компонента TMySQLMonitor на палитре. Как его установить?

И вопрос: как выполняемый на сервере триггер влияет на результат выполнения

Код: Выделить всё

MyCommand.SQL.Text := 'UPDATE workers SET fio="Щетинин" WHERE id=37';
MyCommand.Execute;
???
Почему, если удалить триггер, код выше выполняется корректно, а с триггером выдает ошибку? Какая связь и как ее отследить?


Почему, если заменить в строке триггера
SET original_query = (SELECT info FROM INFORMATION_SCHEMA.PROCESSLIST WHERE id = CONNECTION_ID());
на
SET original_query = (SELECT HOST FROM INFORMATION_SCHEMA.PROCESSLIST WHERE id = CONNECTION_ID());
по-прежнему возникает ошибка
Project xxx.exe raised exception class EMySqlException with message '#HY000Incorrect string value: '\xD9\xE5\xF2\xE8\xED\xE8...' for column 'INFO' at row 1'.
Откуда берется это INFO, почему не HOST?

Incorrect string value: '\xD9\xE5\xF2\xE8\xED\xE8...' есть ни что иное, как слово "Щетинин"....
Jane
Чт 12 авг 2021 09:55
Форум: MySQL Data Access Components
Тема: Ошибка в триггере
Ответы: 9
Просмотры: 333

Ошибка в триггере

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

Код: Выделить всё

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 например такого апдейта:

Код: Выделить всё

UPDATE workers SET fio='Щетинин' WHERE id=37
без триггера все проходит ОК, но с триггером получаю ошибку:
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
Дайте знать, если требуется какая-либо доп.информация.
Jane
Ср 23 янв 2019 14:00
Форум: MySQL Data Access Components
Тема: AV failure in the Refresh method in RAD Studio 10.2
Ответы: 4
Просмотры: 12523

Re: AV failure in the Refresh method in RAD Studio 10.2

ViktorV - отправлено!
Jane
Ср 23 янв 2019 07:07
Форум: MySQL Data Access Components
Тема: AV failure in the Refresh method in RAD Studio 10.2
Ответы: 4
Просмотры: 12523

AV failure in the Refresh method in RAD Studio 10.2

Здравствуйте! Обновили сервер MySQL c версии 5.7.18.1 на 8.0.13, затем обновили компонент MyDAC c версии 9.2.7 на последнюю 9.3.9. В итоге, ранее работающий код:

Код: Выделить всё

        DM.MyConnection.StartTransaction;
        try
          with DM.MyCommand do
          begin
            Params.Clear; 
            SQL.Text := 'UPDATE contragents_ SET name=:to WHERE id=:id';
            ParamByName('to').AsString := Trim(lbledtToText.Text);

            Prepare;

            for i := 0 to High(ArrID) do begin // ArrID: array of integer;
              ParamByName('id').AsInteger := ArrID[i]; // id
              Execute;
            end;

            UnPrepare;
          end;

          DM.MyConnection.Commit;
        except
          on E: Exception do
          begin
            DM.MyConnection.Rollback;  
            Application.MessageBox(PChar('Ошибка записи!'+#13+'Exception class name = '+E.ClassName+#13+'Exception message = '+E.Message),
              DLG_ERROR, MB_OK + MB_ICONERROR);
          end;
        end;

        myqryRef.Refresh;
стал вызывать AV при выполнении myqryRef.Refresh:
---------------------------
Debugger Exception Notification
---------------------------
Project Debtors.exe raised exception class $C0000005 with message 'access violation at 0x00862ef2: read of address 0x043a044e'.
---------------------------
Если в режиме отладки при возникновении сообщения об AV нажать Break, то оказываемся в модуле MemUtils в

Код: Выделить всё

procedure StrLCopyW(Dest: PWChar; const Source: PWChar; MaxLen{WideChars}: Integer);
var
  pwc: PWideChar;
begin
  pwc := Source;
  while (pwc^ <> #0) and (pwc < PWideChar(Source) + MaxLen) do begin
    PWideChar(Dest)^ := pwc^;
    Inc(PWideChar(Dest));
    Inc(pwc);
  end;
  PWideChar(Dest)^ := #0;
end;
на строке while (pwc^ <> #0) and (pwc < PWideChar(Source) + MaxLen) do begin.
Сам коммит проходит и изменения записываются в БД. И даже в гриде (DBGridEh) рефреш отражает изменения, несмотря на ошибку.
DM.MyCommand и myqryRef имеют одно и то же свойство Connection.

Код: Выделить всё

  myqryRef.SQL.Text := 'SELECT id,deleted,account,name_short,fio_head,address_obj,inn FROM contragents_';
  myqryRef.SQLRefresh.Text := 'SELECT id,account,name_short,fio_head,address_obj,inn FROM contragents_ WHERE id=:id';
Window 7 SP1 x64, Delphi 10.2.3, всё лицензионное.

В revision_history 9.3.9 написано "Bug with AV failure in the Refresh method in RAD Studio 10.2 Tokyo on Linux is fixed" - пофиксили в Линуксе, может и в Windows та же проблема?
Можно это пофиксить?
Jane
Вт 01 дек 2015 06:43
Форум: MySQL Data Access Components
Тема: Вопрос по SQLRefresh
Ответы: 1
Просмотры: 11696

Вопрос по SQLRefresh

Здравствуйте,
для выборки данных из двух таблиц и отображения на DBGrid используется такой запрос:

Код: Выделить всё

  MyQuery.SQL.Text := 'SELECT t1.id case_id,status,t2.account,t2.name '+
                      'FROM cases t1, contragents t2 '+
                      'WHERE (NOT t1.deleted) AND (t2.id=t1.contragent_id)';
После редактирования какой-либо записи (на отдельной форме) необходимо обновить данные выборки, а конкретно - текущую отредактированную запись, для чего используется MyQuery.RefreshRecord с таким свойством:

Код: Выделить всё

  MyQuery.SQLRefresh.Text := 'SELECT t1.id case_id,status,t2.account,t2.name '+
                             'FROM cases t1, contragents t2 '+
                             'WHERE (t1.id=:t1.id) AND (t2.id=t1.contragent_id)';
После выполнения MyQuery.RefreshRecord имеем такую ошибку:
Not found field corresponding parameter t1.
Из справки к MyDAC:
To create a SQLRefresh statement at design-time, use the query statements editor.

Example
SELECT Shipname FROM Orders
WHERE
OrderID = :OrderID
И это работает когда в запросе 1 таблица. Но как быть, если в запросе используется две таблицы с одинаковыми полями 'id'?
Как правильно записать часть 'WHERE t1.id=:t1.id' из MyQuery.SQLRefresh.Text, чтобы не было ошибки?
Jane
Чт 21 май 2015 06:01
Форум: MySQL Data Access Components
Тема: Искаженное сообщение об ошибке 10061
Ответы: 5
Просмотры: 16567

Re: Искаженное сообщение об ошибке 10061

У меня TMyConnection.UseUnicode:=True, но кракозябры все равно в тексте ошибки!
Почему молчит ТП?
Jane
Ср 20 май 2015 12:48
Форум: MySQL Data Access Components
Тема: Искаженное сообщение об ошибке 10061
Ответы: 5
Просмотры: 16567

Re: Искаженное сообщение об ошибке 10061

То же самое на версии 8.5.12!
Jane
Вт 30 дек 2014 17:30
Форум: MySQL Data Access Components
Тема: Метаданные о таблице
Ответы: 3
Просмотры: 4407

Re: Метаданные о таблице

Ок, а если не использовать TMyMetaData, как еще можно получить искомое с помощью MyDAC?
Jane
Вт 30 дек 2014 14:53
Форум: MySQL Data Access Components
Тема: Метаданные о таблице
Ответы: 3
Просмотры: 4407

Метаданные о таблице

Здравствуйте! Использую компонент TMyMetaData, чтобы получить необходимую информацию о структуре таблицы, см. скриншот ниже (на картинке данные, полученные MyMetaData выше, а ниже данные из стороннего DB manager для сравнения). Но с его помощью не смог получить некоторые метаданные, потому несколько вопросов:
1) как узнать, где PRIMARY KEY?
2) почему для некоторых типов полей поле 'DATA_LENGTH' пустое? К примеру, как узнать, что tinyint(1), а не (2)?
3) как узнать UNSIGNED?
4) как узнать UNIQUE?
5) как узнать AUTO_INCREMENT?
6) как узнать VALUE для типов ENUM, SET?
Jane
Пн 06 окт 2014 08:59
Форум: MySQL Data Access Components
Тема: TMyDump: баг или что я делаю не так?
Ответы: 3
Просмотры: 4616

Re: TMyDump: баг или что я делаю не так?

GRANT SELECT ON MySQL.Proc to vad@192.168.1.22;
Да, так заработало, спасибо!
Но остается вопрос, почему другим программам администрирования (а я их перепробовал 4 штуки) не требовались права доступа к таблице MySQL.Proc, а TMyDump они нужны?
Jane
Пн 06 окт 2014 06:11
Форум: MySQL Data Access Components
Тема: TMyDump: баг или что я делаю не так?
Ответы: 3
Просмотры: 4616

TMyDump: баг или что я делаю не так?

Здравствуйте!
Работа компонента MyDump.BackupToFile(FileName) с Options = [doTables,doData,doViews,doTriggers] проходит как следует. Однако, стоит добавить в БД хранимую процедуру и добавить в Options [doStoredProcs], как при выполнении BackupToFile появляется ошибка:

Код: Выделить всё

#42000SELECT command denied to user 'vad'@'192.168.1.22' for table 'proc'
Права на БД следующие:
Изображение

В то же время "dbForge Studio for MySQL" и "MySQL-Front" без проблем делают дамп этой БД вместе с хранимой процедурой.

Подскажите, это баг? Или как правильно использовать TMyDump?