使用npgsql将iEnumerable批量插入/复制到表中

过度

我有一个方法,它接受IEnumerable,并循环遍历IEnumerable,并将每个方法插入数据库的表中。像这样:

    public void Write(IEnumerable<foo> fooData)
    {
            for (var index = 0; index < fooData.Count(); index++)
            {
               var sql = @"insert into foo (col_id, col_name) values (@col_id, col_name)";
            }
    }

foo是一个反映数据库中表的类:

      public class Foo
      {
        public int col_id {get;set;}
        public string col_name {get;set;}
      }

事实证明,如果我的行有成千上万的条目,使用for循环效率不高。当涉及IEnumerable时,复制所有这些数据的更有效方法是什么?

乔纳森·威尔科克

我编写了一个行为类似于Postgres的内置SqlBulkCopy类的类。它包装COPY命令以提供快速上载。IEnumerable的方法如下所示(的用法与此类似DataTable)。

public void WriteToServer<T>(IEnumerable<T> data)
{
    try
    {
        if (DestinationTableName == null || DestinationTableName == "")
        {
            throw new ArgumentOutOfRangeException("DestinationTableName", "Destination table must be set");
        }
        PropertyInfo[] properties = typeof(T).GetProperties();
        int colCount = properties.Length;

        NpgsqlDbType[] types = new NpgsqlDbType[colCount];
        int[] lengths = new int[colCount];
        string[] fieldNames = new string[colCount];

        using (var cmd = new NpgsqlCommand("SELECT * FROM " + DestinationTableName + " LIMIT 1", conn))
        {
            using (var rdr = cmd.ExecuteReader())
            {
                if (rdr.FieldCount != colCount)
                {
                    throw new ArgumentOutOfRangeException("dataTable", "Column count in Destination Table does not match column count in source table.");
                }
                var columns = rdr.GetColumnSchema();
                for (int i = 0; i < colCount; i++)
                {
                    types[i] = (NpgsqlDbType)columns[i].NpgsqlDbType;
                    lengths[i] = columns[i].ColumnSize == null ? 0 : (int)columns[i].ColumnSize;
                    fieldNames[i] = columns[i].ColumnName;
                }
            }

        }
        var sB = new StringBuilder(fieldNames[0]);
        for (int p = 1; p < colCount; p++)
        {
            sB.Append(", " + fieldNames[p]);
        }
        using (var writer = conn.BeginBinaryImport("COPY " + DestinationTableName + " (" + sB.ToString() + ") FROM STDIN (FORMAT BINARY)"))
        {
            foreach (var t in data)
            {
                writer.StartRow();

                for (int i = 0; i < colCount; i++)
                {
                    if (properties[i].GetValue(t) == null)
                    {
                        writer.WriteNull();
                    }
                    else
                    {
                        switch (types[i])
                        {
                            case NpgsqlDbType.Bigint:
                                writer.Write((long)properties[i].GetValue(t), types[i]);
                                break;
                            case NpgsqlDbType.Bit:
                                if (lengths[i] > 1)
                                {
                                    writer.Write((byte[])properties[i].GetValue(t), types[i]);
                                }
                                else
                                {
                                    writer.Write((byte)properties[i].GetValue(t), types[i]);
                                }
                                break;
                            case NpgsqlDbType.Boolean:
                                writer.Write((bool)properties[i].GetValue(t), types[i]);
                                break;
                            case NpgsqlDbType.Bytea:
                                writer.Write((byte[])properties[i].GetValue(t), types[i]);
                                break;
                            case NpgsqlDbType.Char:
                                if (properties[i].GetType() == typeof(string))
                                {
                                    writer.Write((string)properties[i].GetValue(t), types[i]);
                                }
                                else if (properties[i].GetType() == typeof(Guid))
                                {
                                    var value = properties[i].GetValue(t).ToString();
                                    writer.Write(value, types[i]);
                                }


                                else if (lengths[i] > 1)
                                {
                                    writer.Write((char[])properties[i].GetValue(t), types[i]);
                                }
                                else
                                {

                                    var s = ((string)properties[i].GetValue(t).ToString()).ToCharArray();
                                    writer.Write(s[0], types[i]);
                                }
                                break;
                            case NpgsqlDbType.Time:
                            case NpgsqlDbType.Timestamp:
                            case NpgsqlDbType.TimestampTz:
                            case NpgsqlDbType.Date:
                                writer.Write((DateTime)properties[i].GetValue(t), types[i]);
                                break;
                            case NpgsqlDbType.Double:
                                writer.Write((double)properties[i].GetValue(t), types[i]);
                                break;
                            case NpgsqlDbType.Integer:
                                try
                                {
                                    if (properties[i].GetType() == typeof(int))
                                    {
                                        writer.Write((int)properties[i].GetValue(t), types[i]);
                                        break;
                                    }
                                    else if (properties[i].GetType() == typeof(string))
                                    {
                                        var swap = Convert.ToInt32(properties[i].GetValue(t));
                                        writer.Write((int)swap, types[i]);
                                        break;
                                    }
                                }
                                catch (Exception ex)
                                {
                                    string sh = ex.Message;
                                }

                                writer.Write((object)properties[i].GetValue(t), types[i]);
                                break;
                            case NpgsqlDbType.Interval:
                                writer.Write((TimeSpan)properties[i].GetValue(t), types[i]);
                                break;
                            case NpgsqlDbType.Numeric:
                            case NpgsqlDbType.Money:
                                writer.Write((decimal)properties[i].GetValue(t), types[i]);
                                break;
                            case NpgsqlDbType.Real:
                                writer.Write((Single)properties[i].GetValue(t), types[i]);
                                break;
                            case NpgsqlDbType.Smallint:

                                try
                                {
                                    if (properties[i].GetType() == typeof(byte))
                                    {
                                        var swap = Convert.ToInt16(properties[i].GetValue(t));
                                        writer.Write((short)swap, types[i]);
                                        break;
                                    }
                                    writer.Write((short)properties[i].GetValue(t), types[i]);
                                }
                                catch (Exception ex)
                                {
                                    string ms = ex.Message;
                                }

                                break;
                            case NpgsqlDbType.Varchar:
                            case NpgsqlDbType.Text:
                                writer.Write((string)properties[i].GetValue(t), types[i]);
                                break;
                            case NpgsqlDbType.Uuid:
                                writer.Write((Guid)properties[i].GetValue(t), types[i]);
                                break;
                            case NpgsqlDbType.Xml:
                                writer.Write((string)properties[i].GetValue(t), types[i]);
                                break;
                        }
                    }
                }
            }
            writer.Complete();
        }
    }
    catch (Exception ex)
    {
        throw new Exception("Error executing NpgSqlBulkCopy.WriteToServer().  See inner exception for details", ex);
    }
}

