带有sqlXML列的大型数据表抛出System.OutOfMemoryException

时间:2016-05-11 13:33:55

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

我有一个具有以下结构的数据表

DataColumn sourceTblCol = new DataColumn("SourceTableName", typeof(System.Data.SqlTypes.SqlString));
                    importXMLMainDt.Columns.Add(sourceTblCol);
                    DataColumn ordinalPosCol = new DataColumn("OrdinalPosition", typeof(System.Data.SqlTypes.SqlInt32));
                    importXMLMainDt.Columns.Add(ordinalPosCol);
                    DataColumn grpNameCol = new DataColumn("GroupName", typeof(System.Data.SqlTypes.SqlString));
                    importXMLMainDt.Columns.Add(grpNameCol);
                    DataColumn entityTypeIDCol = new DataColumn("EntityTypeID", typeof(System.Data.SqlTypes.SqlInt32));
                    importXMLMainDt.Columns.Add(entityTypeIDCol);
                    DataColumn entityNameCol = new DataColumn("EntityName", typeof(System.Data.SqlTypes.SqlString));
                    importXMLMainDt.Columns.Add(entityNameCol);
                    DataColumn exportXMLCol = new DataColumn("ExportData", typeof(System.Data.SqlTypes.SqlXml));
                    importXMLMainDt.Columns.Add(exportXMLCol);

我循环遍历目录中的所有xml文件,并将该XML内容作为sqlXML添加到数据表中

xmlFiles = Directory.GetFiles(this.WrkImportFilePath, "*.xml");
                    foreach (string filename in xmlFiles)
                    {

                                using (XmlReader xmlReaderObj = XmlReader.Create(filename))
                                {
                                    while (xmlReaderObj.Read())
                                    {
                                        sqlxmlObj = new SqlXml(xmlReaderObj);
                                    }
                                    xmlReaderObj.Close();
                                }
                                importXMLMainDt.Rows.Add(srcTableName, ordinalPos, grpName, entityTypeID, string.Empty, sqlxmlObj);
                                sqlxmlObj = null;

                        }
                    }

它适用于2500个XML文件,但如果文件数超过3000则抛出异常。最大文件数可达12,000个。我需要创建这个数据表并将其作为存储过程中的表值参数传递。那我该如何处理这个问题?

1 个答案:

答案 0 :(得分:2)

您收到内存异常,因为您尝试一次性加载所有文件,然后一次性将其发送到数据库。机器的记忆力还不够......

您有几种选择:

  1. 购买大量内存: - )
  2. 分段传输数据(一个一个?)
  3. 如果XML文件驻留在您可以直接从SQL Server访问的位置,您可能会更容易! - 仅推送文件名,并通过TSQL将XML加载到DB-table的列中。
  4. 以防您想尝试选项3:

    尝试加载您的一个文件。如果这样可行,它应该适用于所有这些......

    DECLARE @yourXML AS XML=
    (
    SELECT CONVERT(XML, BulkColumn,2) AS BulkColumn
    FROM OPENROWSET(BULK 'PathToFile.xml', SINGLE_BLOB) AS x
    );
    SELECT @yourXML;