mysql - 如何使用 .NET MySql 连接器在 mariadb 中使用 DELIMITER?

标签 mysql asp.net .net mariadb

我正在使用 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,它就可以工作。但即使是带有自定义分隔符的非常简单的触发器也会失败。

最佳答案

在搜索其他人如何成功使用 .NET 中的 MySQL/MariaDB 分隔符时,我发现了以下文章: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);

关于mysql - 如何使用 .NET MySql 连接器在 mariadb 中使用 DELIMITER?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52437944/

相关文章:

sql - mySQL ORDER优化

php - 在 PHP 中处理大量非常大的文件

c# - Entity Framework - 只有 edmx,没有模板

c# - 单击链接按钮时在新窗口中打开页面

javascript - 以跨浏览器兼容的方式触发 onresize

c# - 将创建的 DateTime 与 DateTime.Today 在下午 6 点进行比较,C#

python - 无法使用 Python 填充 WPF DataGrid

mysql - 我已经对组合列建立了索引,是否也应该对单独的列建立索引?

mysql 算术函数中的单引号

html - 如何设置网站的最大宽度并使其可滚动