webabcd - 专注于asp.net, html5, silverlight

ASP.NET
从现在开始 一切都不晚
posts - 287, comments - 7866, trackbacks - 594, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理
原文地址:http://www.codeproject.com/KB/webservices/SQLToXMLWebService.aspx


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


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


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

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

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


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

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

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

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

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

  XmlReader reader 
= command.Command.ExecuteXmlReader();
 
  XmlDataDocument xml 
= new XmlDataDocument();
  xml.Load(reader);

  
return xml;
 }

}


就这些东西了

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

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


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


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

Feedback

#1楼  回复 引用   

2007-03-19 08:49 by ivw[未注册用户]
支持。
这几天感冒了没怎么上线,呵呵
想问问你SQL2000跟SQL2005在程序里的连接方法是不是一样的啊?我这里的机器配置不怎么样,没机会装上SQL2005去试过。

#2楼[楼主]  回复 引用 查看   

2007-03-19 09:07 by webabcd      
@ivw
是一样地

#3楼  回复 引用 查看   

2007-03-19 09:57 by Samuel@Singapore      
很明显的错误是,存储过程是2个参数,而code包括了3个参数,呵呵!!

#4楼[楼主]  回复 引用 查看   

2007-03-19 10:15 by webabcd      
@Samuel@Singapore
兄弟真是细心啊,估计是作者粘作代码了,因为存储过程的名称都不一样

不过方法是ok的,我测试通过了

#5楼  回复 引用 查看   

2007-03-19 12:40 by Artech      
SQLXML确实是一项很有意思的技术,它提供给我们给我们操作数据库的另一种思路,使用XML来代替SQL。通过使用SQLXML,可以使我们对数据的结构有一种全新的认识。
SQLXML 4.0 较之以前的3.0,有了较到的改进,已经成为了一种较为成熟的技术。

#6楼[楼主]  回复 引用 查看   

2007-03-19 15:33 by webabcd      
@Artech
还没有机会用sqlserver2005做项目
现在正在知识储备中

希望能快点用到

#7楼  回复 引用 查看   

2007-07-09 10:55 by seyon      
TO webabcd:
sql2000和2005是否能共存在一台服务器中,2005是否向下兼容2000的所有东西?

#8楼[楼主]  回复 引用 查看   

2007-07-09 11:26 by webabcd      
@seyon
可以,设置为不同的实例即可

是向下兼容的(这点应该对微软放心)

#9楼  回复 引用 查看   

2010-12-15 12:45 by 明年今天      
其实连WEB服务都可以省掉,就用MSSQL公开EndPoint就可以了

#10楼[楼主]  回复 引用 查看   

2010-12-15 17:52 by webabcd      
@明年今天
:)
呵呵,没用过MSSQL的EndPoint
发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 679186 j5lIp0UeAKY=