Использование обработки на стороне сервера для более чем 5 миллионов записей с ошибками в jQuery DataTables. Как это исправить для работы с большими данными? - PullRequest
0 голосов
/ 11 апреля 2020

Сначала я хотел бы поместить код инициализации dataTable.

Ниже приведена инициализация Datatable, которая выполняется, когда элемент управления переходит в свойство success другого вызова ajax. В частности, этот вызов Ajax предназначен только для отправки данных в хранимую процедуру. (Я поставлю код также). Я удалил весь ненужный код.

function initializeDataTable(data) {

        $('#tblDiscount').DataTable().clear();
        $('#tblDiscount').DataTable().destroy();

        var table= $('#tblDiscount').DataTable({
             serverSide: true, // true
             processing: true,
             responsive:true,
             ordering: false, // false
             searching: false, // false
             lengthChange: false, // pagesize
             paging: true,
             deferRender:true,
            footer: true,
             columnDefs: [{ targets: [14, 16, 17], className: 'dt-body-right' },
                 { targets: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15], classname: 'dt-body-left' }
            ],
            //searching: true,

            dom: 'frBtip',
            async: false,
            ajax: function (data, callback, settings) {

                var skip = 0;
                if (data.start == 0)
                    skip = 0;
                else
                    skip = data.start + 50; //data.length;

                $.ajax({
                    url: '../Reports/_GetOnScrollData',
                    data: {

                        skipRows: skip,
                        limit: 50 //data.length
                    },
                    datatype: "Json",
                    async: false,
                    success: function (dataset) {                  
                        for (var i = 0; i < dataset.res.length; i++) {                        
                                out.push([dataset.res[i].state, dataset.res[i].zone, dataset.res[i].amro,
                                    dataset.res[i].StoreCode, dataset.res[i].OfferType, dataset.res[i].DiscountType,
                                    dataset.res[i].OfferNo, dataset.res[i].Description, dataset.res[i].ReceiptNo, dataset.res[i].TransDate,
                                    dataset.res[i].Category, dataset.res[i].ItemCode, dataset.res[i].LotNo, dataset.res[i].ExpirationDate,
                                    dataset.res[i].Quantity, dataset.res[i].FreeItem, dataset.res[i].NetValue, dataset.res[i].Discount]);                       
                        }             
                    },

                    error: function (jqXHR, textStatus, errorThrown) {
                        if (jqXHR.status == 500) {
                            alert('Internal error: ' + jqXHR.responseText);
                        } else {
                            alert('Please revise your FILTER selection as the \n' +
                                'information You are fetching has more than 1 lac Records');
                            location.reload(true);
                        }
                    } //error closed
                }).done(function (response) {
                    callback(
                        {
                            draw: data.draw,
                            data: out,
                            recordsTotal: parseInt(countRecords),
                            recordsFiltered: parseInt(countRecords)
                        });
                }).fail(function (err) {
                    console.error('error...', err)
                })


            }, //end of ajax call for controller
                scrollY: 500, // div height
                scrollX: true,
                scroller: {
                    loadingIndicator: true
                },


                 footerCallback: function (row, data, start, end, display) {
                     var api = this.api()
                     var json = api.ajax.json();
                     $(api.column(17).footer()).html(totalOfDiscount);
                     $(api.column(16).footer()).html('Total:' + totalOfNetValue);
                     $(api.column(14).footer()).html('Total:' + totalOfQuantity);
                 }
        }); //end of ajax call for scroller

    }

Теперь, что касается метода действия контроллера:

public ActionResult _GetOnScrollData(int skipRows, int limit)
       {

           List<DiscountGrid> res = new List<DiscountGrid>();


           try
           {

               if (skipRows == 0)
               {                          
                       Session["TotalList"] as List<DiscountGrid>=res          
                       res = res.Skip(skipRows).Take(limit).ToList();                                                            
               }
               else if(skipRows!=0)
               {

                   res = Session["TotalList"] as List<DiscountGrid>;                  
                   res = res.Skip(skipRows).Take(limit).ToList();
               }

           }
           catch (SqlException ex)
           {
               throw ex;
           }

           return Json(res,JsonRequestBehavior.AllowGet);
       }

Итак, насколько хороши записи 1k или 10k. Это отображается в таблице данных. Но как только число записей выходит за пределы 50 КБ, поток управления выполнения вместо перехода к свойству успеха получает попадание в свойство ошибки вызова ajax.

Вызов, который переходит к / controller = Reports / Action = _GetOnScrollData. Я понятия не имею, что вызывает эту проблему. Я перепробовал много вариантов и перестановок. Я даже уменьшил вызов ajax в вышеупомянутой функции до одного (убрал следующее).

$.ajax({
                  url: '../Reports/_GetOnScrollData',
                  data: {

                      skipRows: skip,
                      limit: 50 //data.length
                  },

Я задал вопрос однажды назад, что делают эти data.draw и обратный вызов. Если вы посмотрите на пример Аллана (DataTable Forum) по обработке на стороне сервера 5 000 000 записей, я увидел эту строку:

ajax: function (data, callback, settings)

Я подумал, что она имеет какое-то другое значение. Поэтому я подумал, что мне нужно будет вложить ajax, чтобы убедиться, что вызов поступает на контроллер. Я только что сослался на этот пример и, честно говоря, сделал это, не понимая, что я делаю? Итак, я вложил ajax call.

Дело в том, что я просто хочу, чтобы данные загружались на Scroll, независимо от того, будет ли это число записей 50 КБ или 5 МБ. Данные JSON, которые я получаю от контроллера, проблем нет (M хорошо с MVC). Так что мне делать? Должен ли я удалить вложенный ajax? Должен ли я удалить пропустить и взять концепт из MVC кода? Если так, как мой код будет отображать данные вместе с нижним колонтитулом (нижний колонтитул мне нужен для отображения общего количества целочисленных столбцов)?

Обновление

В приложении указан формат, в котором поступают данные из метода действия контроллера.

Return type data format

JSON data

...