Exemple #1
0
        public void BulkCopy(IDbConnection conn, DataTable dataTable, string tableName)
        {
            var columnNameList = (from DataColumn column in dataTable.Columns select column.ColumnName.ToLower())
                                 .ToList();
            var columnNames = columnNameList.Aggregate((l, n) => l + "," + n);
            var cn          = conn as NpgsqlConnection;

            if (conn == null)
            {
                return;
            }

            using (var writer = cn.BeginBinaryImport($"COPY {tableName}({columnNames}) FROM STDIN (FORMAT BINARY)"))
            {
                foreach (DataRow dr in dataTable.Rows)
                {
                    writer.StartRow();
                    foreach (var columnName in columnNameList)
                    {
                        if (string.IsNullOrWhiteSpace(dr[columnName].ToString()))
                        {
                            writer.WriteNull();
                        }
                        else
                        {
                            if (dataTable.Columns[columnName].DataType == typeof(int) || dataTable.Columns[columnName].DataType == typeof(long))
                            {
                                writer.Write(ConvertUtil.ConToInt(dr[columnName]), NpgsqlTypes.NpgsqlDbType.Integer);
                            }
                            else if (dataTable.Columns[columnName].DataType == typeof(decimal))
                            {
                                writer.Write(ConvertUtil.ConToDecimal(dr[columnName]), NpgsqlTypes.NpgsqlDbType.Numeric);
                            }
                            else if (dataTable.Columns[columnName].DataType == typeof(DateTime))
                            {
                                writer.Write(ConvertUtil.ConToDateTime(dr[columnName]), NpgsqlTypes.NpgsqlDbType.Timestamp);
                            }
                            else if (dataTable.Columns[columnName].DataType == typeof(JToken))
                            {
                                writer.Write(dr[columnName].ToString(), NpgsqlTypes.NpgsqlDbType.Jsonb);
                            }
                            else
                            {
                                writer.Write(dr[columnName].ToString());
                            }
                        }
                    }
                }
                writer.Complete();
            }
        }