解决方案 2 打包
将记录集转换为形式良好的 XML 字符串的另一种方法是,使用 ADO 将记录集保存到作为目的地的一个 ADO Stream 对象中,并保持为 XML。
注: MSDN Magazine 就这一主题有一篇更为深入的文章,"使用 ADO 来创建基于 XML 的记录集",作者为 Don Box (
http://msdn.microsoft.com/library/default.ASP?URL=/library/periodic/period00/com0700.htm)(英文)。
按这种方式返回记录集的粘合代码稍微容易一点。我已在 ASP 接口文件中实现了以下函数:
Public Function GetXMLStreamFromADORS(ByVal objADORS)
Dim oStream 'As ADODB.Stream
Set oStream = Server.CreateObject("ADODB.Stream")
objADORS.Save oStream, adPersistXML
GetXMLStreamFromADORS = CDATAit(oStream.ReadText)
Set oStream = Nothing
End Function
我已在此 ASP 文件的开头定义了以下常数:
CONST adPersistADTG = 0
CONST adPersistXML = 1
只包括了这两个常数,因为它们是仅会用到的两个常数。如果您选择了 Microsoft Visual Studio? 6.0,则您也可以使用它附带的 adoVBs.inc 文件。
现在,应该通过修改函数 GetAllArtists() 的代码,使其实现新的帮助器函数 GetXMLStreamFromADORS,如下所示:
Public Function GetAllArtists()
Dim objGetAllArtists
Set objGetAllArtists = Server.CreateObject("RadioWeb.clsSongs")
GetAllArtists = GetXMLStreamFromADORS(objGetAllArtists.GetAllArtists())
'Insert additional code here
Set objGetAllArtists = NOTHING
End Function
之所以必须添加 CDATAit 函数,是因为必须将此 XML 字符串表示为一个字符串,以便通过 ROPE 正确地将其返回。我们也可以像在解决方案 1 中那样修改 SDL,但因为这种结构更难于解释和预测,所以它可能非常令人厌烦并容易出错。通过使用 CDATAit 函数,我们可以用数据类型 'string' 在 CDATA 区域返回该结构。此外,我们还可以在将来的记录集实现中使用这些函数,而且不必修改 SDL 文件。
该函数实际上通过 ADO Stream 对象为我们返回记录集的 XML 表示,如下所示:
我们随后将按字符串检索数据,就像在我们的 SDL 中定义的那样。请记住,我们的 SDL 是按如下方式来定义返回值的:
<ELEMENT name="GetAllArtistsResponse">
<ELEMENT type="dt:string" name="return" />
</ELEMENT>
因为我们的数据实际上包装在 CDATA 区域中,所以可以保证,当从 Stream 对象返回时,我们的数据是合法的 XML。
注: 这些示例中所使用的函数,如 GetXMLStreamFromADORS 和 GetXMLFromADORS,可以很容易地放入一个 include 文件中,实现类似 COM 对象(返回 ADO 记录集)的 ASP 接口文件都可包括该文件。在您的 Web Service 的整个生存期中,这种可重用性都将有助于今后的开发。