Можете ли вы использовать XMLHttpRequest для отслеживания большого цикла обновления SQL в коде позади - PullRequest
2 голосов
/ 22 марта 2019

Я разрешаю конечным пользователям загружать файл, затем читать в память и перебирать его для обновления данных. Мне интересно, как я могу сообщить о прогрессе цикла SQL, который я делаю в C #, обратно в пользовательский интерфейс так же, как мы делаем для загрузки файла. Мы используем ajax POST, а затем читаем построчно, поэтому при выполнении больших чтений я хочу узнать, сколько строк мы прочитали. Это возможно, или это работает только с потоками загрузки / выгрузки файлов.

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

 var form = $('#FormUpload')[0];
        var dataString = new FormData(form);

        $("#cboxClose").trigger("click");

        $.ajax({
            url: '/Uploader/Upload',  //Server script to process data
            type: 'POST',
            xhr: function () {  // Custom XMLHttpRequest
                var myXhr = $.ajaxSettings.xhr();
                if (myXhr.upload) { // Check if upload property exists
                    //myXhr.upload.onprogress = progressHandlingFunction
                    myXhr.upload.addEventListener('progress', progressHandlingFunction,
                        false); // For handling the progress of the upload
                }
                return myXhr;
            },
            //Ajax events
            success: uploadSuccessHandler,
            error: uploadErrorHandler,
            //complete: completeHandler,
            // Form data
            data: dataString,
            //Options to tell jQuery not to process data or worry about content-type.
            cache: false,
            contentType: false,
            processData: false
        });
    }

Вот часть контроллера C # из MVC, который я вызываю, но я ограничил и сделал логику общей для целей этого вопроса.

 try
        {
            if (uploadedFile != null && uploadedFile.ContentLength > 0)
            {
                if (uploadedFile != null)
                {
                    if (uploadedFile.ContentLength > 0)
                    {

                        using (StreamReader sr = new StreamReader(uploadedFile.InputStream))
                        {
                            string currentLine;
                            int counterLine = 0;
                            // currentLine will be null when the StreamReader reaches the end of file
                            while ((currentLine = sr.ReadLine()) != null)
                            {
                                if (counterLine > 0)
                                {

                                    String fixedLine = currentLine;

                                    if (currentLine.Contains("/"))
                                    {
                                        fixedLine = currentLine.Remove('/');
                                    }

                                    string[] columns = fixedLine.Split(',');

                                    quoteDataRows.Add(new QuoteEntityItemVM()
                                    {
                                        Manufacturer = columns[0],
                                        Model = columns[2],
                                        Description = columns[1],
                                        LineID = lineCountId += 1

                                    });
                                }

                                counterLine += 1;
                            }
                        }
                   }
             }

Есть ли способ, с помощью которого я могу использовать современный AJAX, чтобы не только показывать прогресс выгрузки, но и в то время как циклы счетчика сообщают о прогрессе в пользовательский интерфейс, что-то вроде («Lines read (n) of total line (n)» обратно к пользовательский интерфейс, или это невозможно?

-Thanks-

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...