【问题标题】:How to store a very large file into a database record如何将非常大的文件存储到数据库记录中
【发布时间】:2019-09-07 01:54:31
【问题描述】:

客户端使用我们的 Web 应用程序来解析数据库的 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)
                    );

您是否看到之前将其转换为要解析到数据库中的字符串的注释掉的代码?好吧,这行得通,但它不适用于大约 888MB 大的文件。

【问题讨论】:

  • 使 XML 文件更小。我相信该计划的其他部分的整体性能也会显着提高。
  • 这不是一个选项。它在 6 分钟内上传,因此性能不是问题。
  • 读取大型 xml 的唯一方法是使用 XmlReader。看我今天早些时候做的例子:stackoverflow.com/questions/55705586/…

标签: c# asp.net sql-server xml stored-procedures


【解决方案1】:

将文件直接加载到 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

【讨论】:

    猜你喜欢
    • 2011-07-19
    • 1970-01-01
    • 2012-06-30
    • 1970-01-01
    • 1970-01-01
    • 2017-09-14
    • 1970-01-01
    • 2016-01-26
    • 1970-01-01
    相关资源
    最近更新 更多