在SQLserver2005中调用webservice
?介绍
??? 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:/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中选择解决方案资源管理器,右键选择属性。C#和VB.NET的设置方法稍有不同: C#: ? ? ??? 选择“生成”标签,在底部选择“生成序列化程序集”为“开”。 同时,在项目属性窗口中,我们设置权限等级:在数据库标签中,设置“权限级别”为“外部”。这样,我们声明这个程序集是“Safe”的,不会作出危害性的过程,外部调用等。但是,它仍然不如声明为“Safe”的程序集安全,因为它进行了网络通信,访问硬盘设备等行为。
? ? 最后,可以进行主程序开发工作了:编写货币转化函数。这个函数输入sql money类型的参数,乘上欧元对美元的汇率,返回一个sql money类型的数据。编写的方法:在解决方案资源管理器中的项目上,右键选择新增用户自定义函数。并编写如下代码: C#
|
- sqlserver 2012 账户强制过时修改
- SQL Server&quot;错误 21002: [SQL-DMO]用户 * 已经存在
- 如何使用构造函数在选择子句中为多个表的选定列编写HQL JOI
- 数据库 – Oracle SQLDeveloper表名称自动完成设置
- sql-server – SQL Server:启用没有SSMS的远程连接
- 数据库 – 将`tsv`文件插入postgresql数据库
- sqlserver、mysql、oracle各自的默认端口号
- 非常不错的SQL语句学习手册实例版
- SQLserver 如何把一个库里的表转移到另一个库里
- SQLServer如何在特定时间范围内按时间段查询