偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

CLR觸發(fā)器實(shí)戰(zhàn)演練

開發(fā) 后端
CLR觸發(fā)器的原理比較簡(jiǎn)單,但是實(shí)現(xiàn)起來要花一番功夫,筆者總結(jié)了以下經(jīng)驗(yàn),還有一個(gè)異常的實(shí)例。

CLR觸發(fā)器的原理比較簡(jiǎn)單,但是實(shí)現(xiàn)起來要花一番功夫,筆者總結(jié)了以下經(jīng)驗(yàn),還有一個(gè)異常的實(shí)例。

CLR觸發(fā)器實(shí)現(xiàn)代碼:

  1. [Microsoft.SqlServer.Server.SqlTrigger(Name = "Trigger1"Target = 
  2. "ERP_STOCKYaoHuoDingDan"Event = "FOR INSERT")]  
  3. public static void DingDanIDSameGongYingShangGUIDMustSame()  
  4. {  
  5.   using (SqlConnection connection = new SqlConnection
  6. (@"context connection=true"))  
  7.   {  
  8.     connection.Open();  
  9.     SqlCommand command = new SqlCommand(@"SELECT COUNT(A.DingDanID)
  10.  FROM ERP_STOCKYaoHuoDingDan AS
  11.  A,INSERTED AS B WHERE A.DingDanID=B.DingDanID AND
  12.  A.GongYingShangGUID<>B.GongYingShangGUID", connection);  
  13.     int i=(int)command.ExecuteScalar();  
  14.      if (i>0)  
  15.    {  
  16.     try  
  17.      {  
  18.       //如果要插入的記錄不合法,則回滾.   
  19.        Transaction trans = Transaction.Current;  
  20.        trans.Rollback();  
  21.      }  
  22.      catch (SqlException ex)  
  23.        {  
  24.               connection.Close(); 
  25.        }  
  26. }
  27. }
  28. }
  29.  

當(dāng)在CLR觸發(fā)器內(nèi)部調(diào)用 Transaction.Rollback 方法時(shí),將引發(fā)異常并顯示不明確的錯(cuò)誤消息,必須在try/catch 塊中包裝此方法或命令。您會(huì)看到如下錯(cuò)誤消息:

Msg 6549, Level 16, State 1, Procedure trig_InsertValidator, Line 0 A .NET Framework error occurred during execution of user defined routine or aggregate 'trig_InsertValidator': System.Data.SqlClient.SqlException: Transaction is not allowed to roll back inside a user defined routine, trigger or aggregate because the transaction is not started in that CLR level. Change application logic to enforce strict transaction nesting… User transaction, if any, will be rolled back.

此異常是預(yù)期行為,需要 try/catch 塊才能繼續(xù)執(zhí)行代碼。當(dāng)完成執(zhí)行CLR觸發(fā)器代碼時(shí),將引發(fā)另一個(gè)異常。

Msg 3991, Level 16, State 1, Procedure trig_InsertValidator, Line 1 The context transaction which was active before entering user defined routine, trigger or aggregate "trig_InsertValidator" has been ended inside of it, which is not allowed. Change application logic to enforce strict transaction nesting. The statement has been terminated.
此異常也是預(yù)期行為。

調(diào)用該CLR觸發(fā)器的例子

盡管引發(fā)了兩個(gè)異常,仍可以回滾事務(wù),并且更改不會(huì)提交到表中。

  1. try  
  2. {  
  3.  
  4.     //用到此觸發(fā)器的方法  
  5. }  
  6. catch (SqlException ex)  
  7. {  
  8.    if (ex.Number == 3991)  
  9.    {  
  10.       LabelInfor.Text = "同一張訂單必須是同一家供應(yīng)商。";  
  11.    }  
  12. }  
  13. catch (Exception ex)  
  14. {  
  15.  ......  

以上就是對(duì)CLR觸發(fā)器的實(shí)戰(zhàn)演練。

【編輯推薦】

  1. 淺析C#數(shù)組操作方法
  2. C#數(shù)組操作全面分析
  3. C#數(shù)組和串操作經(jīng)驗(yàn)總結(jié)
  4. 為你解疑:CLR是什么?
  5. 分析與對(duì)比CLR Via C#靜態(tài)構(gòu)造函數(shù)的性能
責(zé)任編輯:阡陌 來源: 新浪博客
相關(guān)推薦

2009-10-22 17:18:20

CLR觸發(fā)器

2021-08-05 07:28:27

SQL觸發(fā)器結(jié)構(gòu)

2011-05-20 14:06:25

Oracle觸發(fā)器

2011-03-28 10:05:57

sql觸發(fā)器代碼

2011-04-14 13:54:22

Oracle觸發(fā)器

2011-05-19 14:29:49

Oracle觸發(fā)器語法

2009-11-18 13:15:06

Oracle觸發(fā)器

2021-07-30 10:33:57

MySQL觸發(fā)器數(shù)據(jù)

2010-10-12 10:04:15

MySQL觸發(fā)器

2010-10-12 10:24:58

mysql觸發(fā)器

2010-05-31 18:06:07

MySQL 觸發(fā)器

2010-05-18 15:58:39

MySQL觸發(fā)器

2011-03-03 09:30:24

downmoonsql登錄觸發(fā)器

2010-05-26 17:57:44

MySQL 觸發(fā)器

2010-04-15 15:32:59

Oracle操作日志

2009-04-07 13:56:03

SQL Server觸發(fā)器實(shí)例

2010-09-13 17:03:34

sql server觸

2010-10-12 10:10:55

mysql觸發(fā)器

2009-12-23 17:49:28

WPF觸發(fā)器

2010-04-23 12:50:46

Oracle觸發(fā)器
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)