From 17206e8ac9ffc92ed9ce5ed71e505bdae7b186d4 Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Thu, 15 Jun 2023 19:34:56 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E4=BF=AE=E5=A4=8D=20PgCopy=20=E5=A4=84?= =?UTF-8?q?=E7=90=86=20jsonb=20=E7=B1=BB=E5=9E=8B=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98=EF=BC=9B#1532?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Examples/base_entity/Program.cs | 20 +++++++++-- .../PostgreSQLExtensions.cs | 35 +++++++++++++++++-- 2 files changed, 49 insertions(+), 6 deletions(-) diff --git a/Examples/base_entity/Program.cs b/Examples/base_entity/Program.cs index 8ba31a12..97e5214f 100644 --- a/Examples/base_entity/Program.cs +++ b/Examples/base_entity/Program.cs @@ -569,9 +569,9 @@ namespace base_entity //.UseConnectionString(FreeSql.DataType.SqlServer, "Data Source=.;Integrated Security=True;Initial Catalog=freesqlTest;Pooling=true;Max Pool Size=3;TrustServerCertificate=true") - //.UseConnectionString(FreeSql.DataType.PostgreSQL, "Host=192.168.164.10;Port=5432;Username=postgres;Password=123456;Database=tedb;Pooling=true;Maximum Pool Size=2") - ////.UseConnectionString(FreeSql.DataType.PostgreSQL, "Host=192.168.164.10;Port=5432;Username=postgres;Password=123456;Database=toc;Pooling=true;Maximum Pool Size=2") - //.UseNameConvert(FreeSql.Internal.NameConvertType.ToLower) + .UseConnectionString(FreeSql.DataType.PostgreSQL, "Host=192.168.164.10;Port=5432;Username=postgres;Password=123456;Database=tedb;Pooling=true;Maximum Pool Size=2") + //.UseConnectionString(FreeSql.DataType.PostgreSQL, "Host=192.168.164.10;Port=5432;Username=postgres;Password=123456;Database=toc;Pooling=true;Maximum Pool Size=2") + .UseNameConvert(FreeSql.Internal.NameConvertType.ToLower) //.UseConnectionString(FreeSql.DataType.Oracle, "user id=user1;password=123456;data source=//127.0.0.1:1521/XE;Pooling=true;Max Pool Size=2") //.UseNameConvert(FreeSql.Internal.NameConvertType.ToUpper) @@ -602,6 +602,14 @@ namespace base_entity BaseEntity.Initialization(fsql, () => _asyncUow.Value); #endregion + fsql.Insert(new[] + { + new pgjson_copy001{ json = JObject.FromObject(new {x=1,y=2 })}, + new pgjson_copy001{ json = JObject.FromObject(new {x=1,y=2 })}, + new pgjson_copy001{ json = JObject.FromObject(new {x=1,y=2 })}, + new pgjson_copy001{ json = JObject.FromObject(new {x=1,y=2 })}, + }).ExecutePgCopy(); + fsql.CodeFirst.GetTableByEntity(typeof(MFUser)).GetTableRef(nameof(MFUser.ExtInfo), true); fsql.Delete().Where(a => true).ExecuteAffrows(); fsql.Delete().Where(a => true).ExecuteAffrows(); @@ -2446,4 +2454,10 @@ var sql11111 = fsql.Select() public string? Source { get; set; } public DateTime EndTime { get; set; } } + + class pgjson_copy001 + { + public Guid id { get; set; } + public JObject json { get; set; } + } } diff --git a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLExtensions.cs b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLExtensions.cs index f941306f..36c475f1 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLExtensions.cs +++ b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLExtensions.cs @@ -3,6 +3,7 @@ using FreeSql.Internal.CommonProvider; using FreeSql.Internal.Model; using FreeSql.PostgreSQL.Curd; using Npgsql; +using NpgsqlTypes; using System; using System.Collections.Generic; using System.Data; @@ -173,7 +174,21 @@ public static partial class FreeSqlPostgreSQLGlobalExtensions using (var writer = conn.BeginBinaryImport(copyFromCommand.ToString())) { foreach (DataRow item in dt.Rows) - writer.WriteRow(item.ItemArray); + { + writer.StartRow(); + foreach (DataColumn col in dt.Columns) + { + NpgsqlDbType? npgsqlDbType = null; + var trycol = insert._table.Columns[col.ColumnName]; + var tp = insert._orm.CodeFirst.GetDbInfo(trycol.Attribute.MapType)?.type; + if (tp != null) npgsqlDbType = (NpgsqlDbType)tp.Value; + if (npgsqlDbType.HasValue && npgsqlDbType != NpgsqlDbType.Unknown) + writer.Write(item[col.ColumnName], npgsqlDbType.Value); + else + writer.Write(item[col.ColumnName]); + } + //writer.WriteRow(item.ItemArray); #1532 + } writer.Complete(); } copyFromCommand.Clear(); @@ -258,8 +273,22 @@ public static partial class FreeSqlPostgreSQLGlobalExtensions using (var writer = conn.BeginBinaryImport(copyFromCommand.ToString())) { foreach (DataRow item in dt.Rows) - await writer.WriteRowAsync(cancellationToken, item.ItemArray); - writer.Complete(); + { + await writer.StartRowAsync(cancellationToken); + foreach (DataColumn col in dt.Columns) + { + NpgsqlDbType? npgsqlDbType = null; + var trycol = insert._table.Columns[col.ColumnName]; + var tp = insert._orm.CodeFirst.GetDbInfo(trycol.Attribute.MapType)?.type; + if (tp != null) npgsqlDbType = (NpgsqlDbType)tp.Value; + if (npgsqlDbType.HasValue && npgsqlDbType != NpgsqlDbType.Unknown) + await writer.WriteAsync(item[col.ColumnName], npgsqlDbType.Value, cancellationToken); + else + await writer.WriteAsync(item[col.ColumnName], cancellationToken); + } + //await writer.WriteRowAsync(cancellationToken, item.ItemArray); #1532 + } + await writer.CompleteAsync(cancellationToken); } copyFromCommand.Clear(); };