我有一个具有以下结构的数据表
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个。我需要创建这个数据表并将其作为存储过程中的表值参数传递。那我该如何处理这个问题?
答案 0 :(得分:2)
您收到内存异常,因为您尝试一次性加载所有文件,然后一次性将其发送到数据库。机器的记忆力还不够......
您有几种选择:
以防您想尝试选项3:
尝试加载您的一个文件。如果这样可行,它应该适用于所有这些......
DECLARE @yourXML AS XML=
(
SELECT CONVERT(XML, BulkColumn,2) AS BulkColumn
FROM OPENROWSET(BULK 'PathToFile.xml', SINGLE_BLOB) AS x
);
SELECT @yourXML;