コード例 #1
0
 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);
     }
 }
コード例 #3
0
 private int SizeOf(ExecuteBlockInsertSql query)
 {
     return query.InsertSql.GetSize() 
         + query.ParametersSql.GetSize() 
         + (!String.IsNullOrEmpty(query.ParametersSql) && _parametersSqls.Count > 0 ? SizeOfParametersSeparator : 0);
 }
コード例 #4
0
 internal bool CanAddQuery(ExecuteBlockInsertSql query)
 {
     return _currentBodySize + SizeOf(query) <= MaximumExecuteBlockSize &&
            _currentInputParametersSize + query.ParametersSize <= MaximumExecuteBlockInputParametersSize &&
            _insertSqls.Count < MaximumExecuteBlockQueries;
 }
コード例 #5
0
        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);
 }