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


    原文地址: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个参数”,但是文中的方法是没问题的,我已测试通过。
  • 相关阅读:
    Community Server 2.0 学习笔记:如何实现在线人数?
    CommunityServer2.0改造的一些心得[粗糙版]
    DotLucene源码浅读笔记(2) : Lucene.Net.Documents
    有意思.在线版的photoshop
    电子商务教程[资源]
    Lucene 1.9 多目录搜索的的一个bug
    小总结:DotLucene如何才能快速生成索引?
    DotLucene源码浅读笔记(1)补遗:编写简单中文分词器ChineseAnalyzer
    Windows下傻瓜式快速搭建Discuz论坛(也可以参考用于搭建其他php论坛)
    Lucene.net常见功能实现知识汇总
  • 原文地址:https://www.cnblogs.com/webabcd/p/679186.html
Copyright © 2020-2023  润新知