/// <summary> /// Runs sql bulk insert using custom IDataReader /// </summary> /// <typeparam name="T"></typeparam> /// <param name="entities"></param> /// <param name="transaction"></param> public override async Task RunAsync <T>(IEnumerable <T> entities, HanaTransaction transaction) { var sqlBulkCopyOptions = ToHanaBulkCopyOptions(Options.BulkCopyOptions); var keepIdentity = (HanaBulkCopyOptions.KeepIdentity & sqlBulkCopyOptions) > 0; using (var reader = new MappedDataReader <T>(entities, this)) { using (var bulkCopy = new HanaBulkCopy(transaction.Connection, sqlBulkCopyOptions, transaction)) { bulkCopy.BulkCopyTimeout = Options.TimeOut; bulkCopy.BatchSize = Options.BatchSize; bulkCopy.DestinationTableName = string.Format("[{0}].[{1}]", reader.SchemaName, reader.TableName); bulkCopy.NotifyAfter = Options.NotifyAfter; if (Options.Callback != null) { bulkCopy.HanaRowsCopied += (sender, args) => { Options.Callback.Invoke(sender, new RowsCopiedEventArgs(args.RowsCopied)); }; } foreach (var kvp in reader.Cols) { if (kvp.Value.IsIdentity && !keepIdentity) { continue; } bulkCopy.ColumnMappings.Add(kvp.Value.ColumnName, kvp.Value.ColumnName); } await bulkCopy.WriteToServerAsync(reader); } } }
/// <summary> /// Runs sql bulk insert using custom IDataReader /// </summary> /// <typeparam name="T"></typeparam> /// <param name="entities"></param> /// <param name="transaction"></param> public override void Run <T>(IEnumerable <T> entities, HanaTransaction transaction) { var sqlBulkCopyOptions = ToHanaBulkCopyOptions(Options.BulkCopyOptions); var keepIdentity = (HanaBulkCopyOptions.KeepIdentity & sqlBulkCopyOptions) > 0; using (var reader = new MappedDataReader <T>(entities, this)) { using (var bulkCopy = new HanaBulkCopy(transaction.Connection, sqlBulkCopyOptions, transaction)) { bulkCopy.BulkCopyTimeout = Options.TimeOut; bulkCopy.BatchSize = Options.BatchSize; bulkCopy.DestinationTableName = string.Format("\"{0}\".\"{1}\"", reader.SchemaName, reader.TableName); bulkCopy.NotifyAfter = Options.NotifyAfter; if (Options.Callback != null) { bulkCopy.HanaRowsCopied += (sender, args) => { Options.Callback.Invoke(sender, new RowsCopiedEventArgs(args.RowsCopied)); }; } var table = new DataTable(reader.TableName); foreach (var kvp in reader.Cols) { var dataType = kvp.Value.Type; if (dataType.IsConstructedGenericType) { dataType = dataType.GenericTypeArguments[0]; } table.Columns.Add(kvp.Value.ColumnName, dataType); if (kvp.Value.IsIdentity && !keepIdentity) { continue; } bulkCopy.ColumnMappings.Add(kvp.Value.ColumnName, kvp.Value.ColumnName); } foreach (var x in entities) { var row = table.NewRow(); foreach (var p in reader.Cols.Values) { row[p.ColumnName] = p.Selector.DynamicInvoke(x) ?? DBNull.Value; } table.Rows.Add(row); } ; bulkCopy.WriteToServer(table); } } }