- 优化 BulkCopy 默认插入自增键;

- 优化 BulkCopy 对可空类型的属性处理;#227
This commit is contained in:
28810 2020-03-11 14:06:28 +08:00
parent 9f0e28bcac
commit 720960af14
4 changed files with 19 additions and 11 deletions

View File

@ -544,24 +544,32 @@ namespace FreeSql.Internal.CommonProvider
{
var dt = new DataTable();
dt.TableName = TableRuleInvoke();
var dtCols = new List<NaviteTuple<ColumnInfo, Type, bool>>();
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} 值不可为 nullDataTable 限制不可使用 int?/long? 可空类型IInsert.ToDataTable 将映射成 int/long因此不可接受 null 值");
val = Utils.GetDataReaderValue(col.Item2, val);
}
row[rowIndex++] = val;
}
dt.Rows.Add(row);
didx++;
}
return dt;
}

View File

@ -31,7 +31,7 @@ public static class FreeSqlMySqlConnectorGlobalExtensions
var insert = that as FreeSql.MySql.Curd.MySqlInsert<T>;
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<MySqlBulkCopy> writeToServer = bulkCopy =>
@ -90,7 +90,7 @@ public static class FreeSqlMySqlConnectorGlobalExtensions
var insert = that as FreeSql.MySql.Curd.MySqlInsert<T>;
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<MySqlBulkCopy, Task> writeToServer = bulkCopy =>

View File

@ -52,7 +52,7 @@ public static partial class FreeSqlPostgreSQLGlobalExtensions
var insert = that as FreeSql.PostgreSQL.Curd.PostgreSQLInsert<T>;
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<NpgsqlConnection> binaryImport = conn =>
@ -124,7 +124,7 @@ public static partial class FreeSqlPostgreSQLGlobalExtensions
var insert = that as FreeSql.PostgreSQL.Curd.PostgreSQLInsert<T>;
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<NpgsqlConnection, Task> binaryImportAsync = async conn =>
{

View File

@ -70,7 +70,7 @@ public static partial class FreeSqlSqlServerGlobalExtensions
var insert = that as FreeSql.SqlServer.Curd.SqlServerInsert<T>;
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<SqlBulkCopy> writeToServer = bulkCopy =>
@ -145,7 +145,7 @@ public static partial class FreeSqlSqlServerGlobalExtensions
var insert = that as FreeSql.SqlServer.Curd.SqlServerInsert<T>;
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<SqlBulkCopy, Task> writeToServerAsync = bulkCopy =>