У меня есть метод 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