使用c#数据集从xml文件填充SQL

本文关键字:文件 填充 SQL xml 数据集 使用 | 更新日期: 2023-09-27 18:15:19

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

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

我在dataset中的表:

频道:id_table id_channel、名称* *
链接:id_table, id_channel, url.
国家:id_table, id_channel, country.

现在我必须以某种方式合并它们以插入到一个表中:

SQLtable: id_channel, code, description(可能为null), url, country.

*主要问题是:**代码和描述是来自Channels表的一个"name"值,它看起来像:
Id_table id_channel code/description
1 1 code1
2 1 description
3 2 code2
4 2 description2
5 3 code3
6 4 code4
7 4 description4
有时缺少描述。

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

谢谢!

使用c#数据集从xml文件填充SQL

如果我更了解你的表结构和XML文档,我可以试着给你一个更好的例子

根据您插入的行数,我会将数据添加到块中,以帮助不锁定数据库。通常我一次传递25000个块。如果你的行数超过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

在你的visual studio端调用程序:

EXEC prI_BulkAddData Data = 'PUT XML HERE'

这只是一个很明显的例子,你需要写一些c#代码来读取XML文件和执行存储过程(我通常使用Linq to SQL,因为我很懒,它工作得很好,不想写一堆数据代码)

在Stored process中,确保将其调整为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);
                            }