【问题标题】:How to output a Stored Procedure to Custom XML Format如何将存储过程输出为自定义 XML 格式
【发布时间】:2014-06-09 16:51:23
【问题描述】:

我是 Visual Studio 和桌面开发的新手。话虽如此,我正在编写一个程序来自动化手动过程,该过程的一部分是从我们的 SQL Server 中提取一些数据并将其推送到 Web API。我能够获取数据,甚至可以将其转换为 XML 以将其发送到 API,不幸的是,生成的 XML 的格式不适合 API,我无法弄清楚如何设置 XML 格式/模式我需要它才能使交易有效。

我正在使用 TableAdapter 来获取所有数据,如果这有什么不同的话,这是我发现从 SQL Server 中提取数据的第一种方法。

我正在使用.WriteXML() 生成我的 XML 文件,这给了我

<Subscribers xmlns="http://tempuri.org/Subscribers.xsd">
  <Subscriber>
    <Email>email@email.com</Email>
    <FirstName>FNAME</FirstName>
    <LastName>LNAME</LastName>
    <City>MyCity</City>
    <State>MyState</State>
    <Zip>MyZip</Zip>
    <Country>MyCountry</Country>
    <SessionDate />
  </Subscriber>
</Subscribers>

这是我用来与.WriteXML() 通话的电话

public void WriteXMLFile()
{
    System.IO.FileStream stream = new System.IO.FileStream(filename, System.IO.FileMode.Create);
    EmailDriectUpload.Subscribers Subscribers = ((EmailDriectUpload.Subscribers)(this.FindResource("Subscribers")));                
    Subscribers.WriteXml(stream);            
}

我根据我发现的另一个问题尝试使用 .ExtendProperties.Add(),但没有运气。

我需要的样子是

<Subscribers xmlns="http://tempuri.org/Subscribers.xsd">
  <Subscriber>
    <Email>email@email.com</Email>
    <CustomFields>
      <CustomField>
        <FieldName>FirstName</FieldName>
        <Value>FNAME</Value>
      </CustomField>
      <CustomField>
        <FieldName>LastName</FieldName>
        <Value>FNAME</Value>
      </CustomField>
      <CustomField>
        <FieldName>City</FieldName>
        <Value>MyCity</Value>
      </CustomField>
      <CustomField>
        <FieldName>State</FieldName>
        <Value>MyState</Value>
      </CustomField>
      <CustomField>
        <FieldName>ZipCode</FieldName>
        <Value>MyZip</Value>
      </CustomField>
      <CustomField>
        <FieldName>Country</FieldName>
        <Value>MyCountry</Value>
      </CustomField>
    </CustomFields>
  </Subscriber>
</Subscribers>

我上个月开始使用 VS2013,所以我并不完全熟悉 SDK 及其提供的所有功能。我目前也只使用 VS2013 Express,如果这是问题的一部分,我可以考虑购买 PRO。

过去几天我一直在这里搜索,并为该计划的其他领域找到了很多很大的帮助,但似乎无法确定我正在尝试做的事情是否可以按照我的方式进行'我试图做到这一点。如果有更好的方法来处理这个问题,请务必指出我的方向。我完全赞成学习处理事情的新方法。

提前致谢。在此期间我会继续打猎。

【问题讨论】:

  • 请考虑从帖子中删除您的生活故事 - “这里是新的”、“搜索了很多”、“刚刚安装”,不要在您的问题中添加信息,这会使您更难弄清楚您在寻找什么.
  • 您提到源数据来自 SQL 数据库,但您正试图将其转换为 C# 中的 XML。这是出于性能考虑吗?您不能只使用 SQL 内置的 XML 格式从 SqlDataAdapter 返回 XML 吗?看看这篇文章...stackoverflow.com/questions/11647829/…
  • @AlexeiLevenkov 当然可以。我觉得它为我所在的位置提供了参考。我没有讲述我的生活故事,只是简单地陈述了新人的身份,如果我做的不正确,请指出我正确的方向。只是为了构建我的经验以帮助人们帮助我。
  • @Love2Learn 这不是为了表现。我之前在 SQL 中使用过 FOR XML。我可能需要重新审视它。我也无法以这种方式正确格式化数据。但是,我会查看您的链接,因为它是我没有看到的新信息。谢谢
  • 呃,我在 sql 中编写了代码,在尝试关闭我创建的 XML 窗口时意外关闭了查询窗口。我不想再写一遍,但我可以告诉你,我发现的最简单的方法是在输出中有一个嵌套查询,该查询使用 UNPIVOT 获取 CustomFields 并加入到电子邮件上的外部查询.

