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

时间:2014-06-09 16:51:23

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

我是Visual Studio和桌面开发的新手。话虽这么说,我正在编写一个自动化手动过程的程序,该过程的一部分是从我们的SQL Server中提取一些数据并将其推送到Web API。我能够获取数据,甚至可以将其转换为XML以将其发送到API,遗憾的是生成的XML格式不正确,我无法弄清楚如何设置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。

我在这里搜索了最近几天,并且已经为这个项目的其他方面找到了很多帮助,但似乎无法找出我试图做的事情是否可能就像我一样我试图这样做。如果有更好的方法来解决这个问题,请务必指出我的方向。我都在学习处理事情的新方法。

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

1 个答案:

答案 0 :(得分:0)

我拼凑了一些产生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内部使用....

SELECT * FROM Table1

SELECT * FROM Table2

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

ds.Load(读者,LoadOption.Upsert,“Table1”,“Table2”)

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

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