分析概括CLR触发器的例子
创始人
2024-06-09 11:30:37
0

CLR有很多值得学习的地方,这里我们主要介绍创建CLR对象,包括介绍CLR触发器等方面,希望你可以从中学到东西。

一 创建CLR对象

1.在解决方案中添加新的C#SQL数据库项目,命名为“ServiceClient”
2.为你的目标数据库选择或添加注释。(如果未被提示:右击ServiceClient项目,选择属性,数据库,浏览并选择你的连接)
3.为创建的服务添加声明
1)在解决方案浏览器中右击“service”项目,选择“调试”>“Start New Instance”
2)服务运行:右击“ServiceClient”项目,选择“Add Service Reference”
3)在“Service URI”中输入:http://localhost:8000/services
4)点击“OK”

二 CLR触发器案例

  1. [Microsoft.SqlServer.Server.SqlTrigger(Name="Trigger1",Target="ERP_STOCKYaoHuoDingDan",Event="FORINSERT")]  
  2. publicstaticvoidDingDanIDSameGongYingShangGUIDMustSame()  
  3. {  
  4. using(SqlConnectionconnection=newSqlConnection(@"contextconnection=true"))  
  5. {  
  6. connection.Open();  
  7. SqlCommandcommand=newSqlCommand(@"SELECTCOUNT(A.DingDanID)FROMERP_STOCKYaoHuoDingDanASA,INSERTEDASBWHEREA.DingDanID=B.DingDanIDANDA.GongYingShangGUID<>B.GongYingShangGUID",connection);  
  8. inti=(int)command.ExecuteScalar();  
  9. if(i>0)  
  10. {  
  11. try  
  12. {  
  13. //如果要插入的记录不合法,则回滚.  
  14. TransactionTransactiontrans=Transaction.Current;  
  15. trans.Rollback();  
  16. }  
  17. catch(SqlExceptionex)  

当在触发器内部调用Transaction.Rollback方法时,将引发异常并显示不明确的错误消息,必须在try/catch块中包装此方法或命令。您会看到如下错误消息:

  1. Msg6549,Level16,State1,Proceduretrig_InsertValidator,Line0A.NETFrameworkerroroccurredduringexecutionofuserdefinedroutineoraggregate  
  2. 'trig_InsertValidator':System.Data.SqlClient.SqlException:Transactionisnotallowedtorollbackinsideauserdefinedroutine,  
  3. triggeroraggregatebecausethetransactionisnotstartedinthatCLRlevel.Changeapplicationlogictoenforcestricttransactionnesting…Usertransaction,ifany,willberolledback.  
  4. 此异常是预期行为,需要try/catch块才能继续执行代码。当完成执行触发器代码时,将引发另一个异常。  
  5. Msg3991,Level16,State1,Proceduretrig_InsertValidator,Line1Thecontexttransactionwhichwasactivebeforeenteringuserdefinedroutine,  
  6. triggeroraggregate"trig_InsertValidator"hasbeenendedinsideofit,whichisnotallowed.Changeapplicationlogictoenforcestricttransactionnesting.  
  7. Thestatementhasbeenterminated.此异常也是预期行为。  
  8. }  
  9. }  
  10. connection.Close();  
  11. }  

调用CLR触发器的例子

尽管引发了两个异常,仍可以回滚事务,并且更改不会提交到表中。

  1. try  
  2. {  
  3. //用到此触发器的方法  
  4. }  
  5. catch(SqlExceptionex)  
  6. {  
  7. if(ex.Number==3991)  
  8. {  
  9. LabelInfor.Text="同一张订单必须是同一家供应商。";  
  10. }  
  11. }  
  12. catch(Exceptionex)  
  13. {  
  14. }  

【编辑推荐】

  1. 使用CLR存储过程来传回讯息实战案例
  2. 经典案例之创建CLR存储过程
  3. 概括Visual Studio CLR调试器两种方法
  4. Visual Studio中SQL SERVER CLR代码调试工具使用讲解
  5. CLR函数压缩NTEXT类型字段实例讲解

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...