Я не знаю, почему SqlBulkCopy не вставляет все записи из чтения. Код:
using (OleDbDataReader dr1 = cmd.ExecuteReader())
{
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(ss, SqlBulkCopyOptions.TableLock, null))
{
bulkCopy.BulkCopyTimeout = 0;
bulkCopy.BatchSize = 500;
bulkCopy.DestinationTableName = tableName;
try
{
bulkCopy.WriteToServer(dr1);
}
catch (Exception ex)
{
Log.LogSystemLog(ex.ToString());
return false;
}
}
GC.Collect();
dr1.Close();
}
Я хочу, чтобы навалом было около 300 тыс. Записей. Он работает, когда я запускаю это из localhost в одну и ту же базу данных, но когда я запускаю его с сервера, он всегда вставляет записи ~ 7k ... и никакой ошибки или исключения. На сервере доступно 4 ГБ свободной памяти. На локальном хосте ~ 1,5 ГБ.
Я понятия не имею, почему он работает правильно на localhost, но на сервере это не так.
У меня была та же проблема, решена путем добавления следующего в строку подключения.
IMEX = 1
Пример:
string connectionString = "Provider = Microsoft.ACE.OLEDB.12.0;" + "Источник данных =" + Server.MapPath (rutacom) + ";" + "Расширенные свойства = 'Excel 12.0 Xml; HDR = YES; IMEX = 1'";
В моем localhost работала отлично, но не на сервере.
Попробуй :)
Заметки:
"HDR = Yes"; указывает, что первая строка содержит имена столбцов, а не данные. "HDR = No;" указывает на противоположное.
Всегда использовать IMEX = 1 - это более безопасный способ получения данных для столбцов смешанных данных. Рассмотрим сценарий, что один файл Excel может работать нормально, потому что данные этого файла заставляют драйвер угадывать один тип данных, а другой файл, содержащий другие данные, заставляет драйвер угадывать другой тип данных. Это может привести к сбою вашего приложения.