powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Перенос большого количества данных из приложения в MS SQL Server 2005
19 сообщений из 19, страница 1 из 1
Перенос большого количества данных из приложения в MS SQL Server 2005
    #36312258
Hard_D
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
Сразу прошу прощения если данный вопрос подымался... искал долго не нашел. Спорить что хорошо искал, тоже не буду...)

Среда разработки 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.
Using objConnection As New SqlClient.SqlConnection(f_SQL_ConnectionString())
    objConnection.Open()
    Dim objCommand As SqlClient.SqlCommand = objConnection.CreateCommand
    Dim objTran As SqlClient.SqlTransaction = objConnection.BeginTransaction("Tran")

    objCommand.Connection = objConnection
    objCommand.Transaction = objTran

    With objDT
        For i As Integer =  0  To .Rows.Count -  1 
            ' очисчаем ошибку
            Err.Clear()
            ' строим страку запроса
            strQ = strQuery
            Try
                For j As Integer =  0  To objDT_Template.Rows.Count -  1 
                    If .Rows(i).Item(j).ToString = "" Then
                        strQ = Replace(strQ, "%" & j & "%", "NULL")
                    Else
                        strV = .Rows(i).Item(j).ToString
                        Select Case objDT_Template.Rows(j).Item( 1 )
                            Case "bigint", "int", "smallint", "tinyint"
                                strQ = Replace(strQ, "%" & j & "%", strV)
                            Case "bit"
                                strQ = Replace(strQ, "%" & j & "%", IIf(strV = "True", "1", "0"))
                            Case "decimal", "numeric", "money", "float", "smallmoney", "real"
                                strQ = Replace(strQ, "%" & j & "%", Replace(strV, ",", "."))
                            Case "datetime", "smalldatetime"
                                strQ = Replace(strQ, "%" & j & "%", f_DateSQL(.Rows(i).Item(j)))
                            Case Else '"char", "varchar", "text", "nchar", "nvarchar", "ntext" и другие не определенные типы
                                strQ = Replace(strQ, "%" & j & "%", "'" & Replace(strV, "'", "''") & "'")
                        End Select
                    End If

                Next

                ' выполняем строку
                Try
                    objCommand.CommandTimeout =  600 
                    objCommand.CommandText = strQ
                    objCommand.ExecuteNonQuery()
                Catch ex As Exception
                    strError = strError & vbCrLf & "№" & Err.Number & ":" & Err.Description
                End Try
            Catch ex As Exception
                strError = strError & vbCrLf & "№" & Err.Number & ":" & Err.Description
                Err.Clear()
            End Try
        Next
    End With

    objTran.Commit()
    objConnection.Close()
End Using

Где
objDT as [DataTable] - данные
objDS_Template as [DataTable] - макет таблицы 3 колонки (0 - Поле, 1 - ТипДанных, 2 - Длина, 3 - НулЪ)
strQuery as [String] - строка запроса
пример:
Код: plaintext
insert into dbo.table(Col1,Col2,Col3) values (% 0 %,% 1 %,% 3 %)
f_SQL_ConnectionString() - функция которая возвращает строку подключения в зависимости от способа идентификации на сервере (NT/SQL)
"Data Source=SQLServer;Initial Catalog=Base;Integrated Security=True" или "Data Source=SQLServer;Initial Catalog=Base;Persist Security Info=True;User ID=user;password=123;"

---------------------------------
С уважением Ди
...
Рейтинг: 0 / 0
Перенос большого количества данных из приложения в MS SQL Server 2005
    #36826005
