在C#中捕获MySQL触发信号

时间:2013-12-03 07:24:11

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

我想创建一个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#中捕获这些不同的信号以显示不同的消息。
  3. 或任何解决方法也将不胜感激。 非常感谢。

2 个答案:

答案 0 :(得分:0)

MySQL中没有特殊的机制。但尝试这些工作:

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

答案 1 :(得分:0)

您无法从成功完成的触发器获得警告; 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;