我有一个很大的xml文件,我可以从中获得很多表:
DataSet l_DataSet = new DataSet();
l_DataSet.ReadXml(@"D:\file.xml");
我在数据集中的表格:
频道:id_table,id_channel,name * * *。
链接:id_table,id_channel,url。
国家/地区:id_table,id_channel,country。
现在我必须以某种方式合并它们以插入到1个表中:
SQLtable:id_channel,代码,描述(可能为null),网址,国家。
*主要问题是:
**代码和说明是渠道表中的“名称”值,如下所示:
id_table id_channel代码/描述
1 1代码1
2 1描述1
3 2代码2
4 2 description2
5 3代码3
6 4代码4
7 4 description4
有时会缺少描述。
我不知道如何在c#中合并数据集中的表?一些方向?
谢谢!
答案 0 :(得分:0)
如果我对您的表结构和XML文档有更多了解,我可以尝试为您提供更好的示例
根据您插入的行数,我将以块的形式添加数据,以帮助不锁定数据库。通常我一次传递25,000个块。如果你的行超过25000,那么循环通过它一次只做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
在Visual Studio端调用过程:
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);
}