Как использовать DELIMITER в mariadb с помощью коннектора .NET MySql? - PullRequest
0 голосов
/ 21 сентября 2018

Я использую MariaDB 10.2.12 и подключаюсь с помощью коннектора .NET MySQL.Следующий триггер прекрасно работает в MySQL Workbench:

DELIMITER //
CREATE TRIGGER update_last_modified
BEFORE UPDATE ON users
FOR EACH ROW
BEGIN
    DECLARE miscdataWithDate JSON;
    IF JSON_CONTAINS_PATH(NEW.miscdata, 'all', '$.v1.lastModified2') THEN
        SET NEW.miscdata = JSON_REPLACE(NEW.miscdata, '$.v1.lastModified2', UTC_TIMESTAMP());
    ELSE
        SET miscdataWithDate = JSON_SET('{"v1": {}}', '$.v1.lastModified2', UTC_TIMESTAMP());
        SET NEW.miscdata = JSON_MERGE(NEW.miscdata, miscdataWithDate);
    END IF;
END; //
DELIMITER ;

Чтобы запустить команду из C # /. NET, я использовал следующее.Я попытался сделать это с последней точкой с запятой и без нее, если библиотека добавляет точку с запятой:

using (var cmd = new MySqlCommand(@"CREATE TRIGGER update_last_modified
    BEFORE INSERT ON users
    FOR EACH ROW
    BEGIN
        DECLARE miscdataWithDate JSON;
        IF JSON_CONTAINS_PATH(NEW.miscdata, 'all', '$.v1.lastModified') THEN
            SET NEW.miscdata = JSON_REPLACE(NEW.miscdata, '$.v1.lastModified', UTC_TIMESTAMP());
        ELSE
            SET miscdataWithDate = JSON_SET('{""v1"": {}}', '$.v1.lastModified', UTC_TIMESTAMP());
            SET NEW.miscdata = JSON_MERGE(NEW.miscdata, miscdataWithDate);
        END IF;
    END; //
    DELIMITER ;", connection))
{
    await cmd.ExecuteNonQueryAsync().ConfigureAwait(false);
}

Когда триггер определен (не вызывается), ошибка:

Unhandled Exception: System.AggregateException: One or more errors occurred. (You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '//
    DELIMITER' at line 1) ---> MySql.Data.MySqlClient.MySqlException: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '//
    DELIMITER' at line 1

Если я упростил запрос, чтобы он не требовал установки DELIMITER, он работает.Но даже очень простой триггер с пользовательским разделителем не работает.

1 Ответ

0 голосов
/ 21 сентября 2018

При поиске того, как другие люди успешно использовали разделители с MySQL / MariaDB из .NET, я обнаружил следующую статью: https://dev.mysql.com/doc/connector-net/en/connector-net-tutorials-mysqlscript-delimiter.html

В приведенном примере используется MySqlScript вместо MySqlCommand, ипоэтому я считаю, что MySqlCommand просто не поддерживает разделители.Вот обновленный код, который отлично работает:

MySqlScript script = new MySqlScript(connection, @"CREATE TRIGGER update_last_modified
    BEFORE INSERT ON users
    FOR EACH ROW
    BEGIN
        DECLARE miscdataWithDate JSON;
        IF JSON_CONTAINS_PATH(NEW.miscdata, 'all', '$.v1.lastModified') THEN
            SET NEW.miscdata = JSON_REPLACE(NEW.miscdata, '$.v1.lastModified', UTC_TIMESTAMP());
        ELSE
            SET miscdataWithDate = JSON_SET('{""v1"": {}}', '$.v1.lastModified', UTC_TIMESTAMP());
            SET NEW.miscdata = JSON_MERGE(NEW.miscdata, miscdataWithDate);
        END IF;
    END; //");
script.Delimiter = "//";
await script.ExecuteAsync().ConfigureAwait(false);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...