您需要首先设置属性DestinationTableName,并且conn必须是打开的连接。

本质上,该方法用于Reflection获取传递列表类型的属性。显然,要填充的表的数据类型必须匹配!编写器通过遍历列表来构建,然后在末尾进行一个批量插入。我可能没有处理您需要的所有类型,但是应该清楚如何添加它们,缺少它们的地方。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从 HashMap 高效批量插入/复制到表中

来自分类Dev

使用C#npgsql驱动程序将文件复制到postgresql中的表中以及使用路径名时如何获取单个\

来自分类Dev

如何使用快速成员将数据批量复制到具有不一致列名的表中?

来自分类Dev

将数据复制到表A中并复制到表B中(是Identity ==是)

来自分类Dev

将行表复制到“新表”中。| jQuery

来自分类Dev

使用VBA将范围从Excel工作表复制到PowerPoint中的表

来自分类Dev

使用自动增量值将一张表复制到mysql中的新表

来自分类Dev

仅将一个表中的某些列复制到另一个表并插入 defa

来自分类Dev

将templete复制到新的工作表中,并使用单元格中的名称

来自分类Dev

将按分组的选择结果复制到表中

来自分类Dev

将粘贴复制到Excel中的新工作表

来自分类Dev

将csv文件复制到PostGIS表中

