2013-05-09 78 views
0

我正在使用Mysql數據庫(版本5.5)的C#應用​​程序。 我遇到了一個問題,我需要捕獲Mysql中發生的異常。 不管它是在Mysql還是在dotNet中被捕獲都沒關係。問題是我想在發生異常/錯誤時回滾我以前的所有工作;無論是MySqlException還是自定義的。 是的,我嘗試使用TransactionScopeMySqlTransaction,但它並沒有回滾我的工作。 如果有人有任何想法或建議,請指導我。 謝謝。在mysql中的交易

編輯:代碼

 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(); 

這是Procdeure:

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 
+0

如果您使用InnoDB表,我看不到任何TransactionScope不起作用的原因。如果你使用MyISAM表,它將不會工作,因爲MyISAM沒有事務。 – 2013-05-09 07:59:53

+0

請與SO分享您的相關代碼。我們不能說沒有什麼可看的東西,爲什麼它不適合你。 – Raxr 2013-05-09 08:00:11

+0

所有的InnoDB表格 – vaibhav 2013-05-09 08:00:20

回答

1

我把這件事帶給了我的上司。 嗯,我們現在有MySQL版本5.6,其中有一個簡單易用的方法來實現TRY-CATCH場景。現在,我在所有存儲過程中都使用了以下代碼。

DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN 
ROLLBACK; 
GET DIAGNOSTICS CONDITION 1 
strErrorMessage = MESSAGE_TEXT; 
SET intException = 53300; 
END; 
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類。

+0

我也嘗試過使用MySqlTransaction,並且在我的問題中也提到了它,只是我沒有在這裏寫過代碼。 感謝您的鏈接,讓我看看這個,看看它是否有效 – vaibhav 2013-05-09 08:27:16