如何将IEnumerable <xelement>对象插入SQL Server表?</xelement>

时间:2013-12-09 15:46:13

标签: c# xelement

我创建了以下代码来从XML获取用户:

        string userName = "user";
        string password = "password";
        string uri = @"uri";
        WebClient webClient = new WebClient();
        webClient.Credentials = new NetworkCredential(userName, password);  
        Stream stream = webClient.OpenRead(uri);
        XElement output = XElement.Load(stream);
        IEnumerable<XElement> users = from el in output.Elements() select el;

        foreach (XElement str in users)
        {
            Console.WriteLine(str);
        }

结果:

        <User>
          <ObjectId>3cbde</ObjectId> 
          <Alias>alias</Alias> 
          <DisplayName>Display Name</DisplayName> 
          <TimeZone>0</TimeZone> 
          <Language>0</Language> 
          <ListInDirectory>false</ListInDirectory> 
          <IsVmEnrolled>true</IsVmEnrolled> 
        </User>

现在我想将数据插入到数据库中,但我想将每个字段作为单独的列 - 数据库中的表包含列: ObjectId DisplayName TimeZone 等 你能否告诉我一些如何轻松完成的建议?我需要将其转换为DataTable吗?

1 个答案:

答案 0 :(得分:1)

在这个例子中,我在本地获取XML流,用于测试目的。只需将其更改为获取流的方法(WebClient)。也使用SqlBulkCopy,我没有看到这样做的任何缺点加上,如果你最终要插入很多行,那就会更快。可能有更好的方法来重构这个,但粗略地说:

        SqlBulkCopy bulkCopy = new SqlBulkCopy("ConnectionString...");
        bulkCopy.DestinationTableName = "PhysicalTableName";
        DataTable dt = new DataTable("PhysicalTableName");


        dt.Columns.Add("ObjectId");
        dt.Columns.Add("Alias");
        dt.Columns.Add("DisplayName");
        dt.Columns.Add("TimeZone");
        dt.Columns.Add("Language");
        dt.Columns.Add("ListInDirectory");
        dt.Columns.Add("IsVmEnrolled");


        XElement output = XElement.Load("c:\\temp\\input.xml");
        IEnumerable<XElement> users = output.Elements();

        foreach (XElement str in users)
        {
            DataRow dr = dt.NewRow();
            foreach (XElement node in str.Elements())
            {
                dr[node.Name.LocalName] = node.Value;
            }

            dt.Rows.Add(dr);
        }

        bulkCopy.WriteToServer(dt);

我没有关于表格架构的任何信息,所以默认情况下,在此示例中,所有列都是String类型。

不要忘记异常处理。