[翻译]通过WebService调用SQLXML(SQL Server 2005)


原文发布日期:2007.02.04
作者:Russ Quinn
翻译:webabcd


介绍
我最近需要给用户创建一个feed,所有的数据都是放在sqlserver数据库里的,所以我疯狂的查找把sqlserver里的数据转换成xml的最快速的方法。现在我知道了xml已经成为了sqlserver2005的一部分。

之后我萌生出了一个主意,就是创建一个webservice用于数据库转xml的服务,这样用户就可以在任何时候调用他们需要的数据(如果需要也可以传参数)

现在,我知道你将会说“这不是什么新东西也没有什么难度”,但这正是我写本文的目的,看完本文之后你会发现原来实现这个功能是如此简单。我不敢相信在CodeProject居然没有一个人提出这样的解决方法。


代码
首先,在你的sqlserver2005数据库(要有相关的数据)中创建如下存储过程
通过WebService调用SQLXML(SQL Server 2005) [ZT]CREATE PROCEDURE [dbo].[GetStories]
通过WebService调用SQLXML(SQL Server 2005) [ZT]    
@fromDate datetime,
通过WebService调用SQLXML(SQL Server 2005) [ZT]    
@toDate datetime
通过WebService调用SQLXML(SQL Server 2005) [ZT]
AS 
通过WebService调用SQLXML(SQL Server 2005) [ZT]    
BEGIN
通过WebService调用SQLXML(SQL Server 2005) [ZT] 
通过WebService调用SQLXML(SQL Server 2005) [ZT]        
select  dbo.Story.id,
通过WebService调用SQLXML(SQL Server 2005) [ZT]                description,
通过WebService调用SQLXML(SQL Server 2005) [ZT]                notes,
通过WebService调用SQLXML(SQL Server 2005) [ZT]                
text,
通过WebService调用SQLXML(SQL Server 2005) [ZT]                publicationdate,
通过WebService调用SQLXML(SQL Server 2005) [ZT]                authorsnames,
通过WebService调用SQLXML(SQL Server 2005) [ZT]                keywords
通过WebService调用SQLXML(SQL Server 2005) [ZT]        
from    dbo.Story
通过WebService调用SQLXML(SQL Server 2005) [ZT]                
inner join dbo.Status on dbo.Story.StatusId = dbo.Status.id
通过WebService调用SQLXML(SQL Server 2005) [ZT]        
where   publicationdate between @fromDate and @toDate
通过WebService调用SQLXML(SQL Server 2005) [ZT]                
and dbo.Status.status = 'live'
通过WebService调用SQLXML(SQL Server 2005) [ZT]        
order by publicationDate
通过WebService调用SQLXML(SQL Server 2005) [ZT]        
FOR     XML PATH('story'),
通过WebService调用SQLXML(SQL Server 2005) [ZT]                    ROOT(
'stories')
通过WebService调用SQLXML(SQL Server 2005) [ZT]    
END

其关键的步骤就是“FOR XML PATH(###), ROOT(###)”这部分。他告诉sqlserver返回的xml每一行都要有名为“story”的节点,并且xml文档的根节点名为“stories”

下一步新建一个webservice,增加一个新的WebMethod。在这个方法中连接数据库并获得数据。

现在,调用SqlCommand类的ExecuteXmlReader方法以返回xml,类似如下代码
通过WebService调用SQLXML(SQL Server 2005) [ZT]XmlReader reader = command.Command.ExecuteXmlReader();

这个reader就是一个XmlDataDocument流,它可以从WebMethod返回。下面是我写的一段WebMethod,我用了一个数据库帮助类App_Data.SqlSPCommand来获取数据库中的值。
通过WebService调用SQLXML(SQL Server 2005) [ZT][WebMethod(Description = "Get stories based on a centre, and a from and to date",
通过WebService调用SQLXML(SQL Server 2005) [ZT]CacheDuration 
= 600, MessageName = "GetStoriesForCentre")]
通过WebService调用SQLXML(SQL Server 2005) [ZT]
public XmlDataDocument GetStoriesForCentre(string centre, DateTime fromDate, DateTime toDate)

就这些东西了

调用webservice就按我们通常做的方法就行,提供一些参数(本例中是两个日期类型)就可以返回xml,本例中返回的xml如下
通过WebService调用SQLXML(SQL Server 2005) [ZT]<?xml version="1.0" encoding="utf-8" ?>
通过WebService调用SQLXML(SQL Server 2005) [ZT]
<stories>
通过WebService调用SQLXML(SQL Server 2005) [ZT]    
<story>
通过WebService调用SQLXML(SQL Server 2005) [ZT]        
<id>514</id>
通过WebService调用SQLXML(SQL Server 2005) [ZT]        
<description>some description</description> 
通过WebService调用SQLXML(SQL Server 2005) [ZT]        
<notes>no notes available</notes> 
通过WebService调用SQLXML(SQL Server 2005) [ZT]        
<text>blah blah blah</text> 
通过WebService调用SQLXML(SQL Server 2005) [ZT]        
<publicationdate>2007-01-30T00:00:00</publicationdate> 
通过WebService调用SQLXML(SQL Server 2005) [ZT]        
<authorsnames>Sue Williams</authorsnames>
通过WebService调用SQLXML(SQL Server 2005) [ZT]        
<keywords>boring story</keywords>
通过WebService调用SQLXML(SQL Server 2005) [ZT]    
</story>
通过WebService调用SQLXML(SQL Server 2005) [ZT]
</stories>

就是如此简单,希望本文能对你有一些帮助


译者注:关于SQLXML的更多内容可以参看http://www.stylusstudio.com/sqlxml_tutorial.html

相关文章: