Если вы используете неуправляемый клиент Oracle (Oracle.DataAccess), то самый быстрый способ - использовать OracleBulkCopy, как было указано Тариком.
Если вы используете последнюю версию управляемого клиента Oracle (Oracle.ManagedDataAccess), то самый быстрый способ - использовать привязку массива, как указывал Дэмиен. Если вы хотите сохранить код своего приложения в чистоте от особенностей привязки массива, вы можете написать собственную реализацию OracleBulkCopy, используя привязку массива.
Вот пример использования из реального проекта:
var bulkWriter = new OracleDbBulkWriter();
bulkWriter.Write(
connection,
"BULK_WRITE_TEST",
Enumerable.Range(1, 10000).Select(v => new TestData { Id = v, StringValue=v.ToString() }).ToList());
10K записей вставляются за 500 мс!
Вот реализация:
public class OracleDbBulkWriter : IDbBulkWriter
{
public void Write<T>(IDbConnection connection, string targetTableName, IList<T> data, IList<ColumnToPropertyMapping> mappings = null)
{
if (connection == null)
{
throw new ArgumentNullException(nameof(connection));
}
if (string.IsNullOrEmpty(targetTableName))
{
throw new ArgumentNullException(nameof(targetTableName));
}
if (data == null)
{
throw new ArgumentNullException(nameof(data));
}
if (mappings == null)
{
mappings = GetGenericMappings<T>();
}
mappings = GetUniqueMappings<T>(mappings);
Dictionary<string, Array> parameterValues = InitializeParameterValues<T>(mappings, data.Count);
FillParameterValues(parameterValues, data);
using (var command = CreateCommand(connection, targetTableName, mappings, parameterValues))
{
command.ExecuteNonQuery();
}
}
private static IDbCommand CreateCommand(IDbConnection connection, string targetTableName, IList<ColumnToPropertyMapping> mappings, Dictionary<string, Array> parameterValues)
{
var command = (OracleCommandWrapper)connection.CreateCommand();
command.ArrayBindCount = parameterValues.First().Value.Length;
foreach(var mapping in mappings)
{
var parameter = command.CreateParameter();
parameter.ParameterName = mapping.Column;
parameter.Value = parameterValues[mapping.Property];
command.Parameters.Add(parameter);
}
command.CommandText = $@"insert into {targetTableName} ({string.Join(",", mappings.Select(m => m.Column))}) values ({string.Join(",", mappings.Select(m => $":{m.Column}")) })";
return command;
}
private IList<ColumnToPropertyMapping> GetGenericMappings<T>()
{
var accessor = TypeAccessor.Create(typeof(T));
var mappings = accessor.GetMembers()
.Select(m => new ColumnToPropertyMapping(m.Name, m.Name))
.ToList();
return mappings;
}
private static IList<ColumnToPropertyMapping> GetUniqueMappings<T>(IList<ColumnToPropertyMapping> mappings)
{
var accessor = TypeAccessor.Create(typeof(T));
var members = new HashSet<string>(accessor.GetMembers().Select(m => m.Name));
mappings = mappings
.Where(m => m != null && members.Contains(m.Property))
.GroupBy(m => m.Column)
.Select(g => g.First())
.ToList();
return mappings;
}
private static Dictionary<string, Array> InitializeParameterValues<T>(IList<ColumnToPropertyMapping> mappings, int numberOfRows)
{
var values = new Dictionary<string, Array>(mappings.Count);
var accessor = TypeAccessor.Create(typeof(T));
var members = accessor.GetMembers().ToDictionary(m => m.Name);
foreach(var mapping in mappings)
{
var member = members[mapping.Property];
values[mapping.Property] = Array.CreateInstance(member.Type, numberOfRows);
}
return values;
}
private static void FillParameterValues<T>(Dictionary<string, Array> parameterValues, IList<T> data)
{
var accessor = TypeAccessor.Create(typeof(T));
for (var rowNumber = 0; rowNumber < data.Count; rowNumber++)
{
var row = data[rowNumber];
foreach (var pair in parameterValues)
{
Array parameterValue = pair.Value;
var propertyValue = accessor[row, pair.Key];
parameterValue.SetValue(propertyValue, rowNumber);
}
}
}
}
ПРИМЕЧАНИЕ: эта реализация использует пакет Fastmember для оптимизированного доступа к свойствам (намного быстрее, чем отражение)
В браузере:
Firefox есть подключаемый модуль под названием Firebug. Он прост в установке и очень мощный. Это даже лучше в сочетании с «Веб-разработчиком» для Firefox.
Internet Explorer имеет панель инструментов разработчика, которая не так хороша, как Firebug, но достаточно хороша, чтобы проверить, что все еще работает в IE. Кроме того, есть инструмент IE DOM Inspector. Существует также версия Firebug для IE под названием Firebug Lite.
Google Chrome поставляется со встроенными инструментами, аналогичными Firebug. См. Параметр «инструменты-> разработчик» в раскрывающемся меню справа от адресной строки. Это позволяет вам видеть правила CSS, используемые каждым элементом. Он также поддерживает отладку Javascript.
Safari использует инструмент под названием Web Inspector.
Opera имеет встроенную утилиту Dragonfly.
Вы используете Firebug в Firefox, что значительно упрощает отладку.
Если вы не используете Firefox, теперь вы можете получить Firebug Lite , который можно использовать в IE и т. Д.
Вы можете использовать плагин Firebug для Firefox. Это очень полезно для CSS. Вы можете динамически включать и выключать стили и поля из стилей. Это здорово.
Инструменты веб-разработчика, такие как Safari's Web Inspector или Firebug для Firefox , могут помочь вам отладить ваш CSS. Эти инструменты могут показать вам каскад правил, применяемый к определенному элементу, и позволить вам изменить или отключить определенные свойства.
Когда вам нужно отладить проблемы, характерные для IE. Я слышал, как люди говорили инспектор IE DOM не так уж и плохо. Вы также можете попробовать инструменты, описанные в этой публикации .
Сначала используйте Firefox для разработки и тестирования CSS, а затем переключитесь на другие браузеры для тестирования кода. Это общепринятый метод ИМХО. Firebug великолепен, но он работает еще лучше, если объединить его с плагином Web Developer для FF.
Есть отличный сайт , который стоит проверить, с большим количеством информации о разработке CSS и HTML.