|
корректная обработка ошибки SQL в С#
|
|||
---|---|---|---|
#18+
Добрый день! Никак не могу заставить процедуру работать в нужном режиме: Есть csv-файл. Есть sql-процедура, выполняющая insert в таблицу. Необходимо в цикле по всем строкам файла присваивать параметрам процедуры вставки в таблицу данные из считанной строки (чтение строки вне вопроса) и запускать процедуру. Проблема в том, что если в sql - процедуре возникает ошибка "Cannot insert dublicate value..." - (а она бывает периодически, т.к. файл создается по принципу append и мне нужно загрузить из него только новые строки) то валится код C# в блоке try. Думал сделать try catch в самой процедуре SQL. Но теперь ругачка "Uncommitable transaction is detected at the end of the batch" Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50.
Это процедура вставки в таблицу Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34.
... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2018, 15:11 |
|
корректная обработка ошибки SQL в С#
|
|||
---|---|---|---|
#18+
Евгенич, Убери хранимку. Она у тебя ничего не делает. Или учеба? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2018, 15:16 |
|
корректная обработка ошибки SQL в С#
|
|||
---|---|---|---|
#18+
Petro123, хранимка используется во многих местах, хотелось иметь стандартный код по модификации этой таблицы. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2018, 15:19 |
|
корректная обработка ошибки SQL в С#
|
|||
---|---|---|---|
#18+
Евгенич, Нельзя пустые try делать. На ветку субд за подробностями. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2018, 16:13 |
|
корректная обработка ошибки SQL в С#
|
|||
---|---|---|---|
#18+
Евгенич, Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49.
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34.
... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2018, 16:16 |
|
корректная обработка ошибки SQL в С#
|
|||
---|---|---|---|
#18+
ЕвгеничДобрый день! Никак не могу Имхую, что это - плохо catch (Exception ex) { trans.Rollback(); } как и само открытие транзакции для одной процедуры. Процедура сама должна открывать и обрабатывать транзакции. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2018, 16:29 |
|
корректная обработка ошибки SQL в С#
|
|||
---|---|---|---|
#18+
Row by row is slow by slow. Здесь нужно: 1. CSV залить в DataTable. 2. На одном коннекте создать временную таблицу, залить туда данные из DataTable c помощью SqlBulkLoad, одним инсертом перелить данные из временной таблицы в рабочую. И никаких транзакций не потребуется. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2018, 16:54 |
|
корректная обработка ошибки SQL в С#
|
|||
---|---|---|---|
#18+
Евгенич, Конкретно для вашего примера - транзакция мне кажется лишней. Ну обвалится инсерт - ну бог с ним. Мне, например, совершенно непонятно, что откатывать то взад если операция инсерт не прошла. Файл csv не удалится. Значит следующим проходом по csv файлам он пройдет. Если конечно запись с таким ключом не существует. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2018, 16:55 |
|
корректная обработка ошибки SQL в С#
|
|||
---|---|---|---|
#18+
Всем спасибо! Убрал транзакцию, поставил where not exists условие в хранимку. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2018, 17:27 |
|
корректная обработка ошибки SQL в С#
|
|||
---|---|---|---|
#18+
Я бы попробовал вот это . Хранимки с table-value параметрами из ADO.NET можно вызывать . ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2018, 18:27 |
|
корректная обработка ошибки SQL в С#
|
|||
---|---|---|---|
#18+
fkthatЯ бы попробовал вот это . Хранимки с table-value параметрами из ADO.NET можно вызывать . Table-valued параметр по сути - табличная переменная, со всеми её нюансами в плане оценки оптимизатором cardinality, row estimations, итд. Плюс такие нюансы, как невозможность проальтерить UDTT - только drop/create. В общем, я бы сто раз подумал, прежде чем связываться с этим хозяйством. В то время как обычные временные таблицы этих недостатков лишены. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.02.2018, 06:08 |
|
корректная обработка ошибки SQL в С#
|
|||
---|---|---|---|
#18+
Евгенич, Забыл написать, хорошая практика не удалять(File.Delete(file); файл после успешной передачи данны, а перенести в какую-нить папку, например, Archive. Еще, для полноты картины, завести папку Reject - и туда собирать не отработанные файлы. Это как бы дополнительное логирование в системе. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.02.2018, 04:16 |
|
корректная обработка ошибки SQL в С#
|
|||
---|---|---|---|
#18+
Сон Веры ПавловныTable-valued параметр по сути - табличная переменная, со всеми её нюансами в плане оценки оптимизатором cardinality, row estimations, итд. Плюс такие нюансы, как невозможность проальтерить UDTT - только drop/create. В общем, я бы сто раз подумал, прежде чем связываться с этим хозяйством. В то время как обычные временные таблицы этих недостатков лишены. Да, это понятно, я не бог весть какой DBA, точнее совсем не DBA. Я просто к тому, что TVP позволяют отправить кучу данных на сервер одним запросом вместо того чтобы дергать его отдельно для каждой записи. Мы как-то, в допотопные еще времена, когда TVP не было, XML параметры для этого использовали. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2018, 03:32 |
|
корректная обработка ошибки SQL в С#
|
|||
---|---|---|---|
#18+
fkthatДа, это понятно, я не бог весть какой DBA, точнее совсем не DBA. Я просто к тому, что TVP позволяют отправить кучу данных на сервер одним запросом вместо того чтобы дергать его отдельно для каждой записи. Мы как-то, в допотопные еще времена, когда TVP не было, XML параметры для этого использовали. Мы тоже использовали XML - на больших данных это сильно просаживает производительность. А как отправить кучу данных разом на сервер для последующей обработки, я писал выше: 21167520 - временная таблица +SqlBulkCopy. И по производительности это самый лучший вариант, т.к. SqlBulkCopy - это managed-обертка над bulk insert, делающая вставку данных с максимальной скоростью и минимальным журналированием. Плюс возможность потом обвесить эту временную таблицу нужными индексами (у табличных переменных, как и у UDTT, индексы возможны только как реализация primary key/unique constraint), плюс нормальное вычисление оптимизатором статистики по этой таблице, итд итп. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2018, 06:12 |
|
корректная обработка ошибки SQL в С#
|
|||
---|---|---|---|
#18+
Сон Веры ПавловныА как отправить кучу данных разом на сервер для последующей обработки, я писал выше: 21167520 - временная таблица +SqlBulkCopy. И по производительности это самый лучший вариант, т.к. SqlBulkCopy - это managed-обертка над bulk insert, делающая вставку данных с максимальной скоростью и минимальным журналированием. Плюс возможность потом обвесить эту временную таблицу нужными индексами (у табличных переменных, как и у UDTT, индексы возможны только как реализация primary key/unique constraint), плюс нормальное вычисление оптимизатором статистики по этой таблице, итд итп. Да, посмотрел в доки, прикольно, буду теперь знать. Я просто раньше что-то думал, что BULK INSERT может только с локального (для сервера) файла загружать. Оказывается, по крайней мере с .NET клиента можно в него запульнуть сразу массив данных с клиента. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2018, 12:12 |
|
|
start [/forum/topic.php?fid=20&fpage=34&tid=1399500]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
34ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
48ms |
get tp. blocked users: |
2ms |
others: | 312ms |
total: | 438ms |
0 / 0 |