如果我对您的表结构和 XML 文档了解更多,我可以尝试给您一个更好的示例
根据您插入的行数,我会分块添加数据以帮助不锁定数据库。通常我一次通过 25,000 个块。如果您的行数超过 25000,则 for 循环一次只能执行 25000 行。
在 SQL 端创建一个过程:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE Procedure [dbo].[prI_BulkAddData](@Data Xml)
As
-- Add Handle to XML Data
Declare @xmlDataHandle Int
Exec sp_xml_preparedocument @xmlDataHandle Output, @Data
Insert Into TableName(Column1, Column2, Column3)
Select ElementName1, ElementName2, ElementName3 From OpenXml(@xmlDataHandle, '/Root/Channel', 2)
With(
[ElementName1] int,
[ElementName2] varchar(50,
[ElementName3] datetime
)
-- Remove Handle to Free-Up Memory
Exec sp_xml_removedocument @xmlDataHandle
GO
在您的视觉工作室方面调用程序:
EXEC prI_BulkAddData Data = 'PUT XML HERE'
这只是一个示例,很明显您需要编写一些 C# 代码来读取 XML 文件并执行存储过程(我通常使用 Linq to SQL,因为我很懒,它工作得很好,不想写一堆数据代码)
在存储过程中,确保将其调整为 XML 文档的编写方式。
这是我曾经解析大型 XML 文件的示例:
for (int t = 0; t < data.Data.Count(); t = t + 25000)
{
var xEle = new XElement("DataCollections",
from emp in data.Data.Skip(t).Take(25000)
select new XElement("DataCollection",
new XElement("AssetID", emp.AssetID),
new XElement("DataPointID", emp.DataPointID),
new XElement("SourceTag", emp.SourceTag),
new XElement("TimeStep", emp.TimeStep),
new XElement("RetInterval", emp.RetInterval),
new XElement("DatapointDate", emp.DatapointDate.ToString()),
new XElement("DataPointValue", emp.DataPointValue),
new XElement("DataFlagID", emp.DataFlagID),
new XElement("DateDataGrabbed", emp.DateDataGrabbed.ToString()),
new XElement("DateAddedToDB", emp.DateAddedToDB.ToString())
));
_DataCollectorManager.Services.dataProcessService.BulkAddPIData(xEle);
}