Если скорость имеет значение (и IMHO это всегда должно быть), и вы используете PostgreSQL
(который вам кажется), то вам следует взглянуть на функцию COPY . Одиночные вставки всегда медленнее, чем массовая операция.
Относительно легко обернуть функцию COPY
в c #. Ниже приведена сокращенная версия метода, чтобы проиллюстрировать это. Мой метод проходит по строкам DataTable
, но его легко адаптировать к ситуации с файлом (ReadLine()
и т. Д.).
using (var pgConn = new NpgsqlConnection(myPgConnStr))
{
using (var writer = pgConn.BeginBinaryImport("COPY " + destinationTableName + " (" + commaSepFieldNames + ") FROM STDIN (FORMAT BINARY)"))
{
//Loop through data
for (int i = 0; i < endNo; i++)
{
writer.StartRow();
//inner loop through fields
for (int j = 0; j < fieldNo; j++)
{
//test for null
if (true)
{
writer.WriteNull();
}
else
{
//Write data using column types
writer.Write(value, type);
}
}
}
writer.Complete();
}
}
WriteNull()
- это специальный метод для правильного добавления NULL
в поток, в противном случае вы используете Write<T>()
. Последний имеет три перегрузки: только значение, значение с перечислением типа или значение с именем типа. Я предпочитаю использовать перечисление. commaSepFieldNames - это список имен полей, разделенных запятыми. Другие переменные должны (я надеюсь) быть самоочевидными.