标签: c# sql-server xml visual-studio-2013


【解决方案1】:

我拼凑了一些可以生成 XML 的东西,在这个控制台示例中,我只是将行添加到 3 个 DataTables 以生成一些可行的数据,然后将 DataTables 添加到 DataSet,设置表之间的一些关系并调用 GetXML(数据集)

        // Create two DataTable instances.
        DataTable table1 = new DataTable("Subscriber");
        table1.Columns.Add("id");
        table1.Columns.Add("Email");
        table1.Rows.Add(1, "email@email.com");

        DataTable table2 = new DataTable("CustomFields");
        table2.Columns.Add("id");
        table2.Rows.Add(1);

        DataTable table3 = new DataTable("CustomField");
        table3.Columns.Add("id");
        table3.Columns.Add("FieldName");
        table3.Columns.Add("Value");
        table3.Rows.Add(1, "FirstName", "FNAME");
        table3.Rows.Add(1, "FirstName", "FNAME");
        table3.Rows.Add(1, "FirstName", "FNAME");
        table3.Rows.Add(1, "FirstName", "FNAME");
        table3.Rows.Add(1, "FirstName", "FNAME");
        table3.Rows.Add(1, "FirstName", "FNAME");
        table3.Rows.Add(1, "FirstName", "FNAME");

        // Create a DataSet and put both tables in it.
        DataSet set = new DataSet("Subscribers");
        set.Tables.Add(table1);
        set.Tables.Add(table2);
        set.Tables.Add(table3);
        set = SetRelationship(set);

        // Visualize DataSet.
        Console.WriteLine(set.GetXml());

        Console.ReadKey();

    }

    private static DataSet SetRelationship(DataSet ds)
    {
        DataRelation relation1 = ds.Relations.Add("Subscriber1", ds.Tables[0].Columns["id"], ds.Tables[1].Columns["id"]);
        DataRelation relation2 = ds.Relations.Add("Subscriber2", ds.Tables[1].Columns["id"], ds.Tables[2].Columns["id"]);
        relation1.Nested = true;
        relation2.Nested = true;
        return ds;
    }
}

这可能会帮助您弄清楚您需要对数据库中的表执行哪些操作才能获得相同的结果...

这里有一些链接指向更多从数据库获取数据的示例。

http://www.nakdev.somee.com/#1&F44E352AE0714AAD97945E5AB327A60E&vb http://www.nakdev.somee.com/#1&9EC1A1DDDCE14251BC01BC1966FD3C8B&vb

DataSet 的有趣之处在于您可以从一个存储过程中返回多组数据,因此在您的 SP 中您可以拥有....

从表 1 中选择 *

从表 2 中选择 *

现在在您的代码中,您将像这样加载 DataSet....

ds.Load(reader, LoadOption.Upsert, "Table1", "Table2")

这将返回两组数据.....很酷(我猜你的选择语句甚至可以从同一个表中选择不同的数据)

现在在 DataSet 对象的两个表中设置公共键字段之间的关系(在代码中)(将关系设置为“嵌套”以正确显示 XML)并调用 GetXML()

【讨论】:

  • 非常感谢.. 我会对此进行审查并试一试,我非常感谢您抽出宝贵的时间来整理这些内容。你可能已经让我的办公桌免于再次与我相遇。我会尽快通知你的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-15
  • 1970-01-01
  • 2023-03-04
  • 2018-06-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多