Способ выяснить, вставила ли операция 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

person Sai    schedule 20.03.2014    source источник
comment
может оказаться полезным событие SqlBulkCopy.SqlRowsCopied: msdn.microsoft.com/en-us/library/   -  person Hardrada    schedule 21.03.2014
comment
Что произойдет, если вы попытаетесь вставить повторяющуюся строку в соответствии с этим ограничением?   -  person Lasse V. Karlsen    schedule 21.03.2014
comment
Вот ответ, который я получил в SSMS: Нарушение ограничения UNIQUE KEY 'UK_BaseTermPrice'. Невозможно вставить повторяющийся ключ в объект dbo.BaseTermPrice. Заявление было прекращено.   -  person Sai    schedule 21.03.2014


Ответы (1)


Здесь нет исключения, когда вставка не выполняется.

Вы сделали уникальный индекс IGNORE_DUP_KEY = ON? Это плохая практика, поскольку она скрывает ошибки данных.

Если этот параметр имеет значение false, операция массовой вставки вызовет исключение. Если кажется, что это не так, значит, ваш журнал ошибок не работает. Настройте отладчик на прерывание всех исключений.

person usr    schedule 20.03.2014
comment
Я добавил свое ограничение уникального ключа, где я вижу Ignore_Dup_key = off. Так наверное отладчик? Как мне сделать так, чтобы он не работал при всех исключениях? - person Sai; 21.03.2014
comment
Google, как это сделать .; Вставьте вручную две явно повторяющиеся строки с помощью SSMS. Вы должны получить сообщение об ошибке. Ты? - person usr; 21.03.2014
comment
Да, конечно, выдает ошибку. Когда я выполняю вставку ParametrizedQuery или прямую вставку через SSMS. - person Sai; 21.03.2014
comment
Хорошо, это означает, что индекс работает. Вероятно, данные, которые вы массово вставляете, не соответствуют вашим ожиданиям. Добавьте код отладки: очистите таблицу данных и вручную добавьте две явно конфликтующие строки. Если теперь вы не получите сообщение об ошибке, это будет действительно озадачить. Опять же, настройте ваш отладчик на прерывание всех исключений. - person usr; 21.03.2014
comment
Я установил отладчик, как указано. По-прежнему никаких ошибок. Я только что сделал параметризованную вставку, и было должным образом выброшено исключение. - person Sai; 21.03.2014
comment
Можете ли вы опубликовать точный код, который вы использовали, чтобы попытаться вызвать ошибку повторяющегося ключа с помощью SqlBulkCopy? Может, мы что-нибудь заметим. Эту ошибку сложно поймать. - person usr; 21.03.2014
comment
: Извините, но это была проблема с программированием. Я обрабатывал исключение и возвращал оттуда истину, и отладчик по какой-то причине не прерывал исключение. - person Sai; 21.03.2014
comment
Да, это было одно из моих предположений. Вот почему я копал в этом направлении. Я предполагаю, что вы обнаружили проблему, потому что форсирование ошибки не привело к выводу ошибки. - person usr; 21.03.2014
comment
да. Вставка происходит в веб-службе, и я вызывал ее из надстройки, поэтому отладчик не очень помог, так как я не мог войти в службу. - person Sai; 21.03.2014