2017-08-20 46 views
0

我想在使用批量复制将它们插入数据库后更新插入的记录。我想写一个触发器在插入后为我执行更新。如果我一个接一个地插入记录,但在批量复制插入后拒绝工作,则触发器正常工作。批量复制后触发器根本不会触发

我在连接中添加了触发器(SqlBulkCopyOptions.FireTriggers & SqlBulkCopyOptions.CheckConstraints),但它仍然不起作用。

这是我写的触发器:

CREATE TRIGGER [dbo].[Trigger_assessment] 
ON [dbo].[assessment] 
AFTER INSERT 
AS 
BEGIN 
    SET NoCount ON 

    Declare @a as int 
    Declare @b as int 

    SELECT @b = exam_score, @a = ca 
    FROM inserted 

    UPDATE assessment 
    SET final_ca = ca*0.3, final_exam = exam_score * 0.7, 
     f_score = ((ca * 0.3) + (exam_score * 0.7)) 
    WHERE exam_score = @b AND ca = @a 
END 

,并批量复制:

 Dim koneksi_excel As New  System.Data.OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0; Data Source='" & path1.Text & " '; Extended Properties=""Excel 12.0 xml;HDR=yes""") 

    koneksi_excel.Open() 
    Dim query_excel As String = "select * from [Sheet1$]" 

    Dim cmd As OleDbCommand = New OleDbCommand(query_excel, koneksi_excel) 

    Dim rd As OleDbDataReader 

    Dim koneksi As New SqlConnection() 

    If mysqlconnectionstring.State = ConnectionState.Closed Then 
     mysqlconnectionstring.Open() 
    End If 
    Using BulkCopy As SqlBulkCopy = New SqlBulkCopy(ConfigurationManager.ConnectionStrings("SchoolDBConnectionString").ConnectionString.ToString, SqlBulkCopyOptions.FireTriggers & SqlBulkCopyOptions.CheckConstraints) 

     BulkCopy.DestinationTableName = "dbo.assessment" 

     Try 

      rd = cmd.ExecuteReader 
      BulkCopy.WriteToServer(rd) 
      rd.Close() 
      mysqlconnectionstring.Close() 
      MsgBox("Data import succesful", MsgBoxStyle.Information, "imports") 
      path.Text = "" 
     Catch ex As Exception 
      MsgBox(ex.ToString) 
     Finally 
      mysqlconnectionstring.Close() 
     End Try 
    End Using 

我想帮忙,请,谢谢

+2

你的触发器有** **主要中的缺陷,你似乎认为它会被称为**每行一次** - 这是* *不是**的情况。触发器将在每个语句**触发一次**,所以如果你的引发这个触发器触发的INSERT语句插入了25行,你将触发**触发**一次,但是随后插入的伪表将会包含25行。您的代码在这25行中选择哪一个? 'SELECT @b = exam_score,@a = ca从插入' - 它是非确定性的,你将得到**一个任意的行**,你将**忽略所有其他行**。你需要重写你的触发器来考虑这个问题! –

回答

2

inserted虚表是一个表,所以可以有多行。如果您执行批量插入(或更新),则此表中将有多行。你需要考虑到这一点。你可以在这里阅读更多关于:Use the inserted and deleted Tables


你纠正触发是:

CREATE TRIGGER [dbo].[Trigger_assessment] 
ON [dbo].[assessment] 
after insert 
AS 
BEGIN 
    SET NoCount ON 

    update 
     assessment 
    set 
     final_ca=a.ca*0.3, 
     final_exam=a.exam_score*0.7, 
     f_score=((a.ca*0.3)+(a.exam_score*0.7)) 
    from 
     assessment AS a 
     inner join inserted as i on 
      i.ca=a.ca and 
      i.exam_score=a.exam_score; 
END