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 =>