繁体   English   中英

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

[英]How to fill PostgreSQL tables from C# DataSet via Npgsql?

我在C#中有一个DataSet ,其中DataTables和PostgreSQL数据库具有相同的表。 我将DataTable填充到代码中,并希望将DataTable INSERT Postgresql数据库。 我试图用简单的SQL查询( INSERT INTO... )插入它,但是如果我有数百个成千上万的表,那将非常慢。 我猜想,使用DataAdapter可以提高性能,但是我无法理解,它是如何工作的。 您能在两个案例中向我解释一下吗?

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

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

或者,也许您可​​以建议阅读一些内容以学习DataAdapters ...无论如何,谢谢。

除了很小的数据集之外,您将很难击败NpgSql的copy实现的性能,这可以通过NpgSqlConnection对象的BeginTextImport方法来实现。

因此,无论您的数据在应用程序中如何存在,如果通过文本导入(复制)转储输出,则输出都应该是zippy。 这是如何使用数据表的示例。 请记住,数据表中的列和表中的列必须对齐-否则,您需要以一种或另一种方式进行管理。

前提是NpgSql 3.1.9或更高版本。

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));
    }
}

至于重复...哇,那真的取决于。 定义“重复项”。 如果只是“选择不同”,那么它还取决于您期望的重复次数。 如果数量较少,则List.Exists<>可能就足够了,但是如果您有大量的重复对象,则使用Dictionary对象可以使每次查找的效率大大提高。 典型的列表查找为O(n),而字典查找将为O(1)。

这是上述示例的字典不同插入的一个蛮力示例:

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);
        }
    }
}

免责声明:这是一个记忆猪。 如果您可以通过其他任何方式来管理重复项,或者保证数据的顺序,那么还有许多其他选择。

如果您不能(或不会)使用大容量副本插入,则有助于提高性能的方法是将插入内容包装到事务中( NpgSqlTransaction ),但是对于成千上万的行,我看不到为什么将。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM