介绍lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
我最近需要给用户创建一个feed,所有的数据都是放在sqlserver数据库里的,所以我疯狂的查找把sqlserver里的数据转换成xml的最快速的方法。现在我知道了xml已经成为了sqlserver2005的一部分。lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
之后我萌生出了一个主意,就是创建一个webservice用于数据库转xml的服务,这样用户就可以在任何时候调用他们需要的数据(如果需要也可以传参数)lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
现在,我知道你将会说“这不是什么新东西也没有什么难度”,但这正是我写本文的目的,看完本文之后你会发现原来实现这个功能是如此简单。我不敢相信在CodeProject居然没有一个人提出这样的解决方法。lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
代码lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
首先,在你的sqlserver2005数据库(要有相关的数据)中创建如下存储过程lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
CREATE PROCEDURE [dbo].[GetStories]lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
    @fromDate datetime,lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
    @toDate datetimelGsZ7j¾www.netcsharp.cnío`lÛÆ '°
AS lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
    BEGINlGsZ7j¾www.netcsharp.cnío`lÛÆ '°
lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
        select  dbo.Story.id,lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
                description,lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
                notes,lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
                text,lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
                publicationdate,lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
                authorsnames,lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
                keywordslGsZ7j¾www.netcsharp.cnío`lÛÆ '°
        from    dbo.StorylGsZ7j¾www.netcsharp.cnío`lÛÆ '°
                inner join dbo.Status on dbo.Story.StatusId = dbo.Status.idlGsZ7j¾www.netcsharp.cnío`lÛÆ '°
        where  publicationdate between @fromDate and @toDatelGsZ7j¾www.netcsharp.cnío`lÛÆ '°
                and dbo.Status.status = 'live'lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
        order by publicationDatelGsZ7j¾www.netcsharp.cnío`lÛÆ '°
        FOR    XML PATH('story'),lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
                    ROOT('stories')lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
    END
lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
其关键的步骤就是“FOR XML PATH(###), ROOT(###)”这部分。他告诉sqlserver返回的xml每一行都要有名为“story”的节点,并且xml文档的根节点名为“stories”lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
下一步新建一个webservice,增加一个新的WebMethod。在这个方法中连接数据库并获得数据。lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
现在,调用SqlCommand类的ExecuteXmlReader方法以返回xml,类似如下代码lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
XmlReader reader = command.Command.ExecuteXmlReader();lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
这个reader就是一个XmlDataDocument流,它可以从WebMethod返回。下面是我写的一段WebMethod,我用了一个数据库帮助类App_Data.SqlSPCommand来获取数据库中的值。lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
[WebMethod(Description = "Get stories based on a centre, and a from and to date",lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
CacheDuration = 600, MessageName = "GetStoriesForCentre")]lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
public XmlDataDocument GetStoriesForCentre(string centre, DateTime fromDate, DateTime toDate)lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
{lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
Database db = new Database("TarkStoriesConnectionString");lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
using (db.Connection)lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
{lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
  db.OpenConnection();lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
  App_Data.SqlSPCommand command = new App_Data.SqlSPCommand("GetStoriesForCentre", db.Connection);lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
  command.AddParameter("@centre", SqlDbType.VarChar, centre);lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
  command.AddParameter("@fromDate", SqlDbType.DateTime, fromDate);lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
  command.AddParameter("@toDate", SqlDbType.DateTime, toDate);lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
  XmlReader reader = command.Command.ExecuteXmlReader();lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
  XmlDataDocument xml = new XmlDataDocument();lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
  xml.Load(reader);lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
  return xml;lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
}lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
}
lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
就这些东西了lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
调用webservice就按我们通常做的方法就行,提供一些参数(本例中是两个日期类型)就可以返回xml,本例中返回的xml如下lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
<?xml version="1.0" encoding="utf-8" ?>lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
<stories>lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
    <story>lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
        <id>514</id>lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
        <description>some description</description> lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
        <notes>no notes available</notes> lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
        <text>blah blah blah</text> lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
        <publicationdate>2007-01-30T00:00:00</publicationdate> lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
        <authorsnames>Sue Williams</authorsnames>lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
        <keywords>boring story</keywords>lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
    </story>lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
</stories>
lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
就是如此简单,希望本文能对你有一些帮助lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
译者注:关于SQLXML的更多内容可以参看http://www.stylusstudio.com/sqlxml_tutorial.html lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
lGsZ7j¾www.netcsharp.cnío`lÛÆ '°
译者注:感谢本页第三位留言的兄弟,他指出了本文的一个失误,“存储过程是2个参数,而code包括了3个参数”,但是文中的方法是没问题的,我已测试通过。lGsZ7j¾www.netcsharp.cnío`lÛÆ '°