如何将存储过程输出为自定义XML格式

本文关键字:自定义 XML 格式 输出 存储过程 | 更新日期: 2023-09-27 18:07:52

我是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。

在过去的几天里,我一直在这里搜索,并找到了很多关于这个项目的其他领域的很好的帮助,但似乎就是找不到我正在尝试做的事情是否可能以我正在尝试做的方式。如果有更好的方法来处理这件事,请务必告诉我那个方向。我完全赞成学习处理事情的新方法。

提前感谢。与此同时,我会继续寻找。

如何将存储过程输出为自定义XML格式

我将生成XML的东西拼凑在一起,在这个控制台示例中,我只是将行添加到3个数据表中以生成一些可用的数据,然后将数据表添加到数据集,设置表之间的一些关系并调用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& vbhttp://www.nakdev.somee.com/# 1和9 ec1a1dddce14251bc01bc1966fd3c8b& vb

数据集的有趣之处在于你可以从一个存储过程中返回多组数据所以在你的SP中你可以有....

SELECT * FROM table

SELECT * FROM Table2

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

ds。加载(读者,LoadOption。Upsert, "Table1", "Table2")

返回两组数据.....很酷(你的select语句甚至可以从同一个表中选择不同的数据,我猜也是如此)

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