вставьте данные в дб в производительности цикла

Я пытаюсь записать Приложение Windows, чтобы получить данные из От Fox Pro DB и вставить его к SQL-серверу 2 008 дб.

Я написал код, но он работает очень медленный. rowsCount больше чем 1 миллион Моих кодов ниже:

OleDbConnection cn = new OleDbConnection(foxProConnectionString);
SqlConnection cSql = new SqlConnection(sqlServerConnectionString);
cSql.Open();

OleDbCommand ocmd = new OleDbCommand("Select * from " + table, cn);
OleDbDataAdapter sda = new OleDbDataAdapter(ocmd);
DataTable dt = new DataTable();
sda.Fill(dt);
SqlCommand mySqlcmd = new SqlCommand();
mySqlcmd.Connection = cSql;

for (int i = 0; i < dt.Rows.Count; i++)
{
   mySqlcmd.CommandText = "INSERT INTO sqlTable (column1, column2, column3) VALUES ("+dt.Rows[i][dt.Columns.IndexOf("column1")] + ",'" 
                                           + DoOper1(dt.Rows[i]dt.Columns.IndexOf("column2")]) + "','"
                                           + dt.Rows[i][dt.Columns.IndexOf("column3")] + "')";

   mySqlcmd.ExecuteNonQuery();
}

Я не могу использовать массовое копирование, порядок столбцов базы данных может отличаться в некоторых исходных таблицах. Также я получаю ошибку:

CLR не мог перейти от контекста COM 0x54afe8 к контексту COM 0x54b158 в течение 60 секунд. Поток, который владеет целевым контекстом/квартирой, скорее всего, или делает, не нагнетание ожидают или обработка очень длинной рабочей операции, не качая сообщения Windows. Эта ситуация обычно оказывает отрицательное влияние производительности и может даже привести к становлению приложения не быстро реагирующее или использование памяти, накапливающееся постоянно со временем. Для предотвращения этой проблемы все потоки единственной потоковой квартиры (STA) должны использовать нагнетание, ожидают примитивы (такие как CoWaitForMultipleHandles) и обычно качают сообщения во время длительных операций.

как я могу решить ряд моей проблемы?

1
задан loviji 14 August 2010 в 12:24
поделиться

1 ответ

Я думаю, что есть способы обойти ваши проблемы с массовым копированием, и я предлагаю вам / нам работать над ними, а не пытаться выяснить, почему медленная технология работает медленно. Вы говорите, что причины, по которым вы не можете использовать массовое копирование, заключаются в том, что порядок столбцов базы данных может отличаться в некоторых исходных таблицах. Мой ответ: какое это имеет значение? Если вы используете объект SqlBulkCopy, разве у вас нет полного контроля над тем, как столбцы в исходных таблицах сопоставляются со столбцами в целевых таблицах? (Вы пробовали использовать объект SqlBulkCopy?) Вы также говорите, что можете получить сообщение об ошибке о неотвечающей программе. Похоже, это связано с COM. Я не понимаю, почему это может быть проблемой при массовом копировании того, что требует еще больше времени для выполнения. При необходимости вам, возможно, придется выполнять операции массового копирования небольшими партиями (возможно, полностью завершить / зафиксировать пакеты перед началом следующего?), Чтобы ваша программа не «потеряла контроль» над своим выполнением.Помогает ли это или вызывает дополнительные вопросы, которые могут привести к ответу?

Изменить: Вы можете сделать что-то подобное?

System.Data.SqlClient.SqlBulkCopy bc = new System.Data.SqlClient.SqlBulkCopy("...");

// Begin a loop to process managable-size batches of source data.

using (System.Data.DataTable dtTarget = new System.Data.DataTable("sqlTable"))
{

   // Populate dtTarget with the data as it should appear
   // on the SQL Server side.
   // If the mapping is simple, you may be able to use
   // bc.ColumnMappings instead of manually re-mapping.

   bc.DestinationTableName = "sqlTable";
   bc.WriteToServer(dtTarget);
}

// End loop.
2
ответ дан 2 September 2019 в 22:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: