sqlbulkcopy с уведомлением после и транзакциями

У меня есть следующий код, который я пытаюсь использовать, чтобы проверить, возможно ли иметь транзакции и свойство notifyAfter, используемое для создания события (я уже пытался заменить событие на одно, которое я создаю/поднимаю сам, но оно возникает только после все строки скопированы). Следующая ссылка предполагает, что это невозможно

MSDN

У кого-нибудь был опыт с этим? Спасибо

            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                connection.Open();
                {
                        try
                        {
                            using (SqlBulkCopy copy = new SqlBulkCopy(connectionString, SqlBulkCopyOptions.KeepIdentity |SqlBulkCopyOptions.UseInternalTransaction))

                            {
                                //Column mapping for the required columns.
                                for (int count = 0; count < numberOfColumns; count++)
                                {
                                    copy.ColumnMappings.Add(count, count);
                                }

                                //SQLBulkCopy parameters.
                                copy.DestinationTableName = dataTableName;
                                copy.BatchSize = batchSize;

                                copy.SqlRowsCopied += new SqlRowsCopiedEventHandler(OnSqlRowsCopied);
                                copy.NotifyAfter = 5;

                                copy.WriteToServer(fullDataTable);
                            }
                        }
                        //Error(s) occured while trying to commit the transaction.
                        catch (InvalidOperationException transactionEx)
                        {
                            //uploadTransaction.Rollback();
                            status = "The current transaction has been rolled back due to an error. \n\r" + transactionEx.Message;
                            MessageBox.Show(status, "Error Message:");
                            alreadyCaught = true;
                            throw;
                        }
                }

person Hans Rudel    schedule 15.03.2012    source источник


Ответы (1)


Я бы предположил, что из-за транзакции обработка происходит только после того, как транзакция будет зафиксирована, поэтому вы не получите событие до тех пор, пока это не произойдет.

person Tom Jones    schedule 15.03.2012
comment
Приведенный выше код вызывает событие. Если я установлю для размера пакета значение 10, а для свойства NotifyAfter — значение 5, событие будет вызвано. Первый раз = ничего в БД. 2-й = 10 рядов и так далее, пока не будут добавлены все ряды. Итак, я предполагаю, что транзакция не работает, но я не уверен, как это проверить. Спасибо за вашу помощь. - person Hans Rudel; 16.03.2012