internal void AddQuery(ExecuteBlockInsertSql query) { _currentBodySize += SizeOf(query); _currentInputParametersSize += query.ParametersSize; _insertSqls.Add(query.InsertSql); if (!String.IsNullOrEmpty(query.ParametersSql)) _parametersSqls.Add(query.ParametersSql); }
internal void AddQuery(ExecuteBlockInsertSql query) { _currentBodySize += SizeOf(query); _currentInputParametersSize += query.ParametersSize; _insertSqls.Add(query.InsertSql); if (!String.IsNullOrEmpty(query.ParametersSql)) { _parametersSqls.Add(query.ParametersSql); } }
private int SizeOf(ExecuteBlockInsertSql query) { return query.InsertSql.GetSize() + query.ParametersSql.GetSize() + (!String.IsNullOrEmpty(query.ParametersSql) && _parametersSqls.Count > 0 ? SizeOfParametersSeparator : 0); }
internal bool CanAddQuery(ExecuteBlockInsertSql query) { return _currentBodySize + SizeOf(query) <= MaximumExecuteBlockSize && _currentInputParametersSize + query.ParametersSize <= MaximumExecuteBlockInputParametersSize && _insertSqls.Count < MaximumExecuteBlockQueries; }
public IEnumerable <IDictionary <string, object> > Insert(AdoAdapter adapter, string tableName, IEnumerable <IDictionary <string, object> > dataList, IDbTransaction transaction, Func <IDictionary <string, object>, Exception, bool> onError, bool resultRequired) { //ToDo: support onError collection List <IDictionary <string, object> > result = new List <IDictionary <string, object> >(); if (transaction == null) { adapter.InTransaction(currentTransaction => { result = (List <IDictionary <string, object> >)Insert(adapter, tableName, dataList, currentTransaction, onError, resultRequired); }); return(result); } var table = adapter.GetSchema().FindTable(tableName); var tableColumns = table.Columns.Select(c => (FbColumn)c).ToArray(); var nameToFbColumns = tableColumns.ToDictionary(c => c.HomogenizedName, c => c); var insertContext = CreateInsertSqlContext(table.QualifiedName, tableColumns); var queryBuilder = new FbBulkInsertQueryBuilder(resultRequired, insertContext.ReturnsExecuteBlockSql); var insertSqlProvider = new FbBulkInsertSqlProvider(); var currentColumns = new List <InsertColumn>(); foreach (var data in dataList) { var insertData = data.Where(p => nameToFbColumns.ContainsKey(p.Key.Homogenize())).Select(kv => new InsertColumn { Value = kv.Value, Column = nameToFbColumns[kv.Key.Homogenize()] }).ToArray(); ExecuteBlockInsertSql insertSql = insertSqlProvider.GetInsertSql(insertContext, insertData, resultRequired); if (insertContext.SkipCommandParameters && !CanInsertInExecuteBlock(insertSql.InsertSql, queryBuilder)) { insertSql = insertSqlProvider.GetInsertSql(insertContext, insertData, resultRequired, skipCommandParameters: false); } if (queryBuilder.CanAddQuery(insertSql)) { queryBuilder.AddQuery(insertSql); if (!insertContext.SkipCommandParameters) { currentColumns.AddRange(insertData); } } else { var subResult = CreateAndExecuteInsertCommand(transaction, currentColumns, queryBuilder.GetSql(), resultRequired); if (resultRequired) { result.AddRange(subResult); } currentColumns.Clear(); queryBuilder = new FbBulkInsertQueryBuilder(resultRequired, insertContext.ReturnsExecuteBlockSql); queryBuilder.AddQuery(insertSql); if (!insertContext.SkipCommandParameters) { currentColumns.AddRange(insertData); } } } if (queryBuilder.QueryCount > 0) { var subResult = CreateAndExecuteInsertCommand(transaction, currentColumns, queryBuilder.GetSql(), resultRequired); if (resultRequired) { result.AddRange(subResult); } } return(result); }
private int SizeOf(ExecuteBlockInsertSql query) { return(query.InsertSql.GetSize() + query.ParametersSql.GetSize() + (!String.IsNullOrEmpty(query.ParametersSql) && _parametersSqls.Count > 0 ? SizeOfParametersSeparator : 0)); }
internal bool CanAddQuery(ExecuteBlockInsertSql query) { return(_currentBodySize + SizeOf(query) <= MaximumExecuteBlockSize && _currentInputParametersSize + query.ParametersSize <= MaximumExecuteBlockInputParametersSize && _insertSqls.Count < MaximumExecuteBlockQueries); }