SQL SERVER2005提供了在.NET中自定义函数、存储过程、聚合、触发器以及类型的功能。于是,我们可以在数据库的函数、存储过程或类型整合.NET对象方法等。在之前的一篇文章,我们演示了如何将正则表达式功能整合到SQL CLR中。在本文中,还是演示这种整合,但是这次是从SQL CLR中调用一个Web Service。我们将使用AdventureWorks这个样例数据库,定义一个函数,根据http://www.webservicex.net/CurrencyConvertor.asmx这个Web Service提供的汇率,进行从欧元到美元的外汇转换。(这个WebService提供的汇率,只用于演示,不能作为真实金融交易的数据。)
本文没有详细的描述所有的细节,读者应该具有一定的在SQL SERVER2005下开发CLR的基础。
定义转换函数
首先,在Visual Studio 2005中,根据开发模板,选择新建一个C#或者VB.NET的SQL SERVER项目。(注意:在Beta版中,必须在安装VS2005之前安装SQL SERVER 2005)
*在一些非正式的VS2005的版本中,直接使用工具引用WebService生成的代理类不能在SQL SERVER CLR中使用。原因是这种代理类生成了不能使用在CLR中的同步方法。具体可参考Vineet Rao 在 blogs.msdn.com中的文章。解决的方法是利用C:/Program Files/Microsoft Visual Studio 8/SDK/v2.0/Bin目录下的WSDL.exe工具生成老式异步方法的代理类,只用这种类才能在CLR中以External ACCESS的权限加载。如果我们使用“新”的代理类,必须使用Unsafe的安全级别,这种方式应尽量避免。我们可以使用一个XML配置文件来生成需要规范的代理类。创建一个以下内容的XML文件:
<wsdlParameters xmlns ='http://microsoft.com/webReference/'> <language>c#</language> <protocol>Soap</protocol> <nologo>true</nologo> <sharetypes>false</sharetypes> <webReferenceOptions> <codeGenerationOptions>properties oldAsync</codeGenerationOptions> </webReferenceOptions> </wsdlParameters>
假设保存路径为:c:/oldwsdlconfig.xml(如果使用VB.net项目,则替换使用<language>vb</language>元素)。然后,使用以下命令行生成代理类:
C:/Program Files/Microsoft Visual Studio 8/SDK/v2.0/Bin/wsdl.exe /par:c:/ oldwsdlconfig.xml http://www.webservicex.net/CurrencyConvertor.asmx
运行结束后,将生成CurrencyConvertor.cs(或者.vb)文件。在VS中使用“添加现有项”定位到文件的位置后,将CurrencyConvertor.cs(或者.vb)文件增加到现有项目中。同时在项目中增加对System.Web.Services的引用:
下面,我们防止代码在使用WebService通信中使用序列化和反序列化的过程(创建专门进行序列化的程序集)。在VS