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

来源:互联网 发布:发牌程序java 编辑:程序博客网 时间:2024/06/05 23:54
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
一、简介

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

二、SQLServer2000中的现有代码

  SQLServer2000的XML功能简化了将现有TransactSQL代码作为Web服务提供的过程。这依赖于SQLServer2000中的两项XML功能:

  1.对TransactSQL的扩展可将关系型数据转换为XML,并且可以对传入的XML进行语法分析。利用ISAPI模板功能,可将传入的HTTP请求应用于TransactSQL代码,并且可以使用XSL样式表对传出的XML进行转换。只要可以使用FOR XML子句“选定”数据,SQLServer就可以将XML返回到XML模板。

  2.SQLServer2000XML模板

  SQLServer2000XML模板以透明方式执行以下任务:

  对传入的HTTP请求进行解码将参数应用于TransactSQL查询执行查询使用XSL转换传出的XML读数据以下示例执行ISAPI模板中指定的TransactSQL。如果必要,可将HTTP请求传递到TransactSQL代码,并由该代码进行语法分析。根据模板中指定的.xsl文件,返回的XML将被转换为并返回给Web服务的客户:

WebService3Example1.xsl">


ExecGetOrdersXML


以下是模板中引用的XSL样式表,它将存储过程中的XML转换为SOAP:

xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:m="Some-URI">



WebService3Example1Response>

WebService3Example1Response>



  最后,以下存储过程代码在TransactSQLSELECT语句中使用FORXMLEXPLICIT子句来返回XML。“订单”和“订单详细信息”从单独的表中选择,然后合并到XML层次中:

/*订单是父XML元素*/

Select1asTag,NULLasParent,
Orders.OrderIdAS[Order!1!OrderId],
Orders.OrderStatusAS[Order!1!OrderStatus],
Orders.OrderDateAS[Order!1!OrderDate],
Orders.SubTotalAS[Order!1!SubTotal],
Orders.TaxAS[Order!1!Tax],
Orders.ShippingHandlingAS[Order!1!ShippingHandling],
Orders.ShipToNameAS[Order!1!ShipToName],
Orders.ShipToAddressIdAS[Order!1!ShipToAddressId],
NULLAS[OrderDetail!2!OrderDetailId],
NULLAS[OrderDetail!2!OrderId],
NULLAS[OrderDetail!2!ItemId],
NULLAS[OrderDetail!2!UnitPrice],
NULLAS[OrderDetail!2!Quantity]
fromOrders
UNIONALL

/*订单详细信息是子XML元素*/

select2astag,1asparent,
Orders.OrderIdAS[Order!1!OrderId],
NULLAS[Order!1!OrderStatus],
NULLAS[Order!1!OrderDate],
NULLAS[Order!1!SubTotal],
NULLAS[Order!1!Tax],
NULLAS[Order!1!ShippingHandling],
NULLAS[Order!1!ShipToName],
NULLAS[Order!1!ShipToAddressId],
OrderDetails.OrderDetailIdAS[OrderDetail!2!OrderDetailId],
OrderDetails.OrderIdAS[OrderDetail!2!OrderId],
OrderDetails.ItemIdAS[OrderDetail!2!ItemId],
OrderDetails.UnitPriceAS[OrderDetail!2!UnitPrice],
OrderDetails.QuantityAS[OrderDetail!2!Quantity]
fromOrders,OrderDetails
whereOrders.OrderId=OrderDetails.OrderId
ORDERBY[Order!1!OrderId],[OrderDetail!2!OrderDetailId]
ForXMLEXPLICIT 写数据。

  以下示例中,通过HTTP请求提供表示层次行数据的XML,然后将其传递到ISAPI模板中指定的TransactSQL代码。在存储过程中对XML进行语法分析,并进行相应的写入操作:

CreateProcedureInsertOrder
@OrderNVARCHAR(4000)=NULL,
@OrderIdintOutput
DECLARE@hDocINT
DECLARE@PKIdINT
BEGINTRANSACTION

/*将XML载入文档以进行分析*/

/*插入订单标头*/

INSERTOrders(CustomerId,
OrderDate,
ShipToName,
ShipToAddressId,
OrderStatus)
SELECT*
FROMOPENXML(@hDoc,'/NewDataSet/Orders')
WITH(CustomerIdint'CustomerId',
OrderDateDatetime'OrderDate',
ShipToNamenvarchar(40)'ShipToName',
ShipToAddressIdint'ShipToAddressId',
OrderStatusint'OrderStatus')
SELECT@PKId=@@IDENTITY

/*插入订单详细信息*/

INSERTOrderDetails(OrderId,
ItemId,
UnitPrice,
Quantity)
SELECT@PKIdasOrderId,ItemId,UnitPrice,Quantity
FROMOPENXML(@hDoc,'/NewDataSet/Details')
WITH(ItemIdint'ItemId',
UnitPricemoney'UnitPrice',
Quantityint'Quantity')

/*指定输出参数的值*/

Select@OrderId=@PKId
COMMITTRANSACTION

/*清除XML文档*/

<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
原创粉丝点击