Мне придется второй SqlBulkCopy.Я использую его для загрузки миллионов или строк в EAV DB через интерфейс IDataReader, и это делается менее чем за минуту.Пример того, как я его использую, выглядит следующим образом:
private void SaveAll(List<MyBO> bos, IDbConnection conn, IDbTransaction trans)
{
using (GenericListDataReader<MyBO> reader = new GenericListDataReader<MyBO>((IEnumerable<MyBO>)bos))
{
using (SqlBulkCopy bcp = new SqlBulkCopy(
(SqlConnection)conn, SqlBulkCopyOptions.CheckConstraints | SqlBulkCopyOptions.FireTriggers,
(SqlTransaction)trans))
{
bcp.BulkCopyTimeout = Constants.BULK_COPY_TIMEOUT;
bcp.DestinationTableName = "MainAttr";
SqlBulkCopyColumnMapping mapID =
new SqlBulkCopyColumnMapping("Id", "Id");
bcp.ColumnMappings.Add(mapID);
SqlBulkCopyColumnMapping mainId =
new SqlBulkCopyColumnMapping("Mainid", "MainId");
bcp.ColumnMappings.Add(mainId);
SqlBulkCopyColumnMapping mapCol =
new SqlBulkCopyColumnMapping("Attributecolumn", "AttributeColumn");
bcp.ColumnMappings.Add(mapCol);
SqlBulkCopyColumnMapping mapVal =
new SqlBulkCopyColumnMapping("Attributevalue", "AttributeValue");
bcp.ColumnMappings.Add(mapVal);
SqlBulkCopyColumnMapping mapLoadDate =
new SqlBulkCopyColumnMapping("Loaddate", "LoadDate");
bcp.ColumnMappings.Add(mapLoadDate);
SqlBulkCopyColumnMapping mapLoadBy =
new SqlBulkCopyColumnMapping("Loadby", "LoadBy");
bcp.ColumnMappings.Add(mapLoadBy);
SqlBulkCopyColumnMapping mapDetail =
new SqlBulkCopyColumnMapping("detailid", "DetailId");
bcp.ColumnMappings.Add(mapDetail);
bcp.NotifyAfter = Constants.BULK_COPY_PROGRESS_REPORT;
bcp.SqlRowsCopied += new SqlRowsCopiedEventHandler(bcp_SqlRowsCopied);
bcp.WriteToServer(reader);
}
}
}
Кстати, если вы заинтересованы в том, чтобы узнать больше о ваших параметрах, то на MSDN есть довольно хорошее руководство по загрузке данных;http://msdn.microsoft.com/en-us/library/dd425070(v=sql.100).aspx
Редактировать: Что касается дальнейшего примера GenericListDataReader, посетите следующий сайт;http://www.csvreader.com/posts/generic_list_datareader.php