如何判断SqlBulkCopy操作是否插入值

时间:2014-03-20 20:38:39

标签: c# sqlbulkcopy

我有一个插入的SqlBulkCopy方法。它所插入的目标表具有已定义的唯一键约束,因此批量复制不会插入重复项。但由于限制仅在数据库级别,我无法以编程方式验证插入是否已完成。这是我的方法:

string connect = "user id=*********; password=*******; server=.\\SQLEXPRESS;database=*********;";
    using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connect, SqlBulkCopyOptions.UseInternalTransaction))
    {
        bulkCopy.DestinationTableName = "dbo.BaseTermPrice";
        bulkCopy.ColumnMappings.Add("BaseID", "BaseID");
        bulkCopy.ColumnMappings.Add("ContractDate", "ContractDate");
        bulkCopy.ColumnMappings.Add("TermID", "TermID");
        bulkCopy.ColumnMappings.Add("Price", "Price");
        bulkCopy.ColumnMappings.Add("PeakType", "PeakType");
        try
        {
            // Write from the source to the destination.
            bulkCopy.WriteToServer(ds.Tables[0]);
        }
        catch (SqlException ex)
        {
            success = false;
            logger.Error(ex.Message);
        }
        catch (Exception ex)
        {
            success = false;
            logger.Error(ex.Message);
        }
    }

当没有插入时,这里没有例外。我如何确定这一点,以便我可以通知用户他正在尝试插入重复项?

我的唯一键约束:

ALTER TABLE [dbo].[BaseTermPrice] ADD  CONSTRAINT [UK_BaseTermPrice] UNIQUE NONCLUSTERED 
(
[BaseID] ASC,
[ContractDate] ASC,
[TermID] ASC,
[PeakType] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, 
SORT_IN_TEMPDB = OFF, 
IGNORE_DUP_KEY = OFF, 
ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, 
ALLOW_PAGE_LOCKS  = ON) 
ON [PRIMARY]
GO

1 个答案:

答案 0 :(得分:1)

  

当没有插入时,没有例外。

您是否制作了唯一索引IGNORE_DUP_KEY = ON?这是不好的做法,因为它隐藏了数据错误。

如果此选项为false,则批量插入操作抛出异常。如果它似乎没有,那么您的错误记录将被破坏。设置调试器以中断所有异常。