首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

SqlBulkCopy 调用触发器后无法复制数据解决方案

2014-01-12 
SqlBulkCopy 调用触发器后无法复制数据运行后没有数据插入数据库表。但是在SQL SERVER中直接批量insert 会

SqlBulkCopy 调用触发器后无法复制数据

运行后没有数据插入数据库表。但是在SQL SERVER中直接批量insert 会触发触发器并插入数据。 
--------------------------------------------------------
C#代码如下。
using (SqlTransaction transaction = connsql.BeginTransaction("T_addqqqqq"))
                {
                    using (SqlBulkCopy bulk = new SqlBulkCopy(connsql, SqlBulkCopyOptions.FireTriggers, transaction))
                    {
                        bulk.BatchSize = 1000;
                        bulk.DestinationTableName = tname;
                        for (int i = 0; i <= jj+1; i++)
                        {
                            bulk.ColumnMappings.Add(dt.Columns[i].ToString(), dt.Columns[i].ToString());
                        }
                        bulk.WriteToServer(dt);
                        dt.Clear();
                        bulk.Close();
                    }
                }
-----------------------------------------------------------------------------------
触发器代码:有重复插入的记录,则删除旧记录(防止重复数据以及更新数据,id 和MAT是主键)
ALTER trigger [dbo].[T_addqqqqq]
on [dbo].[qqqqq]  
 AFTER INSERT  
 --instead of INSERT
as   
DECLARE  @MAT nvarchar(36) ,@id nvarchar(30)
declare @itemnumber int --定义需要循环的次数
declare @tagint int --定义标志字段,用于结束循环
set @tagint=1
         declare myCursor1 scroll  cursor for select MAT, id from inserted
open myCursor1
select @itemnumber = count(*) from inserted
if(@itemnumber>0)
     begin
       while @tagint<=@itemnumber
           begin
fetch  next from  myCursor1 into @MAT, @id
  IF EXISTS ( SELECT 1 FROM qqqqq where @MAT = MAT)
  begin 
  delete qqqqq where MAT = @MAT and id != @id
  end
  set @tagint=@tagint+1
         end
   end
   close myCursor1
----------------------------------------------------------------------
[解决办法]
你跟踪看看dt有数据吗
  
*****************************************************************************
签名档: http://feiyun0112.cnblogs.com/
[解决办法]
应该是的 比如 insert select 就不会执行触发器

或者

delete table where id in(1,2,3,4,5)也不会..

所以 我感觉SqlBulkCopy 应该属于insert select 类型的.

如果你想执行触发器 只能for循环插入了..

热点排行