Я пытаюсь записать Приложение 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) и обычно качают сообщения во время длительных операций.
как я могу решить ряд моей проблемы?
Я думаю, что есть способы обойти ваши проблемы с массовым копированием, и я предлагаю вам / нам работать над ними, а не пытаться выяснить, почему медленная технология работает медленно. Вы говорите, что причины, по которым вы не можете использовать массовое копирование, заключаются в том, что порядок столбцов базы данных может отличаться в некоторых исходных таблицах. Мой ответ: какое это имеет значение? Если вы используете объект 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.