0

我正在使用 Mysql 数据库(5.5 版)开发 ac# 应用程序。我面临一个问题,我需要捕获 Mysql 中发生的异常。不管是在Mysql中还是在dotNet中都被抓到了。问题是我想在发生异常/错误时回滚我以前的所有工作;无论是 MySqlException 还是自定义的。是的,我尝试使用TransactionScopeMySqlTransaction但它并没有回滚我的工作。如果有人有任何想法或建议,请指导我。谢谢。

编辑:代码

        MySqlConnection con = new MySqlConnection(cnstring);
        if (con.State == ConnectionState.Open)
        {
            con.Close();
        }
        con.Open();
        MySqlCommand cmd;
        TransactionScope ob = new TransactionScope();
        try
        {
            cmd = new MySqlCommand("testProcedureSignal", con);
            cmd.Parameters.Add(new MySqlParameter("pval", 1));
            cmd.Parameters.Add(new MySqlParameter("@intException", MySqlDbType.Int32) { Direction = ParameterDirection.Output });
            cmd.Parameters.Add(new MySqlParameter("@strErrorMessage", MySqlDbType.VarChar) { Direction = ParameterDirection.Output });
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.ExecuteNonQuery();
        }
        catch (MySqlException e)
        {
            con.Close();
            ob.Dispose();
            return;
        }
        ob.Complete();
        con.Close();

这是程序:

CREATE PROCEDURE `testProcedureSignal`(
pval INT,
OUT intException INT,
OUT strErrorMessage VARCHAR(255)
)
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN
ROLLBACK;
END;
SET intException = 100;
START TRANSACTION;
INSERT INTO demo (data) values (intException);
SET intException = intException + 10;
INSERT INTO demo (data) values (intException);
DROP TABLE teeeee;-- this table does not exist
INSERT INTO demo2 (data1,data2) values ('demo2',intException + 10);
SET intException = 111;
SET intException = 2;
COMMIT;
END
4

2 回答 2

1

我把这件事提请我的上级注意。好吧,我们现在有了 MySQL 5.6 版,其中有一种简单易行的方法来实现TRY-CATCH场景。现在,我在所有存储过程中使用以下代码。

DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN
ROLLBACK;
GET DIAGNOSTICS CONDITION 1
strErrorMessage = MESSAGE_TEXT;
SET intException = 53300;
END;
于 2013-05-13T11:39:07.843 回答
0

请查看这篇文章(我通过谷歌找到的,没有隐藏):http: //zetcode.com/db/mysqlcsharptutorial/

向下滚动到“交易支持”部分。您的代码中没有使用 .Commit() 或 .Rollback() 方法。

您必须使用MySqlTransaction该类来实现您正在寻找的结果。您致电.Commit().Rollback()相应地查看我在上面发布的链接以获取所有必需的信息和片段。

检查此链接:http ://dev.mysql.com/doc/refman/5.0/es/connector-net-examples-mysqltransaction.html 。它描述了MySqlTransaction类及其方法和一些最佳实践。

于 2013-05-09T08:06:28.467 回答