我在Visual Studio 2010中开发的CLR触发器出现问题,然后部署在SQL Server 2012中。
触发器触发FOR INSERT,UPDATE,所以我的触发器中有这样的结构:
...
//TriggerManager is a class that handle the execution of
//queries and the trigger context connection
using (TriggerManager t = new TriggerManager())
{
inserted = @"SELECT * FROM INSERTED";
DataSet lastdoc = new DataSet();
using (SqlCommand cmd = new SqlCommand(inserted))
{
//The method QueryDataAdapter return a dataset filled with the command cmd.
lastdoc = t.QueryDataAdapter(cmd);
}
//Here i need to store the whole record to use it in
//further elaborations.
//And here the execption is raised.
DataRow insertedRow = lastdoc.Tables[0].Rows[0];
int docid = (int)insertedRow["field1"];
string obj = insertedRow["field2"].ToString();
switch (triggerContext.TriggerAction)
{
case TriggerAction.Insert:
...
break;
case TriggerAction.Update:
...
break;
}
所以问题是触发器触发,尝试获取Row [0],但是exeption消息是"位置0和#34;没有Row。但奇怪的是,无论如何都应该执行触发器应该执行的操作(并且DataRow插入行是详细说明所必需的。)
我尝试插入一个像
这样的控件if (lastdoc.Tables.Count >0 && lastdoc.Tables[0].Rows.Count >0)
{
...
}
在尝试获取行之前。但是通过这种控制,触发器不会执行其操作。
似乎触发器在失败后再次触发,但为什么在(理论上)第一次尝试时发现表INSERTED为空?