У меня есть метод 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
Здесь нет никаких исключений, когда вставка не происходит.
Вы сделали уникальный индекс IGNORE_DUP_KEY = ON
? Это плохая практика, поскольку она скрывает ошибки данных.
Если этот параметр является ложным, операция объемной вставки вызовет исключение. Если кажется, что это не так, то ваш журнал ошибок нарушен. Установите отладчик для прерывания всех исключений.