我有一个插入的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
答案 0 :(得分:1)
当没有插入时,没有例外。
您是否制作了唯一索引IGNORE_DUP_KEY = ON
?这是不好的做法,因为它隐藏了数据错误。
如果此选项为false,则批量插入操作将抛出异常。如果它似乎没有,那么您的错误记录将被破坏。设置调试器以中断所有异常。