- 优化 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(); var dt = new DataTable();
dt.TableName = TableRuleInvoke(); dt.TableName = TableRuleInvoke();
var dtCols = new List<NaviteTuple<ColumnInfo, Type, bool>>();
foreach (var col in _table.ColumnsByPosition) foreach (var col in _table.ColumnsByPosition)
{ {
if (col.Attribute.IsIdentity && _insertIdentity == false) continue; if (col.Attribute.IsIdentity && _insertIdentity == false) continue;
if (col.Attribute.IsIdentity == false && _ignore.ContainsKey(col.Attribute.Name)) 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; if (dt.Columns.Count == 0) return dt;
var didx = 0;
foreach (var d in _source) foreach (var d in _source)
{ {
var row = new object[dt.Columns.Count]; var row = new object[dt.Columns.Count];
var rowIndex = 0; var rowIndex = 0;
foreach (var col in _table.ColumnsByPosition) foreach (var col in dtCols)
{ {
if (col.Attribute.IsIdentity && _insertIdentity == false) continue; var val = col.Item1.GetMapValue(d);
if (col.Attribute.IsIdentity == false && _ignore.ContainsKey(col.Attribute.Name)) continue; if (col.Item3 == true)
row[rowIndex++] = col.GetMapValue(d); {
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); dt.Rows.Add(row);
didx++;
} }
return dt; return dt;
} }

View File

@ -31,7 +31,7 @@ public static class FreeSqlMySqlConnectorGlobalExtensions
var insert = that as FreeSql.MySql.Curd.MySqlInsert<T>; var insert = that as FreeSql.MySql.Curd.MySqlInsert<T>;
if (insert == null) throw new Exception("ExecuteMySqlBulkCopy 是 FreeSql.Provider.MySqlConnector 特有的功能"); 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; if (dt.Rows.Count == 0) return;
Action<MySqlBulkCopy> writeToServer = bulkCopy => Action<MySqlBulkCopy> writeToServer = bulkCopy =>
@ -90,7 +90,7 @@ public static class FreeSqlMySqlConnectorGlobalExtensions
var insert = that as FreeSql.MySql.Curd.MySqlInsert<T>; var insert = that as FreeSql.MySql.Curd.MySqlInsert<T>;
if (insert == null) throw new Exception("ExecuteMySqlBulkCopyAsync 是 FreeSql.Provider.MySqlConnector 特有的功能"); 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; if (dt.Rows.Count == 0) return;
Func<MySqlBulkCopy, Task> writeToServer = bulkCopy => 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>; var insert = that as FreeSql.PostgreSQL.Curd.PostgreSQLInsert<T>;
if (insert == null) throw new Exception("ExecutePgCopy 是 FreeSql.Provider.PostgreSQL 特有的功能"); 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; if (dt.Rows.Count == 0) return;
Action<NpgsqlConnection> binaryImport = conn => Action<NpgsqlConnection> binaryImport = conn =>
@ -124,7 +124,7 @@ public static partial class FreeSqlPostgreSQLGlobalExtensions
var insert = that as FreeSql.PostgreSQL.Curd.PostgreSQLInsert<T>; var insert = that as FreeSql.PostgreSQL.Curd.PostgreSQLInsert<T>;
if (insert == null) throw new Exception("ExecutePgCopyAsync 是 FreeSql.Provider.PostgreSQL 特有的功能"); 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; if (dt.Rows.Count == 0) return;
Func<NpgsqlConnection, Task> binaryImportAsync = async conn => 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>; var insert = that as FreeSql.SqlServer.Curd.SqlServerInsert<T>;
if (insert == null) throw new Exception("ExecuteSqlBulkCopy 是 FreeSql.Provider.SqlServer 特有的功能"); 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; if (dt.Rows.Count == 0) return;
Action<SqlBulkCopy> writeToServer = bulkCopy => Action<SqlBulkCopy> writeToServer = bulkCopy =>
@ -145,7 +145,7 @@ public static partial class FreeSqlSqlServerGlobalExtensions
var insert = that as FreeSql.SqlServer.Curd.SqlServerInsert<T>; var insert = that as FreeSql.SqlServer.Curd.SqlServerInsert<T>;
if (insert == null) throw new Exception("ExecuteSqlBulkCopyAsync 是 FreeSql.Provider.SqlServer 特有的功能"); 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; if (dt.Rows.Count == 0) return;
Func<SqlBulkCopy, Task> writeToServerAsync = bulkCopy => Func<SqlBulkCopy, Task> writeToServerAsync = bulkCopy =>