Как сохранить очень большой файл в записи базы данных - PullRequest
0 голосов
/ 17 апреля 2019

Клиент использует наше веб-приложение для анализа XML-файла для базы данных. Затем использует информацию из файла XML из базы данных для различных других вещей. Я на данный момент потоковое чтение и потоковая запись файла. Когда файлы были меньше, их обычно анализировали в строку, а затем вставляли в запись базы данных. Проблема в том, что файл настолько большой, что на компьютерах недостаточно оперативной памяти для обработки такой большой строки, как я могу обработать этот файл и сохранить его в базе данных?

using (var reader = new StreamReader(outputPath))
                {
                    string line = string.Empty;
                    bool save = false;
                    using (var sWriter = new StreamWriter(inputPath))
                    {
                        while ((line = reader.ReadLine()) != null)
                        {
                            System.Diagnostics.Debug.WriteLine(line);
                            if (line.Contains("<SaveDataFromScout>"))
                            {
                                sWriter.WriteLine("<SaveDataFromScout>");
                                save = true;
                                continue;
                            }
                            else if (line.Contains("</SaveDataFromScout>"))
                            {
                                sWriter.WriteLine(line);
                                save = false;
                            }

                            if (save)
                            {
                                if (line.Contains("ELEMENT TEXT"))
                                    line = line.Replace("ELEMENT TEXT", "ELEMENTTEXT");

                                sWriter.WriteLine(line);
                            }


                        }
                    }
                }

                //string workbookXML = System.IO.File.ReadAllText(outputPath);

                transactionID = DAC.ExecuteScalar
                    (
                        db.ConnectionString,
                        "dbo.cwi_InsertTransaction",
                        new SqlParameter("@TransactionTypeID", transactionTypeID),
                        new SqlParameter("@UploadedFileName", fileDataLink),
                        //new SqlParameter("@UploadedFileXml", workbookXML),
                        new SqlParameter("@CurrentUserID", CurrentUser.UserID)
                    );

Видите ли вы закомментированный код, в котором он ранее был преобразован в строку для анализа в базе данных? Ну, это работает, но это не работает для файлов размером около 888 МБ.

1 Ответ

1 голос
/ 17 апреля 2019

Загрузка файла непосредственно в SQL Server, тип столбца XML с использованием массовой загрузки:

INSERT INTO T(XmlCol)  
SELECT * FROM OPENROWSET(  
   BULK 'c:\SampleFolder\SampleData3.txt',  
   SINGLE_BLOB) AS x;  

Дополнительная документация: https://docs.microsoft.com/en-us/sql/relational-databases/import-export/examples-of-bulk-import-and-export-of-xml-documents-sql-server?view=sql-server-2017

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