Игорь86
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня такая же проблема, только я использую 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();
}
...
Рейтинг: 0 / 0
Перенос большого количества данных из приложения в MS SQL Server 2005
    #36826033
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь86
Код: plaintext
INSERT INTO KLADR1 (NAME1, SOCR, ...

Очень плохо. Используйте OracleBulkCopy.
P.S. При оформлении кода на форуме, пользуйтесь подсветкой синтаксиса (тег SRC).
...
Рейтинг: 0 / 0
Перенос большого количества данных из приложения в MS SQL Server 2005
    #36826055
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hard_D,
Игорь86,

Все верно!
Вы держите транзакцию открытой непомерное время.
Подумайте, оправданно ли это?
Если нет возможности применить Bulk - попробуйте разбить данные на блоки.
...
Рейтинг: 0 / 0
Перенос большого количества данных из приложения в MS SQL Server 2005
    #36826070
Игорь86
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУИгорь86
Код: plaintext
INSERT INTO KLADR1 (NAME1, SOCR, ...

Очень плохо. Используйте OracleBulkCopy.
P.S. При оформлении кода на форуме, пользуйтесь подсветкой синтаксиса (тег SRC).

МСУ

я на форуме впервые...на будущее буду знать...

Тогда вытекающий вопрос - откуда вытащить OracleBulkCopy?
И где можно почитать по нему информацию?
...
Рейтинг: 0 / 0
Перенос большого количества данных из приложения в MS SQL Server 2005
    #36826097
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь86МСУ я на форуме впервые...на будущее буду знать...
Ничего страшного, вливайтесь :)

Игорь86Тогда вытекающий вопрос - откуда вытащить OracleBulkCopy?
И где можно почитать по нему информацию?
На сайте у оракла. Вам понадобится ODP.NET. Вот тут на их форуме было обсуждение про OracleBulkCopy.

P.S. Этот булкер работает примерно идентично с вариантом SqlBulkCopy , но только под оракуль.
...
Рейтинг: 0 / 0
Перенос большого количества данных из приложения в MS SQL Server 2005
    #36826114
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...
Рейтинг: 0 / 0
Перенос большого количества данных из приложения в MS SQL Server 2005
    #36826134
Игорь86
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ 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
...
Рейтинг: 0 / 0
Перенос большого количества данных из приложения в MS SQL Server 2005
    #36826145
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужен ODP.NET не ниже 11.1.0.6.20.
...
Рейтинг: 0 / 0
Перенос большого количества данных из приложения в MS SQL Server 2005
    #36826158
Игорь86
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,

Спасибо за помощь...буду пробовать дальше разбираться
...
Рейтинг: 0 / 0
Перенос большого количества данных из приложения в MS SQL Server 2005
    #36827242
Игорь86
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУНужен ODP.NET не ниже 11.1.0.6.20.

Я скачал с сайта ODTwithODAC1110621

А что делать?
Устанавливать клиент нужно?

я просто не сталкивался никогда с таким
...
Рейтинг: 0 / 0
Перенос большого количества данных из приложения в MS SQL Server 2005
    #36827252
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь86, "скачать" - этого мало, нужно, разумеется, устанавливать :)
...
Рейтинг: 0 / 0
Перенос большого количества данных из приложения в MS SQL Server 2005
    #36827255
Игорь86
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,

У меня установлен
Oracle - OraClient10g_home1

Скаченный мною архив с установочными файлами не подпортит работу того что есть?
...
Рейтинг: 0 / 0
Перенос большого количества данных из приложения в MS SQL Server 2005
    #36827297
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не подпортит :) Клиент - это клиент, ODP.NET - это сборки для работы с дотнета с оракулем.
...
Рейтинг: 0 / 0
Перенос большого количества данных из приложения в MS SQL Server 2005
    #36827325
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,

"ODP.NET - это сборки для работы с дотнета с оракулем..."
...которые могут работать и без клиента ;)
...
Рейтинг: 0 / 0
Перенос большого количества данных из приложения в MS SQL Server 2005
    #36827376
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КурдльМСУ, "ODP.NET - это сборки для работы с дотнета с оракулем..."
...которые могут работать и без клиента ;)
У меня дургая информация, коррелирующая с этой .
...
Рейтинг: 0 / 0
Перенос большого количества данных из приложения в MS SQL Server 2005
    #36827379
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Перенос большого количества данных из приложения в MS SQL Server 2005
    #36827399
Игорь86
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,

а там надо ставить oracle client или oracle server???
...
Рейтинг: 0 / 0
Перенос большого количества данных из приложения в MS SQL Server 2005
    #36827429
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь, задайте эти вопросы на профилирующем форуме Oracle . И читайте доки!
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Перенос большого количества данных из приложения в MS SQL Server 2005
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]