【问题标题】:catch MySQL trigger signals in C#在 C# 中捕获 MySQL 触发信号
【发布时间】:2013-12-19 03:49:59
【问题描述】:

我想创建一个 MySQL 触发器来生成不同的信号,并根据这些信号通过我的 C# 代码显示一些特定的消息。

如果我设置如下信号:

signal sqlstate '45000' //An error signal which halts my code

我可以在 try catch bock 中捕获这些信号,甚至可以找到 MySQL 异常的数量,但它为我尝试的各种 sqlstates 提供了相同的数量,例如 45000、42000、HY000、42S02 等

catch (MySqlException y)
{            
      Response.Write(y.Number.ToString());
      // All (45000, 42000, HY000, 42S02) printing same number
}

此外,这件事会停止我想在触发器中执行的进一步代码。

我想要做的是,基于某些条件,我只希望触发器发送一些信号消息,以便我可以通过 C# 显示一些消息,并且触发器应该继续处理进一步的语句并发送信号。

例如:

begin
        declare quan int;
        select qoh from products where pid = NEW.pid into quan;

        IF (NEW.qty > quan) THEN
            signal sqlstate 'xxxxx' /*appropriate signal number 1*/
            set message_text = 'Display message 1';
        END IF;

        IF (col2 > col1) THEN
            signal sqlstate 'yyyyy' /*appropriate signal number 2*/
            set message_text = 'Display message 2';
        END IF;
        .
        .
        .
end

我也尝试过signal sqlstate '01000',但我在 C# 中的 catch 语句没有捕捉到它(我假设它不是异常/错误信号,而是警告)。

请帮助我:

  1. 适当的信号设置不会停止我的触发器的进一步代码。
  2. 如何在 C# 中捕获这些不同的信号以显示不同的消息。

或任何解决方法也将不胜感激。 非常感谢。

【问题讨论】:

  • 我刚刚发现如何通过 MySQL SIGNAL sqlstate '45000' SET message_text = msg, mysql_errno = 1001; mysql_errno 发送不同的错误号我可以在 C# 中捕获,但这只能在 catch 块/某些异常中读取。所以我必须使用像 45000 这样的错误信号,但是如果我使用像 01000 这样的非错误信号,我就无法在 catch 块中捕获它。如果我使用一些不会停止触发代码(如 01000)的signal sqlstate,我如何阅读 C# 中的mysql_errno?谢谢

标签: c# mysql .net error-handling triggers


【解决方案1】:

MySQL 中没有特殊的机制。但请尝试以下解决方法:

  1. 设置信号状态01000,然后查看SHOW WARNINGS查询结果。
  2. 使用UDF function 运行共享库中的代码。在文档和互联网中查找示例。

【讨论】:

  • SHOW WARNINGS 将显示当前会话的最后一条消息;如果您从调用 INSERT/UPDATE/DELETE 语句的会话中运行它,那么您将看到警告。
【解决方案2】:

您无法从成功完成的触发器中获得警告; MySQL 不保留它们。在 MySQL 错误跟踪系统中至少提到过几次(参见 herehere):

这不是错误。 SQLSTATE '01xxx' 表示警告和警告 根据 SQL 在触发器执行结束时不保留 标准。

作为替代方案,您可以尝试在触发器中设置变量或临时表并稍后检查:

SET @wrning = "This is a warning";
CREATE TEMPORARY TABLE IF NOT EXISTS trigger_warnings (msg VARCHAR(255));
INSERT INTO trigger_warnings (msg) VALUES ('This is a warning.');
...
SELECT @wrning;
SELECT * FROM trigger_warnings;

【讨论】:

    猜你喜欢
    • 2019-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多