Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7307038
  • 博文数量: 444
  • 博客积分: 10593
  • 博客等级: 上将
  • 技术积分: 3852
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-09 15:26
文章分类

全部博文(444)

文章存档

2014年(1)

2013年(10)

2012年(18)

2011年(35)

2010年(125)

2009年(108)

2008年(52)

2007年(72)

2006年(23)

分类: 数据库开发技术

2010-07-17 17:42:44

第一步当然是做WebService了。。。这步属于废话,本来就要调用WebService,不做WS的话调用什么。怎么写WebService的教程一搜一大把,忽略之,不会的同学gg一下吧。。。这步的结果是我们得到一个WebService,其地址类似于,后面加上?WSDL就得到其wsdl描述了
这个WebService里有一个名为Service的服务,其中有一个方法叫GetDataURL,其定义为public string GetDataURL(),就是说是一个无参数的方法,返回一个字符串,下一步我们就要调用这个方法了
第二步,重点在此。。。先介绍3个系统存储过程sp_OACreate,sp_OAMethod,sp_OADestroy。
1〉sp_OACreate的作用是建立一个新的对象,类似于ASP里面的Server.CreateObject。接受两个参数,第一个是nvarchar的组件CLSID,第二个是int的返回参数,用来保存建立好的对象实例。准确讲应该是保存了句柄吧
2〉sp_OAMethod,这个存储过程用来执行一个对象里面的方法。参数列表中,第一个参数的int的对象句柄,就是我们刚才返回的那个。第二个参数是要调用的方法名。第三参数是必须用OUT修饰的返回参数,用来保存方法的返回值,返回什么类型就对应转换到SQL数据类型就OK了,这里因为返回string,所以用nvarchar(255)。从第四个参数开始接受方法的参数,有一个写一个就行了,如果WebService的方法定义中有out定义的参数,那么就把存储过程里对应位置的参数加上OUT修饰就可以了。
3〉sp_OADestroy没啥好说的了,销毁前面建立的对象,接受一个int型的参数,就是刚才建立的那个对象句柄。
另外,可以用sp_OAGetErrorInfo获取某一个对象的错误信息,只要把该对象的句柄传进去就行了。
概念介绍完了,直接上代码
CREATE PROCEDURE [dbo].[GetDataURL]
AS
DECLARE @object int
DECLARE @hr int
DECLARE @domain nvarchar(255)
EXEC @hr = sp_OACreate 'MSSOAP.SoapClient', @object OUT
EXEC @hr = sp_OAMethod @object, 'mssoapinit', null, '?WSDL', 'Service'
EXEC @hr = sp_OAMethod @object, 'GetDataURL', @domain OUT
IF @hr <> 0
BEGIN
   EXEC sp_OAGetErrorInfo @object  
   RETURN @object
END
ELSE
BEGIN
   RETURN @domain
END
EXEC @hr = sp_OADestroy @object
GO
大致解释一下,就是定义了一个int的@object,用来保存建立的SoapClient对象实例。在后面sp_OACreate 'MSSOAP.SoapClient', @object OUT里面创建了SoapClient的实例,并保存在@object里了。然后执行该对象的mssoapinit方法,初始化soap客户。该方法的声明是HRESULT mssoapinit([in] BSTR bstrWSDLFile,[in, optional, defaultvalue("")] BSTR bstrServiceName,[in, optional, defaultvalue("")] BSTR bstrPort,[in, optional, defaultvalue("")] BSTR bstrWSMLFile);这里偷了个懒,没有处理其返回值,所以执行存储过程的时候用null代替返回值位置。后面三个参数都是可选的,从变量名就能看出其作用,不多说了。再然后,调用GetDataURL方法,并把返回值放在nvarchar的@domain里面。
后面就很简单了,根据各个系统存储过程的执行结果,判断如果不等于0的话,就用sp_OAGetErrorInfo @object来获取@object的错误信息。
最后,调用sp_OADestroy @object清除@object对象。
第三步,定时的问题,再写一个存储过程,调用第二步的存储过程,并且做其他处理。然后在Job里面添加新任务,设定好执行这个存储过程就行了。
阅读(5705) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-09-06 21:19:22

你好:看了你这篇sql2000数据库存储过程调用webservice的文章后,我自己测试了,调用本机的webservice没得问题,但是当我调用一个internet的webservcie的时候 再执行 EXEC @hr = sp_OAMethod @object, 'mssoapinit', null, 'http://153.40.124.50:8080/smsg/SmsgHbPort?WSDL','SmsgHbService' 的时候就出问题了,@hr小于了0,出错,错误内容如下: WSDLReader:Analyzing the WSDL file failed HRESULT=0x80004005 - WSDLReader:Initialization of service failed HRESULT=0x80004005 - WSDLService:Initialization of the port for service SmsgHbService failed HRESULT=0x80004005 - WSDLPort:Analyzing the binding