【问题标题】:Populate SQL from xml file using dataset, c#使用数据集从 xml 文件填充 SQL,c#
【发布时间】:2013-05-24 18:41:19
【问题描述】:

我有一个很大的 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、code、description(可能为空)、url、国家。

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

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

谢谢!

【问题讨论】:

  • 你能用SQL来插入数据吗?最好从 SQL 中插入所有数据。将 XML 文件传递​​给 SQL 并让 SQL 插入行。
  • 不,我必须使用 Visual Studio 来做到这一点:/
  • 在 Visual Studio 中,您可以将整个 XML 传递给 SQL
  • 你能举个XML文件的例子吗?
  • 这是一个例子,Visual Studio 中确实有大约 20 个表在等待数据...但是 xml 非常糟糕,我只能从数据集中的表中获取 1-2 个值然后我必须在添加到 sql 之前合并它们。我还在学习c#,所以对我来说有点困难

标签: c# visual-studio-2010 dataset


【解决方案1】:

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

                            }

【讨论】:

  • 谢谢!我明天试试,xml 很大,非常大,大约 100 Mb =) 图标有一个 src 作为属性而不是元素名称。首先我会尝试一些程序来理解它,因为我以前从未这样做过:)
  • 我刚刚添加了一个示例来解析 25,000 行块中的数据。
猜你喜欢
  • 2013-08-25
  • 2013-05-12
  • 2022-01-19
  • 1970-01-01
  • 2020-05-15
  • 1970-01-01
  • 2017-04-17
  • 2016-05-24
  • 1970-01-01
相关资源
最近更新 更多