来自分类Dev

使用phpMyAdmin将存储过程的结果复制到现有表中

来自分类Dev

使用python将csv文件复制到sqlite数据库表中

来自分类Dev

mysql使用PHP将服务器中的表复制到本地服务器

来自分类Dev

如何将文件批量复制到多个子目录中?

来自分类Dev

将DataTable批量复制到MySQL中(类似于System.Data.SqlClient.SqlBulkCopy)

来自分类Dev

Linux根据文件名模式将文件批量复制到目录中

来自分类Dev

将表约束从select *复制到

来自分类Dev

使用C#将访问数据库中的表复制到另一个表中

来自分类Dev

插入新行并使用Excel中的命令/代码将数据从单元格复制到其中

来自分类Dev

Java 使用 Files 将文件复制到 zip 中

来自分类Dev

使用Java将数据从一个表复制到Cassandra中的另一个表

来自分类Dev

如何使用增加的主键将表的数据复制到另一个重复的表中,以及如何使用增加的值将某些列复制到另一个重复表中。在MySQL中

来自分类Dev

使用 shell 脚本从 csv 文件批量复制到 OracleDB

来自分类Dev

如何使用SQL Select插入将行从一个表复制到另一个表

来自分类Dev

使用 VBA 将符合条件的行复制到 Excel 中的两个或多个不同的工作表中

来自分类Dev

如何将单词从分号(;)插入的文件复制到C ++中的数组中?

来自分类Dev

将单元格值复制到新工作表中,但不复制格式

Related 相关文章

  1. 1

    从 HashMap 高效批量插入/复制到表中

  2. 2

    使用C#npgsql驱动程序将文件复制到postgresql中的表中以及使用路径名时如何获取单个\

  3. 3

    如何使用快速成员将数据批量复制到具有不一致列名的表中?

  4. 4

    将数据复制到表A中并复制到表B中(是Identity ==是)

  5. 5

    将行表复制到“新表”中。| jQuery

  6. 6

    使用VBA将范围从Excel工作表复制到PowerPoint中的表

  7. 7

    使用自动增量值将一张表复制到mysql中的新表

  8. 8

    仅将一个表中的某些列复制到另一个表并插入 defa

  9. 9

    将templete复制到新的工作表中,并使用单元格中的名称

  10. 10

    将按分组的选择结果复制到表中

  11. 11

    将粘贴复制到Excel中的新工作表

  12. 12

    将csv文件复制到PostGIS表中

  13. 13

    使用phpMyAdmin将存储过程的结果复制到现有表中

  14. 14

    使用python将csv文件复制到sqlite数据库表中

  15. 15

    mysql使用PHP将服务器中的表复制到本地服务器

  16. 16

    如何将文件批量复制到多个子目录中?

  17. 17

    将DataTable批量复制到MySQL中(类似于System.Data.SqlClient.SqlBulkCopy)

  18. 18

    Linux根据文件名模式将文件批量复制到目录中

  19. 19

    将表约束从select *复制到

  20. 20

    使用C#将访问数据库中的表复制到另一个表中

  21. 21

    插入新行并使用Excel中的命令/代码将数据从单元格复制到其中

  22. 22

    Java 使用 Files 将文件复制到 zip 中

  23. 23

    使用Java将数据从一个表复制到Cassandra中的另一个表

  24. 24

    如何使用增加的主键将表的数据复制到另一个重复的表中,以及如何使用增加的值将某些列复制到另一个重复表中。在MySQL中

  25. 25

    使用 shell 脚本从 csv 文件批量复制到 OracleDB

  26. 26

    如何使用SQL Select插入将行从一个表复制到另一个表

  27. 27

    使用 VBA 将符合条件的行复制到 Excel 中的两个或多个不同的工作表中

  28. 28

    如何将单词从分号(;)插入的文件复制到C ++中的数组中?

  29. 29

    将单元格值复制到新工作表中,但不复制格式

热门标签

归档