|
|
|
Перенос большого количества данных из приложения в MS SQL Server 2005
|
|||
|---|---|---|---|
|
#18+
Добрый день. Сразу прошу прощения если данный вопрос подымался... искал долго не нашел. Спорить что хорошо искал, тоже не буду...) Среда разработки VS 2008 Sp1 Приложения переносит данные (по различным шаблонам) из EXCEL в MS SQL Server (в данный момент это 2005) В начале я переношу данные в DataTable, потом создаю временную таблицу по шаблону (данный момент необходим, так как на уровне серверной процедуры идет проверка вносимых данных) и переношу содержимое DataTable в таблицу на сервере. Для этого этапа я написал процедуру которая отлично работает, почти всегда. Но бывает ситуации когда данных "очень много" (практика показала это когда много текстовой информации) происходит ошибка: ContextSwitchDeadlock was detectedMessage: CLR не удалось перейти из COM-контекста 0x31a5c8 в COM-контекст 0x31a738 за 60 секунд. Наиболее вероятно, что поток, владеющий контекстом/апартаментом назначения, находится в режиме ожидания или выполнения очень длительной операции без прокачки сообщений Windows. Обычно эта ситуация отрицательно влияет на производительность и даже может привести к зависанию приложения или чрезмерному расходованию памяти. Чтобы избежать этой проблемы, все потоки однопоточного апартамента (STA) должны использовать примитивы ожидания для прокачки (например, CoWaitForMultipleHandles) и периодически прокачивать сообщения во время длительных операций. При нажатии F5 приложение продолжает выполняться, т.е. переносить данные с того момента с которого запнулось. Обработка ошибок имеется, но почему-то вываливается на отладку. Вопрос: что тут не так? Код: plaintext 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. 51. 52. 53. 54. Где objDT as [DataTable] - данные objDS_Template as [DataTable] - макет таблицы 3 колонки (0 - Поле, 1 - ТипДанных, 2 - Длина, 3 - НулЪ) strQuery as [String] - строка запроса пример: Код: plaintext "Data Source=SQLServer;Initial Catalog=Base;Integrated Security=True" или "Data Source=SQLServer;Initial Catalog=Base;Persist Security Info=True;User ID=user;password=123;" --------------------------------- С уважением Ди ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2009, 12:43 |
|
||
|
Перенос большого количества данных из приложения в MS SQL Server 2005
|
|||
|---|---|---|---|
|
#18+
У меня такая же проблема, только я использую C#. Ридером читаю DBF и гружу в ORACLE Что делать, я не знаю. try { condbf.Open(); //Открываем conora.Open(); string sqldbf = "SELECT NAME, SOCR, CODE, INDEX, GNINMB, UNO, OCATD, STATUS FROM KLADR.dbf"; string sqlora = "SELECT * FROM KLADR1"; string dbfcount = "SELECT COUNT(*) FROM KLADR.dbf"; OdbcCommand comdbf = new OdbcCommand(sqldbf, condbf); OdbcCommand comcount = new OdbcCommand(dbfcount, condbf); OracleCommand comora = new OracleCommand(sqlora, conora); //Создаем команду OdbcDataReader drdbf = comdbf.ExecuteReader(); progressBar1.Value = 0; progressBar1.Minimum = 0; progressBar1.Maximum = (int)comcount.ExecuteScalar(); progressBar1.Step = 1; while (drdbf.Read()) { //Application.DoEvents(); comora.CommandText = "INSERT INTO KLADR1 (NAME1, SOCR, CODE, INDEX1, GNINMB, UNO, OCATD, STATUS) VALUES ('" + Encoding.GetEncoding(28591).GetString(Encoding.GetEncoding(1251).GetBytes(drdbf.GetValue(0).ToString())) + "', '" + Encoding.GetEncoding(28591).GetString(Encoding.GetEncoding(1251).GetBytes(drdbf.GetValue(1).ToString())) + "', '" + Encoding.GetEncoding(28591).GetString(Encoding.GetEncoding(1251).GetBytes(drdbf.GetValue(2).ToString())) + "', '" + Encoding.GetEncoding(28591).GetString(Encoding.GetEncoding(1251).GetBytes(drdbf.GetValue(3).ToString())) + "', '" + Encoding.GetEncoding(28591).GetString(Encoding.GetEncoding(1251).GetBytes(drdbf.GetValue(4).ToString())) + "', '" + Encoding.GetEncoding(28591).GetString(Encoding.GetEncoding(1251).GetBytes(drdbf.GetValue(5).ToString())) + "', '" + Encoding.GetEncoding(28591).GetString(Encoding.GetEncoding(1251).GetBytes(drdbf.GetValue(6).ToString())) + "', '" + Encoding.GetEncoding(28591).GetString(Encoding.GetEncoding(1251).GetBytes(drdbf.GetValue(7).ToString())) + "')"; comora.ExecuteNonQuery(); progressBar1.Value = progressBar1.Value + progressBar1.Step; } } catch (OdbcException ex1) { if (condbf.State != ConnectionState.Open) { MessageBox.Show("THIS PROGRAM NOT CONNECTION FROM DBF"); } MessageBox.Show(ex1.ToString()); } finally { conora.Close(); conora.Dispose(); condbf.Close(); condbf.Dispose(); } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2010, 14:42 |
|
||
|
Перенос большого количества данных из приложения в MS SQL Server 2005
|
|||
|---|---|---|---|
|
#18+
Игорь86 Код: plaintext Очень плохо. Используйте OracleBulkCopy. P.S. При оформлении кода на форуме, пользуйтесь подсветкой синтаксиса (тег SRC). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2010, 14:49 |
|
||
|
Перенос большого количества данных из приложения в MS SQL Server 2005
|
|||
|---|---|---|---|
|
#18+
Hard_D, Игорь86, Все верно! Вы держите транзакцию открытой непомерное время. Подумайте, оправданно ли это? Если нет возможности применить Bulk - попробуйте разбить данные на блоки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2010, 14:56 |
|
||
|
Перенос большого количества данных из приложения в MS SQL Server 2005
|
|||
|---|---|---|---|
|
#18+
МСУИгорь86 Код: plaintext Очень плохо. Используйте OracleBulkCopy. P.S. При оформлении кода на форуме, пользуйтесь подсветкой синтаксиса (тег SRC). МСУ я на форуме впервые...на будущее буду знать... Тогда вытекающий вопрос - откуда вытащить OracleBulkCopy? И где можно почитать по нему информацию? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2010, 15:02 |
|
||
|
Перенос большого количества данных из приложения в MS SQL Server 2005
|
|||
|---|---|---|---|
|
#18+
Игорь86МСУ я на форуме впервые...на будущее буду знать... Ничего страшного, вливайтесь :) Игорь86Тогда вытекающий вопрос - откуда вытащить OracleBulkCopy? И где можно почитать по нему информацию? На сайте у оракла. Вам понадобится ODP.NET. Вот тут на их форуме было обсуждение про OracleBulkCopy. P.S. Этот булкер работает примерно идентично с вариантом SqlBulkCopy , но только под оракуль. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2010, 15:10 |
|
||
|
Перенос большого количества данных из приложения в MS SQL Server 2005
|
|||
|---|---|---|---|
|
#18+
Oracle .NET Developer Center В релизной доке сказано, что булкер появился в версии ODP.NET 11.1.0.6.20 Version 11.1.0.6.20ADO.NET 2.0 Bulk Copy: Upload large data sets into Oracle from .NET New ODP.NET Features by Release ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2010, 15:15 |
|
||
|
Перенос большого количества данных из приложения в MS SQL Server 2005
|
|||
|---|---|---|---|
|
#18+
МСУ Oracle .NET Developer Center В релизной доке сказано, что булкер появился в версии ODP.NET 11.1.0.6.20 Version 11.1.0.6.20ADO.NET 2.0 Bulk Copy: Upload large data sets into Oracle from .NET New ODP.NET Features by Release У меня студия 2008 а оракловский клиент 10.1.0.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2010, 15:21 |
|
||
|
Перенос большого количества данных из приложения в MS SQL Server 2005
|
|||
|---|---|---|---|
|
#18+
Нужен ODP.NET не ниже 11.1.0.6.20. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2010, 15:24 |
|
||
|
Перенос большого количества данных из приложения в MS SQL Server 2005
|
|||
|---|---|---|---|
|
#18+
МСУ, Спасибо за помощь...буду пробовать дальше разбираться ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2010, 15:27 |
|
||
|
Перенос большого количества данных из приложения в MS SQL Server 2005
|
|||
|---|---|---|---|
|
#18+
МСУНужен ODP.NET не ниже 11.1.0.6.20. Я скачал с сайта ODTwithODAC1110621 А что делать? Устанавливать клиент нужно? я просто не сталкивался никогда с таким ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2010, 09:27 |
|
||
|
Перенос большого количества данных из приложения в MS SQL Server 2005
|
|||
|---|---|---|---|
|
#18+
Игорь86, "скачать" - этого мало, нужно, разумеется, устанавливать :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2010, 09:34 |
|
||
|
Перенос большого количества данных из приложения в MS SQL Server 2005
|
|||
|---|---|---|---|
|
#18+
МСУ, У меня установлен Oracle - OraClient10g_home1 Скаченный мною архив с установочными файлами не подпортит работу того что есть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2010, 09:37 |
|
||
|
Перенос большого количества данных из приложения в MS SQL Server 2005
|
|||
|---|---|---|---|
|
#18+
Не подпортит :) Клиент - это клиент, ODP.NET - это сборки для работы с дотнета с оракулем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2010, 10:01 |
|
||
|
Перенос большого количества данных из приложения в MS SQL Server 2005
|
|||
|---|---|---|---|
|
#18+
МСУ, "ODP.NET - это сборки для работы с дотнета с оракулем..." ...которые могут работать и без клиента ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2010, 10:08 |
|
||
|
Перенос большого количества данных из приложения в MS SQL Server 2005
|
|||
|---|---|---|---|
|
#18+
КурдльМСУ, "ODP.NET - это сборки для работы с дотнета с оракулем..." ...которые могут работать и без клиента ;) У меня дургая информация, коррелирующая с этой . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2010, 10:22 |
|
||
|
Перенос большого количества данных из приложения в MS SQL Server 2005
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2010, 10:23 |
|
||
|
Перенос большого количества данных из приложения в MS SQL Server 2005
|
|||
|---|---|---|---|
|
#18+
МСУ, а там надо ставить oracle client или oracle server??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2010, 10:29 |
|
||
|
Перенос большого количества данных из приложения в MS SQL Server 2005
|
|||
|---|---|---|---|
|
#18+
Игорь, задайте эти вопросы на профилирующем форуме Oracle . И читайте доки! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2010, 10:37 |
|
||
|
|

start [/forum/topic.php?fid=17&msg=36826055&tid=1351105]: |
0ms |
get settings: |
8ms |
get forum list: |
18ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
167ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
50ms |
get tp. blocked users: |
1ms |
| others: | 206ms |
| total: | 468ms |

| 0 / 0 |
