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