clr 触发器回滚的问题

cxczqfrx 2016-06-08 04:02:50
以下一个触发器,是用于判断表的F_DATE 字段(类型 SMALLDATETIME)是不是小于2016-06-01,如小于该日期就禁止插入和更新,全部代码如下
using System;
using System.Data;
using System.ComponentModel;
using System.Data.SqlClient;
using Microsoft.SqlServer.Server;
using System.Data.SqlTypes;
using System.Transactions;

public partial class Triggers
{
public static void TR_IU_CX_T_PROD_EFFICIENCY()
{
using (SqlConnection connection = new SqlConnection(@"context connection=true"))
{
SqlCommand command;
SqlDataReader reader;
DateTime dt;
connection.Open();
command = new SqlCommand(@"SELECT F_DATE FROM INSERTED", connection);
reader = command.ExecuteReader();
reader.Read();
dt = (DateTime)reader[0];
reader.Close();

if (dt < DateTime.Parse("2016-06-01"))
{
try
{
Transaction trans = Transaction.Current;
SqlContext.Pipe.Send("日期不能小于2016-06-01");
trans.Rollback();
}
catch (SqlException ex)
{
}
}
connection.Close();
}
}
}
该代码在插入日期小于2016-06-01的数据时,会拦截操作,提示“日期不能小于2016-06-01”,但同时报错:

消息 3991,级别 16,状态 1,过程 TR_IU_CX_T_PROD_EFFICIENCY,第 5 行
在进入用户定义的例程、触发器或聚合 "TR_IU_CX_T_PROD_EFFICIENCY" 前处于活动状态的上下文事务在其中已终止,这是不允许的。请更改应用程序逻辑以强制实施严格的事务嵌套。
语句已终止。

不明白上述语句错在哪里?应如何更改?

...全文
196 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
cxczqfrx 2016-06-22
  • 打赏
  • 举报
回复
很折腾了一段时间,从微软网站看到 https://msdn.microsoft.com/zh-cn/library/ms131093(v=sql.110).aspx 貌似这个是属于正常的
starseeker7 2016-06-09
  • 打赏
  • 举报
回复
没环境,从错误信息上来说,是事务异常了 你尝试拿掉你的抛出信息,只运行rollback会提示错误吗? 若不会提示错误,尝试将抛出信息放在rollback后面 若会提示错误,则尝试简化整个triger,和调用端逻辑,看看是哪导致的rollback异常
cxczqfrx 2016-06-08
  • 打赏
  • 举报
回复
忘记说了,数据库是sqlserve 2008 R2

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