0

我有一个很大的 xml 文件,从中我得到了很多表:

DataSet l_DataSet = new DataSet();
l_DataSet.ReadXml(@"D:\file.xml");

我在数据集中的表:

频道:id_table、id_channel、名称* * *。
链接:id_table、id_channel、url。
国家:id_table、id_channel、国家。

现在我必须以某种方式将它们合并到 1 个表中:

SQLtable:id_channel、代码、描述(可以为空)、url、国家。

*主要问题是: **代码和描述是Channels表中的“名称”值,如下所示:id_table
id_channel code/description
1 1 code1
2 1 description1
3 2 code2
4 2 description2
5 3 code3
6 4 code4
7 4 description4
有时缺少描述。

我不知道如何在 c# 中合并数据集中的表?一些方向?

谢谢!

4

1 回答 1

0

如果我对您的表结构和 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);

                            }
于 2013-05-24T19:17:24.823 回答