如何通过Npgsql从C#DataSet填充PostgreSQL表?

时间:2017-10-04 20:42:03

标签: c# postgresql npgsql dataadapter

我在C#中有DataSet DataTables和PostgreSQL数据库有相同的表。我在我的代码中填写DataTable并想要INSERT DataTable到Postgresql DataBase。我尝试使用简单的SQL查询(INSERT INTO...)插入它,但如果我有数千行的数百个表,它会非常慢。我想,使用DataAdapter会提高性能,但我不明白,它是如何工作的。你可以在两个案例中解释我吗?

情形1: 使用DataAdapter将DataSet的表插入Postgresql

情况2: 仅将Dataq中的uniq值插入PostgreSQL(如果数据库中的表具有带uniq键的行且DataTable包含相同的行)

或许你可以建议阅读什么来学习DataAdapters ...无论如何,谢谢。

1 个答案:

答案 0 :(得分:0)

除了非常小的数据集之外,你将很难击败NpgSql的copy实现的性能,这可以通过{{1}的BeginTextImport方法实现。对象。

因此,无论您的应用程序中的数据如何存在,如果您通过文本导入(复制)转储输出,它应该非常活泼。以下是如何使用数据表执行此操作的示例。请记住数据表中的列和表中的列必须排成一行 - 如果没有,则需要管理这种方式或其他方式。

这预示着NpgSql 3.1.9或更高版本。

NpgSqlConnection

至于重复...哇,这真的取决于。定义“重复”。如果它只是“选择不同”,那么它还取决于您期望的重复数量。如果它是一个小数量,object[] outRow = new object[dt.Columns.Count]; using (var writer = conn.BeginTextImport("copy <table> from STDIN WITH NULL AS '' CSV")) { foreach (DataRow rw in dt.Rows) { for (int col = 0; col < dt.Columns.Count; col++) outRow[col] = rw[col]; writer.WriteLine(string.Join(",", outRow)); } } 可能就足够了,但如果你有大量的dupes,一个Dictionary对象会使每次查找更有效率。典型的List查找是O(n),而Dictionary查找是O(1)。

这是上面例子中字典不同插入的一个非常强大的例子:

List.Exists<>

免责声明:这是记忆猪。如果您可以通过任何其他方式管理欺骗,或保证数据的排序,还有许多其他选项。

如果您不能(或不会)使用批量复制插入,那么有助于提高性能的是将插入包装到事务(object[] outRow = new object[dt.Columns.Count]; Dictionary<string, bool> already = new Dictionary<string, bool>(); bool test; using (var writer = conn.BeginTextImport("copy <table> from STDIN WITH NULL AS '' CSV")) { foreach (DataRow rw in dt.Rows) { for (int col = 0; col < dt.Columns.Count; col++) outRow[col] = rw[col]; string output = string.Join(",", outRow); if (!already.TryGetValue(output, out test)) { writer.WriteLine(output); already.Add(output, true); } } } )中,但对于数十万行,我不明白你为什么会这样。