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

原文地址: http://www.codeproject.com/useritems/SQLToXMLWebService.asp


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


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


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

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

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


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

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

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

现在,调用SqlCommand类的ExecuteXmlReader方法以返回xml,类似如下代码
None.gif XmlReader reader  =  command.Command.ExecuteXmlReader();

这个reader就是一个XmlDataDocument流,它可以从WebMethod返回。下面是我写的一段WebMethod,我用了一个数据库帮助类App_Data.SqlSPCommand来获取数据库中的值。
None.gif [WebMethod(Description  =   " Get stories based on a centre, and a from and to date " ,
None.gifCacheDuration 
=   600 , MessageName  =   " GetStoriesForCentre " )]
None.gif
public  XmlDataDocument GetStoriesForCentre( string  centre, DateTime fromDate, DateTime toDate)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif Database db 
= new Database("TarkStoriesConnectionString");
InBlock.gif 
InBlock.gif 
using (db.Connection)
ExpandedSubBlockStart.gifContractedSubBlock.gif 
dot.gif{
InBlock.gif  db.OpenConnection();
InBlock.gif 
InBlock.gif  App_Data.SqlSPCommand command 
= new App_Data.SqlSPCommand("GetStoriesForCentre", db.Connection);
InBlock.gif  command.AddParameter(
"@centre", SqlDbType.VarChar, centre);
InBlock.gif  command.AddParameter(
"@fromDate", SqlDbType.DateTime, fromDate);
InBlock.gif  command.AddParameter(
"@toDate", SqlDbType.DateTime, toDate);
InBlock.gif
InBlock.gif  XmlReader reader 
= command.Command.ExecuteXmlReader();
InBlock.gif 
InBlock.gif  XmlDataDocument xml 
= new XmlDataDocument();
InBlock.gif  xml.Load(reader);
InBlock.gif
InBlock.gif  
return xml;
ExpandedSubBlockEnd.gif }

ExpandedBlockEnd.gif}

None.gif

就这些东西了

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

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


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


译者注:感谢本页第三位留言的兄弟,他指出了本文的一个失误,“存储过程是2个参数,而code包括了3个参数”,但是文中的方法是没问题的,我已测试通过。 679186.html

webabcd 2007-03-18 22:18 发表评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值