PostgreSQL ha sicuramente una copia di massa (in realtà si chiama copy
), e ha un bel wrapper per .NET. Se stai caricando, vuoi usare NpgsqlCopyIn
e se stai estraendo dati puoi usare NpgsqlCopyOut.
La tua domanda è un po' vaga sui dettagli:non conosco i campi nel tuo datatable o nulla sul tuo database reale, quindi prendi questo come un breve esempio su come inserire dati in blocco in una tabella usando C#/PostgreSQL:
NpgsqlCopyIn copy = new NpgsqlCopyIn("copy table1 from STDIN WITH NULL AS '' CSV;",
conn);
copy.Start();
NpgsqlCopySerializer cs = new NpgsqlCopySerializer(conn);
cs.Delimiter = ",";
foreach (var record in RecordList)
{
cs.AddString(record.UserId);
cs.AddInt32(record.Age);
cs.AddDateTime(record.HireDate);
cs.EndRow();
}
cs.Close();
copy.End();
-- Modifica 27/08/2019 --
Il costrutto per Npgsql è completamente cambiato. Di seguito è riportato un boilerplate per lo stesso esempio sopra, utilizzando l'importazione binaria (è disponibile anche il testo):
using (var writer = conn.BeginBinaryImport(
"copy user_data.part_list from STDIN (FORMAT BINARY)"))
{
foreach (var record in RecordList)
{
writer.StartRow();
writer.Write(record.UserId);
writer.Write(record.Age, NpgsqlTypes.NpgsqlDbType.Integer);
writer.Write(record.HireDate, NpgsqlTypes.NpgsqlDbType.Date);
}
writer.Complete();
}