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

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

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

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

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

МСУ

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

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

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

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

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

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

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

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

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

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

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

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


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