private DataTable CreateDataTable(AdoAdapter adapter, string tableName, ICollection<string> keys, SABulkCopy bulkCopy) { var table = adapter.GetSchema().FindTable(tableName); var dataTable = new DataTable(table.ActualName); foreach (var key in keys) { if (table.HasColumn(key)) { var column = (SqlAnywhereColumn)table.FindColumn(key); dataTable.Columns.Add(column.ActualName, DbTypeLookup.GetClrType(column.SADbType)); if (!column.IsIdentity) { bulkCopy.ColumnMappings.Add(column.ActualName, column.ActualName); } } else { // For non-matching columns, add a dummy DataColumn to make inserting rows easier. dataTable.Columns.Add(Guid.NewGuid().ToString("N")); } } return dataTable; }
public IEnumerable<IDictionary<string, object>> Insert(AdoAdapter adapter, string tableName, IEnumerable<IDictionary<string, object>> data, IDbTransaction transaction, Func<IDictionary<string, object>, Exception, bool> onError, bool resultRequired) { if (resultRequired) { return new BulkInserter().Insert(adapter, tableName, data, transaction, onError, resultRequired); } int count = 0; DataTable dataTable = null; SAConnection connection; SABulkCopy bulkCopy; if (transaction != null) { connection = (SAConnection) transaction.Connection; bulkCopy = new SABulkCopy(connection, SABulkCopyOptions.Default, (SATransaction)transaction); } else { connection = (SAConnection)adapter.CreateConnection(); bulkCopy = new SABulkCopy(connection); } bulkCopy.DestinationTableName = adapter.GetSchema().FindTable(tableName).ActualName; using (connection.MaybeDisposable()) using (bulkCopy) { connection.OpenIfClosed(); foreach (var record in data) { if (count == 0) { dataTable = CreateDataTable(adapter, tableName, record.Keys, bulkCopy); } dataTable.Rows.Add(record.Values.ToArray()); if (++count%5000 == 0) { bulkCopy.WriteToServer(dataTable); dataTable.Clear(); } } if (dataTable.Rows.Count > 0) { bulkCopy.WriteToServer(dataTable); } } return null; }