From 720960af14612c42604919cae80d06b05c95175d Mon Sep 17 00:00:00 2001 From: 28810 <28810@YEXIANGQIN> Date: Wed, 11 Mar 2020 14:06:28 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E4=BC=98=E5=8C=96=20BulkCopy=20=E9=BB=98?= =?UTF-8?q?=E8=AE=A4=E6=8F=92=E5=85=A5=E8=87=AA=E5=A2=9E=E9=94=AE=EF=BC=9B?= =?UTF-8?q?=20-=20=E4=BC=98=E5=8C=96=20BulkCopy=20=E5=AF=B9=E5=8F=AF?= =?UTF-8?q?=E7=A9=BA=E7=B1=BB=E5=9E=8B=E7=9A=84=E5=B1=9E=E6=80=A7=E5=A4=84?= =?UTF-8?q?=E7=90=86=EF=BC=9B#227?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Internal/CommonProvider/InsertProvider.cs | 18 +++++++++++++----- .../FreeSqlMySqlConnectorGlobalExtensions.cs | 4 ++-- .../PostgreSQLExtensions.cs | 4 ++-- .../SqlServerExtensions.cs | 4 ++-- 4 files changed, 19 insertions(+), 11 deletions(-) diff --git a/FreeSql/Internal/CommonProvider/InsertProvider.cs b/FreeSql/Internal/CommonProvider/InsertProvider.cs index 794bd98e..7553b8be 100644 --- a/FreeSql/Internal/CommonProvider/InsertProvider.cs +++ b/FreeSql/Internal/CommonProvider/InsertProvider.cs @@ -544,24 +544,32 @@ namespace FreeSql.Internal.CommonProvider { var dt = new DataTable(); dt.TableName = TableRuleInvoke(); + var dtCols = new List>(); foreach (var col in _table.ColumnsByPosition) { if (col.Attribute.IsIdentity && _insertIdentity == false) continue; if (col.Attribute.IsIdentity == false && _ignore.ContainsKey(col.Attribute.Name)) continue; - dt.Columns.Add(col.Attribute.Name, col.Attribute.MapType); + dt.Columns.Add(col.Attribute.Name, col.Attribute.MapType.NullableTypeOrThis()); + dtCols.Add(NaviteTuple.Create(col, col.Attribute.MapType.NullableTypeOrThis(), col.Attribute.MapType.IsNullableType())); } if (dt.Columns.Count == 0) return dt; + var didx = 0; foreach (var d in _source) { var row = new object[dt.Columns.Count]; var rowIndex = 0; - foreach (var col in _table.ColumnsByPosition) + foreach (var col in dtCols) { - if (col.Attribute.IsIdentity && _insertIdentity == false) continue; - if (col.Attribute.IsIdentity == false && _ignore.ContainsKey(col.Attribute.Name)) continue; - row[rowIndex++] = col.GetMapValue(d); + var val = col.Item1.GetMapValue(d); + if (col.Item3 == true) + { + if (val == null) throw new Exception($"[{didx}].{col.Item1.CsName} 值不可为 null;DataTable 限制不可使用 int?/long? 可空类型,IInsert.ToDataTable 将映射成 int/long,因此不可接受 null 值"); + val = Utils.GetDataReaderValue(col.Item2, val); + } + row[rowIndex++] = val; } dt.Rows.Add(row); + didx++; } return dt; } diff --git a/Providers/FreeSql.Provider.MySqlConnector/FreeSqlMySqlConnectorGlobalExtensions.cs b/Providers/FreeSql.Provider.MySqlConnector/FreeSqlMySqlConnectorGlobalExtensions.cs index 6b22af02..c262fa0e 100644 --- a/Providers/FreeSql.Provider.MySqlConnector/FreeSqlMySqlConnectorGlobalExtensions.cs +++ b/Providers/FreeSql.Provider.MySqlConnector/FreeSqlMySqlConnectorGlobalExtensions.cs @@ -31,7 +31,7 @@ public static class FreeSqlMySqlConnectorGlobalExtensions var insert = that as FreeSql.MySql.Curd.MySqlInsert; if (insert == null) throw new Exception("ExecuteMySqlBulkCopy 是 FreeSql.Provider.MySqlConnector 特有的功能"); - var dt = that.ToDataTable(); + var dt = that.InsertIdentity().ToDataTable(); if (dt.Rows.Count == 0) return; Action writeToServer = bulkCopy => @@ -90,7 +90,7 @@ public static class FreeSqlMySqlConnectorGlobalExtensions var insert = that as FreeSql.MySql.Curd.MySqlInsert; if (insert == null) throw new Exception("ExecuteMySqlBulkCopyAsync 是 FreeSql.Provider.MySqlConnector 特有的功能"); - var dt = that.ToDataTable(); + var dt = that.InsertIdentity().ToDataTable(); if (dt.Rows.Count == 0) return; Func writeToServer = bulkCopy => diff --git a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLExtensions.cs b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLExtensions.cs index b2c75baf..61eb3101 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLExtensions.cs +++ b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLExtensions.cs @@ -52,7 +52,7 @@ public static partial class FreeSqlPostgreSQLGlobalExtensions var insert = that as FreeSql.PostgreSQL.Curd.PostgreSQLInsert; if (insert == null) throw new Exception("ExecutePgCopy 是 FreeSql.Provider.PostgreSQL 特有的功能"); - var dt = that.ToDataTable(); + var dt = that.InsertIdentity().ToDataTable(); if (dt.Rows.Count == 0) return; Action binaryImport = conn => @@ -124,7 +124,7 @@ public static partial class FreeSqlPostgreSQLGlobalExtensions var insert = that as FreeSql.PostgreSQL.Curd.PostgreSQLInsert; if (insert == null) throw new Exception("ExecutePgCopyAsync 是 FreeSql.Provider.PostgreSQL 特有的功能"); - var dt = that.ToDataTable(); + var dt = that.InsertIdentity().ToDataTable(); if (dt.Rows.Count == 0) return; Func binaryImportAsync = async conn => { diff --git a/Providers/FreeSql.Provider.SqlServer/SqlServerExtensions.cs b/Providers/FreeSql.Provider.SqlServer/SqlServerExtensions.cs index 6315b9fe..47b1752f 100644 --- a/Providers/FreeSql.Provider.SqlServer/SqlServerExtensions.cs +++ b/Providers/FreeSql.Provider.SqlServer/SqlServerExtensions.cs @@ -70,7 +70,7 @@ public static partial class FreeSqlSqlServerGlobalExtensions var insert = that as FreeSql.SqlServer.Curd.SqlServerInsert; if (insert == null) throw new Exception("ExecuteSqlBulkCopy 是 FreeSql.Provider.SqlServer 特有的功能"); - var dt = that.ToDataTable(); + var dt = that.InsertIdentity().ToDataTable(); if (dt.Rows.Count == 0) return; Action writeToServer = bulkCopy => @@ -145,7 +145,7 @@ public static partial class FreeSqlSqlServerGlobalExtensions var insert = that as FreeSql.SqlServer.Curd.SqlServerInsert; if (insert == null) throw new Exception("ExecuteSqlBulkCopyAsync 是 FreeSql.Provider.SqlServer 特有的功能"); - var dt = that.ToDataTable(); + var dt = that.InsertIdentity().ToDataTable(); if (dt.Rows.Count == 0) return; Func writeToServerAsync = bulkCopy =>