Вопрос

Как обработать коллекцию с массовой вставкой через Insert обходя ограничение в 2100 записей параметров?

bool InsertTriangle(List<TriangleEntity> triangleEntities) {
            var insert = new Insert(_systemUserConnection).Into("TrianglePlanFact");
            var counter = 0;
            var insertLimit = 100;
            var rowNumber = HaleonSqlHelper.GetRowCount(_systemUserConnection, "nbcTrianglePlanFact");
            var mask = (string)SysSettings.GetValue(_systemUserConnection, "TriangleMask");
            CollectionUtilities.ForEach(triangleEntities, item => {
                var product = item.ProductEntity;
                counter++;
                rowNumber++;
                var number = string.Format(mask, rowNumber);
                insert.Values()
                    .Set("Name", Column.Parameter(number))
                    .Set("ProductGMMId", Column.Parameter(product.ProductId))
                    .Set("MaterialDescription", Column.Parameter(product.Brand))
                    .Set("Brand", Column.Parameter(product.Brand))
                    .Set("Plant", Column.Parameter(product.Plant))
                    .Set("Sku", Column.Parameter(product.Sku))
                    .Set("Period", Column.Parameter(item.Period))
                    .Set("Version", Column.Parameter(item.Version));
                if (counter % insertLimit == 0) {
                    insert.Execute();
                    insert.ResetParameters();
                }
            });
            if (counter % insertLimit != 0) {
                insert.Execute();
            }
            return true;
        }

Код выше работает с коллекцией записей, добавляя значеия колонок в общую коллекцию для вставки, после того как достигли лимита в 100 записей при вставке, он выполняет инсерт и очищает параметры(я так думал), но я все равно ухожу в лимит 2100 при 300 записях, т.е 800 * 3 = 2400, как после каждого execute очищать параметры и как правильно делать подобные вставки?

Нравится

2 комментария

единственное решение, которое смог найти, это каждый раз пересоздавать insert, но хотелось бы узнать, как такое делать правильно

 

if (counter % insertLimit == 0) {
    insert.Execute();
    insert = new Insert(_systemUserConnection).Into("TrianglePlanFact");
}
ResetParemeters почему то не работает для моего случая, также я пытался изначально делать условие проверяя сами параметры в инсерте, но они всегда были 0

Добрый день!

Как либо повлиять на ограничение в 2100 параметров мы не можем. 

В данной ситуацию правильным будет разбитие запроса на подзапросы, объединять результаты, и возвращать всю коллекцию по необходимости.

Замечу, что ваш вариант также имеет место.

Показать все комментарии