• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: | 推荐给好友 上一篇 | 下一篇

使用SQLServer将现有代码作为Web服务提供

发布: 2007-6-21 12:06 | 作者:   | 来源:   | 查看: 19次 | 进入软件测试论坛讨论

领测软件测试网

   
  一、简介
  Microsoft SQL Server 2000的 XML功能可以简化将现有代码作为 Web服务提供的任务。本文集中讨论了传入和传出 Transact SQL代码的数据与 XML消息(在 Web服务客户机和服务器之间使用)之间的转换。
  

  二、SQL Server 2000中的现有代码
  SQL Server 2000的 XML功能简化了将现有 Transact SQL代码作为 Web服务提供的过程。这依赖于 SQL Server 2000中的两项 XML功能:
  
  1.对 Transact SQL的扩展可将关系型数据转换为 XML,并且可以对传入的 XML进行语法分析。利用 ISAPI模板功能,可将传入的 HTTP请求应用于 Transact SQL代码,并且可以使用 XSL样式表对传出的 XML进行转换。只要可以使用 FOR XML子句“选定”数据,SQL Server就可以将 XML返回到 XML模板。
  
  2.SQL Server 2000 XML模板
  
  SQL Server 2000 XML模板以透明方式执行以下任务:
  
  对传入的 HTTP请求进行解码将参数应用于 Transact SQL查询执行查询使用 XSL转换传出的 XML读数据以下示例执行 ISAPI模板中指定的 Transact SQL。如果必要,可将 HTTP请求传递到 Transact SQL代码,并由该代码进行语法分析。根据模板中指定的 .xsl文件,返回的 XML将被转换为 SOAP并返回给 Web服务的客户:
  
  Exec GetOrdersXML
  
  以下是模板中引用的 XSL样式表,它将存储过程中的 XML转换为 SOAP:
  
  xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
  xmlns:m="Some-URI">
  
  最后,以下存储过程代码在 Transact SQL SELECT语句中使用 FOR XML EXPLICIT子句来返回 XML。“订单”和“订单详细信息”从单独的表中选择,然后合并到 XML层次中:
  
  /*订单是父 XML元素 */
  
  Select 1 as Tag, NULL as Parent,
  Orders.OrderId AS [Order!1!OrderId],
  Orders.OrderStatus AS [Order!1!OrderStatus],
  Orders.OrderDate AS [Order!1!OrderDate],
  Orders.SubTotal AS [Order!1!SubTotal],
  Orders.Tax AS [Order!1!Tax],
  Orders.ShippingHandling AS [Order!1!ShippingHandling],
  Orders.ShipToName AS [Order!1!ShipToName],
  Orders.ShipToAddressId AS [Order!1!ShipToAddressId],
  NULL AS [OrderDetail!2!OrderDetailId],
  NULL AS [OrderDetail!2!OrderId],
  NULL AS [OrderDetail!2!ItemId],
  NULL AS [OrderDetail!2!UnitPrice],
  NULL AS [OrderDetail!2!Quantity]
  from Orders
  UNION ALL
  
  /*订单详细信息是子 XML元素 */
  
  select 2 as tag, 1 as parent,
  Orders.OrderId AS [Order!1!OrderId],
  NULL AS [Order!1!OrderStatus],
  NULL AS [Order!1!OrderDate],
  NULL AS [Order!1!SubTotal],
  NULL AS [Order!1!Tax],
  NULL AS [Order!1!ShippingHandling],
  NULL AS [Order!1!ShipToName],
  NULL AS [Order!1!ShipToAddressId],
  OrderDetails.OrderDetailId AS [OrderDetail!2!OrderDetailId],
  OrderDetails.OrderId AS [OrderDetail!2!OrderId],
  OrderDetails.ItemId AS [OrderDetail!2!ItemId],
  OrderDetails.UnitPrice AS [OrderDetail!2!UnitPrice],
  OrderDetails.Quantity AS [OrderDetail!2!Quantity]
  from Orders, OrderDetails
  where Orders.OrderId = OrderDetails.OrderId
  ORDER BY [Order!1!OrderId],[OrderDetail!2!OrderDetailId]
  For XML EXPLICIT 写数据。
  
  以下示例中,通过 HTTP请求提供表示层次行数据的 XML,然后将其传递到 ISAPI模板中指定的 Transact SQL代码。在存储过程中对 XML进行语法分析,并进行相应的写入操作:
  
  Create Procedure InsertOrder
  @Order NVARCHAR(4000) = NULL,
  @OrderId int Output
  DECLARE @hDoc INT
  DECLARE @PKId INT
  BEGIN TRANSACTION
  /*将 XML载入文档以进行分析 */
  
  EXEC sp_xml_preparedocument @hDoc OUTPUT, @Order
  
  /*插入订单标头 */
  
  INSERT Orders(CustomerId,
  OrderDate,
  ShipToName,
  ShipToAddressId,
  OrderStatus)
  SELECT *
  FROM OPENXML(@hDoc, '/NewDataSet/Orders')
  WITH ( CustomerId int 'CustomerId',
  OrderDate Datetime 'OrderDate',
  ShipToName nvarchar(40) 'ShipToName',
  ShipToAddressId int 'ShipToAddressId',
  OrderStatus int 'OrderStatus')
  SELECT @PKId = @@IDENTITY
  
  /*插入订单详细信息 */
  
  INSERT OrderDetails (OrderId,
  ItemId,
  UnitPrice,
  Quantity)
  SELECT @PKId as OrderId, ItemId, UnitPrice, Quantity
  FROM OPENXML(@hDoc, '/NewDataSet/Details')
  WITH ( ItemId int 'ItemId',
  UnitPrice money 'UnitPrice',
  Quantity int 'Quantity')
  
  /*指定输出参数的值 */
  
  Select @OrderId = @PKId
  COMMIT TRANSACTION
  
  /*清除 XML文档 */
  
  EXEC sp_xml_removedocument @hD

文章来源于领测软件测试网 https://www.ltesting.net/


关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备10010545号-5
技术支持和业务联系:info@testage.com.cn 电话:010-51297073

软件测试 | 领测国际ISTQBISTQB官网TMMiTMMi认证国际软件测试工程师认证领测软件测试网